私はそれらの間に依存関係のあるタスクのリストを持っています.JGraphTを使用してタスクの順序を管理する方法を検討していました。グラフを有向グラフとして設定し、処理したときに頂点を削除します(またはマスクする必要がありますか?)。一度に1つのタスクしか実行しない場合は、TopologicalOrderIterator
を使用できますが、タスクを並列化したいと考えています。 TopologicalOrderIterator
を取得し、Graphs.vertexHasPredecessors
をチェックすると、一度に実行したいと思うほど多くのものを見つけることができますが、理想的にはGraphs.getVerticesWithNoPredecessors
のようになります。 Netflixは葉の頂点を取得するユーティリティを提供しているので、グラフを逆にして使用することができますが、それはおそらくそれほど価値がありません。誰かが私をより良い方法に向けることができますか?ありがとう!JGraphTを使用した従属タスクの順序の管理
答えて
トポロジカルな順序は、必要なものである必要はありません。なぜそうではないのかの例があります。タスクの位相配置は、[1,2,3,4]
、円弧は(1,3)
、(2,3)
です。つまり、タスク1
は、タスク3
の前に完了する必要があります。2
と4
と同様です。また、タスク1
が完了するのに本当に時間がかかるとしましょう。したがって、処理1
と2
を並行して処理することができますが、が完了する前に3
を開始することはできません。タスク2
が完了しても、タスク3
が注文の次のタスクであり、このタスクが1
によってブロックされているため、タスク4
を開始できません。
あなたができることは次のとおりです。タスクごとに満たされていない依存関係の数を追跡する配列dep[]
を作成します。したがって、dep[i]==0
は、タスクi
のすべての依存関係が満たされていることを意味します。つまり、タスクi
を実行できることを意味します。 dep[i]>0
の場合、まだタスクi
を実行することはできません。タスクi
の前に実行する必要があるタスクj
があるとします。タスクj
を完了するとすぐに、タスクi
の満たされていない依存関係の数、つまりdep[i]=dep[i]-1
を減らすことができます。繰り返しますが、dep[i]==0
の場合は、タスクi
を処理する準備が整いました。 だから要するに、擬似コードにおけるアルゴリズムは次のようになります。
dep[]
配列を初期化します。dep[i]==0
- と並行して、すべてのタスク
i
で - スタート処理タスク
i
完了した場合、i
に依存するすべてのタスクj
ためdep[j]
をデクリメント。j
のタスクがdep[j]==0
の場合、処理を開始します。
ダイレクトグラフを使用して依存関係をモデル化できます。タスクを完了するたびに、発信近隣(jgraphtではsuccessorsOf(vertex)関数を使用)を反復するだけです。 DAGは、実行可能性を確認するためにも簡単に使用できます。グラフにサイクルが含まれている場合、依存関係に問題があります。しかし、この重い機械を必要としない場合は、2次元配列を作成するだけで、各タスクに対してi
i
に依存するタスクを格納することができます。
結果のアルゴリズムはO(n + m)時間で実行されます.nはタスクの数、mはアークの数(依存関係)です。これは非常に効率的です。
- 1. 混合管理/非管理アセンブリのロード順序
- 2. 従属ドッカーサービスを管理する方法
- 3. 最適なタスクの順序
- 4. 属性ルーティングを使用したWeb APIのバージョン管理
- 5. djangoの管理者を従属セレクトフィールドにカスタマイズする
- 6. Android Robotium - テストケースの実行順序を管理する方法は?
- 7. プラグインの順序と依存性を管理する
- 8. アンドロイドのJobSchedulerを使用して特定の順序でタスクを完了
- 9. 処理順序
- 10. タスク管理デーモン
- 11. ログインの順序の論理
- 12. jqueryを使用してソートすると、データベース内のリストの順序を管理できますか?
- 13. XSLTを使用してXML属性の順序を設定しますか?
- 14. JSoupを使用して、正しい順序でテキストと属性のhtmlを処理する方法
- 15. マルチスレッドインクリメントの理解順序
- 16. キャメルスプリッター処理の順序
- 17. コンテナ管理環境でSpringを使用した非同期タスクの実行
- 18. SaltStackを使用したIPtablesの管理
- 19. 気流パラメータを従属タスクに渡す
- 20. Gulpが間違った順序でタスクを報告します
- 21. 配管での動作順序
- 22. TFS管理者タスクのログ
- 23. .NETでのタスク管理
- 24. djangoタスク管理システム
- 25. ジャクソンのObjectMapperを使用したJSONオブジェクトの順序
- 26. ユニバースを使用したCSVファイルのコメントセクションの順序変更
- 27. ArrayListのArrayListを使用したスパイラル順序行列の作成
- 28. アセットパイプラインを使用したGmaps4Railsのレール3.2でのロード順序
- 29. マルチスレッドを使用した非同期操作のタスクの順序を維持する方法
- 30. JAXBコンパイラと属性の順序
ありがとうございました!これはうまくいくと思われ、演奏されるでしょう。私の場合は、