Ich gehe davon aus, dass eine Kante bedeutet, dass u ausgeführt werden muss, bevor v . Ist dies nicht der Fall, drehen Sie alle Kanten um. Ich gehe außerdem davon aus, dass Sie weniger an Pfaden interessiert sind (diese sind bereits von der DAG vorgegeben) als an einer guten Ausführungsstrategie aufgrund der Abhängigkeiten.( u , v )uv
Sie können die topologische Sortierprozedur einfach anpassen: Anstatt anzuhängen, fügen Sie alle Elemente mit derselben "Tiefe" zu einem Satz zusammen. Sie erhalten eine Liste von Sets, von denen jedes Elemente enthält, die Sie parallel ausführen / installieren können. Formal sind die Mengen für den Graphen G = ( V , E ) wie folgt definiert :SichG = ( V, E)
S0Si + 1= { v ∈ V∣ ∣ u ∈ V. ( u , v ) ∉ E}={ v ∈ V∣ ∣ u ∈ V. ( u , v ) ∈ E→ u ∈ ⋃k = 0ichSk}
k
for i=0 to k
parallel foreach T in S_k
execute T
S0
parallel foreach T in S_0
recursive_execute T
wo
recursive_execute T {
atomic { if T.count++ < T.indeg then return }
execute T
parallel foreach T' in T.succ
recursive_execute T'
}
und T.count
ist ein einfacher Zähler, der die Anzahl der T
bereits ausgeführten Vorgänger , T.indeg
die Anzahl der Vorgänger und T.succ
die Menge der Nachfolger enthält.