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.countist ein einfacher Zähler, der die Anzahl der Tbereits ausgeführten Vorgänger , T.indegdie Anzahl der Vorgänger und T.succdie Menge der Nachfolger enthält.