würde Ich mag die Menge aller gerichteten Graphen zu schaffen, mit n Vertices, wo jeder Knoten k direkten Nachfolger und k direkten Vorgänger hat. n und k wird nicht so groß sein, eher rund n = 8 und k = 3. Das Set enthält zyklische und azyklische Graphen. Jeder Graph wird wiederum als Vorlage für die Stichprobenauswahl einer großen Anzahl von gewichteten Graphen dienen.Aufzählen Graphen unter Kante und Symmetrie Constraints
Mein Interesse ist in der Rolle von Topologiemotiven, so will ich keine Gewichte für irgendwelche zwei Graphen, die symmetrisch zueinander sind, wo Symmetrie bedeutet, dass keine Permutation von Scheitelpunkten existiert in einem Graph, der es transformiert in den anderen.
A naive Lösung wäre, die 2^(n * ( n - 1)) zu betrachten Adjazenzmatrizen und alle diejenigen zu beseitigen (die meisten von ihnen), für die direkten Nachfolger oder Vorgänger Beschränkungen verletzt werden. Für n = 8, das sind immer noch ein paar Bits genug, um jede Matrix bequem innerhalb einer uint64_t
darzustellen und einfach aufzuzählen.
Das Verfolgen der Zeilenanzahl und Spaltenanzahl wäre eine weitere Verbesserung, aber der eigentliche Engpass ist das Hinzufügen des Graphen zur Ergebnismenge. An diesem Punkt müssen wir die Symmetrie für jeden anderen Graphen testen. Für n = 8 wären das schon mehr als 40.000 Permutationen pro Einfügeoperation.
Könnte jemand mich auf einen Algorithmus verweisen, den ich lesen konnte, der alles auf eine klügere Weise tun kann? Gibt es eine Graphenbibliothek für C, C++, Java oder Python, die bereits einen solch umfassenden Graphengenerator implementiert? Gibt es ein Repository, in dem bereits alle Graphiken für vernünftige n und k "tabelliert" wurden?
Das klingt nach etwas, das in "Die Kunst der Computerprogrammierung, Band 4" sein könnte. – templatetypedef