Parallele Elemente in Abhängigkeitsauflösung abrufen

13

Ich habe eine topologische Sortierung basierend auf dem Wikipedia-Artikel implementiert, den ich für die Abhängigkeitsauflösung verwende, aber es wird eine lineare Liste zurückgegeben. Welche Art von Algorithmus kann ich verwenden, um die unabhängigen Pfade zu finden?

Masse
quelle
1
Eine Möglichkeit, dies zu lösen, besteht darin, die Knoten im Diagramm als Akteure zu modellieren und die Reihenfolge durch eine Akteursbibliothek zu regeln.
Svick

Antworten:

16

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)

S0={vVuV.(u,v)E}Sich+1={vVuV.(u,v)Euk=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.

Raphael
quelle