依存関係の解決で並列アイテムを取得する


13

依存関係の解決に使用しているウィキペディアの記事に基づいてトポロジカルソートを実装しましたが、線形リストを返します。独立したパスを見つけるためにどのようなアルゴリズムを使用できますか?


1
これを解決する1つの方法は、グラフ内のノードをアクターとしてモデル化し、アクターライブラリに順序付けを任せることです。
— svick

回答:


16

Iは、エッジと仮定するを意味uは前に実行されなければならないVを。そうでない場合は、すべてのエッジを回してください。さらに、依存関係が与えられた適切な実行戦略よりも、パス(DAGによって既に与えられているもの)にあまり興味がないと仮定します。(あなたは、v)あなたはv

トポロジカルソート手順を簡単に適用できます。追加する代わりに、同じ「深さ」のすべてのアイテムを1つのセットにマージします。セットのリストを取得します。各セットには、並行して実行/インストールできるアイテムが含まれています。形式的に、セットはグラフG = (V 、E )に対して定義されます:S私G=(V、E)

S0={v∈V∣∀あなたは∈V。(あなたは、v)∉E}S私+1={v∈V∣∀あなたは∈V。(あなたは、v)∈E→あなたは∈⋃k=0私Sk}

その後、次のようにタスクを実行できます(セットがあると仮定しましょう):k

for i=0 to k
  parallel foreach T in S_k
    execute T

S0

parallel foreach T in S_0
  recursive_execute T

どこ

recursive_execute T {
  atomic { if T.count++ < T.indeg then return }
  execute T
  parallel foreach T' in T.succ
    recursive_execute T'
}

そしてT.count、Tすでに実行された先行の数、先行のT.indeg数、および後続T.succのセットを保持する単純なカウンターです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.