Ich habe eine DAG von Abhängigkeiten, die viele redundante Kanten enthält (siehe Beispiel unten). Ich möchte einen "schnellen" Algorithmus (dh kann ein Diagramm mit mehreren tausend Knoten / Kanten verarbeiten), der ein minimales Subdiagramm findet.
Zum Beispiel:
A -> B -> C
A -> C
in Worten A ist Voraussetzung für B und B ist Voraussetzung für C und auch A ist Voraussetzung für C. In diesem Fall ist A -> C redundant (da B bereits erforderlich ist, um C zu erreichen, und A erforderlich ist, um B zu erreichen) .
Es ist schon eine Weile her, seit ich Algorithmen studiert habe, und ich bin mir nicht sicher, wo ich anfangen soll.
Übrigens ist es nicht kritisch, dass der Algorithmus das globale Minimum findet, das lokale Minimum ist in Ordnung (die Kantenreduzierung ist nur eine Laufzeitoptimierung für die nächste Verarbeitungsstufe).
Mir ist auch klar, dass dies eine CS-Qualitätssicherung ist und keine Programmierung, aber mein Programm ist in Python geschrieben. Daher würde ich mich besonders freuen, wenn ich ein Python-Modul oder Open Source für diese Reduzierung kennenlernen würde, falls Sie davon wissen.
Danke im Voraus!
Antworten:
Die transitive Reduktion eines gerichteten Graphen AV Aho, MR Garey und JD Ullman
Laut Wikipedia wird dieser Algorithmus verwendet, mit dem
tred
das im GraphViz-Paket verfügbare Tool zur transitiven Reduktion verfügbar ist. Sie können es in Ihrem Diagramm ausführen und ein reduziertes Diagramm erhalten.Diese Frage ist ein Duplikat dieser Stackoverflow-Frage .
Code hier
graphviz/tools/src/tred.c
tut DFS Verwendung. ;-);quelle
tred
, danke.Am Ende habe ich es so gelöst:
Meine Datenstruktur besteht aus einem
dependends
Wörterbuch, von einer Knoten-ID bis zu einer Liste von Knoten, die davon abhängen (dh ihren Followern in der DAG).Ich habe die genaue Komplexität nicht berechnet, aber es hat meine Grafik von mehreren Tausend in Sekundenbruchteilen verschluckt.
quelle