Ich möchte alle ungerichteten Graphen der Größe auflisten , benötige aber nur eine Instanz jeder Isomorphismusklasse . Mit anderen Worten, ich möchte alle nicht-isomorphen (ungerichteten) Graphen auf Eckpunkten aufzählen . Wie kann ich das machen?
Genauer gesagt, ich möchte einen Algorithmus, der eine Folge ungerichteter Graphen mit der folgenden Eigenschaft erzeugt: Für jeden ungerichteten Graphen an Eckpunkten existiert ein Index so dass isomorph zu . Ich möchte, dass der Algorithmus so effizient wie möglich ist. Mit anderen Worten, die Metrik, die mir wichtig ist, ist die Laufzeit, die zum Generieren und Durchlaufen dieser Liste von Diagrammen benötigt wird. Ein sekundäres Ziel ist, dass es schön wäre, wenn der Algorithmus nicht zu komplex zu implementieren wäre. G n i G G i
Beachten Sie, dass ich mindestens einen Graphen aus jeder Isomorphismusklasse haben muss, aber es ist in Ordnung, wenn der Algorithmus mehr als eine Instanz erzeugt. Insbesondere ist es in Ordnung, wenn die Ausgabesequenz zwei isomorphe Graphen enthält, wenn dies das Auffinden eines solchen Algorithmus erleichtert oder effizientere Algorithmen ermöglicht, sofern alle möglichen Graphen abgedeckt sind.
Meine Anwendung lautet wie folgt: Ich habe ein Programm, das ich auf allen Diagrammen der Größe testen möchte . Ich weiß, dass wenn zwei Graphen isomorph sind, sich mein Programm für beide gleich verhält (entweder für beide richtig oder für beide falsch). Es reicht also aus, mindestens einen Vertreter aus jeder Isomorphismusklasse aufzulisten und dann die zu testen Programm auf diesen Eingängen. In meiner Anwendung ist ziemlich klein.n
Einige mögliche Algorithmen, die ich in Betracht gezogen habe:
Ich könnte alle möglichen Adjazenzmatrizen aufzählen, dh alle symmetrischen 0-or-1-Matrizen, die alle Nullen auf den Diagonalen haben. Dies erfordert jedoch die Aufzählung von Matrizen. Viele dieser Matrizen stellen isomorphe Graphen dar, so dass dies anscheinend eine Menge Aufwand bedeutet.2 n ( n - 1 ) / 2
Ich könnte alle möglichen Adjazenzmatrizen auflisten und für jede testen, ob sie zu einem der zuvor ausgegebenen Graphen isomorph ist. Wenn es zu keiner vorherigen Ausgabe isomorph ist, geben Sie es aus. Dies würde die Ausgabeliste erheblich verkürzen, erfordert jedoch immer noch mindestens Berechnungsschritte (auch wenn wir davon ausgehen, dass die Prüfung der Graphisomorphie superschnell ist) meine Metrik.
Es ist möglich, eine Teilmenge von Adjazenzmatrizen aufzulisten. Insbesondere wenn ein Graph auf Eckpunkten , kann ich ohne Verlust der Allgemeinheit davon ausgehen, dass die Eckpunkte so angeordnet sind, dass . Mit anderen Worten, jeder Graph ist isomorph zu einem, bei dem die Scheitelpunkte in der Reihenfolge ihres nicht abnehmenden Grades angeordnet sind. Es genügt also, nur die Adjazenzmatrizen aufzulisten, die diese Eigenschaft haben. Ich weiß nicht genau, wie viele solcher Adjazenzmatrizen es gibt, aber es sind viel weniger als , und sie können mit viel weniger als aufgezählt werdenN V = { v 1 , ... , v n } ° V 1 ≤ deg v 2 ≤ ⋯ ≤ deg v n 2 n ( n - 1 ) / 2 2 n ( n - 1 ) / 2Rechenschritte. Dies hinterlässt jedoch immer noch viel Redundanz: Viele Isomorphismusklassen werden immer noch viele Male behandelt, daher bezweifle ich, dass dies optimal ist.
Können wir es besser machen? Wenn ich es richtig verstehe, gibt es ungefährÄquivalenzklassen nicht-isomorpher Graphen. Können wir einen Algorithmus finden, dessen Laufzeit besser ist als die obigen Algorithmen? Wie nah können wir uns demUntergrenze? Mir geht es in erster Linie um die Traktierbarkeit für kleine (etwa oder ; klein genug, um einen solchen Algorithmus plausibel vollständig ausführen zu können), nicht so sehr um die Asymptotik für große .
Siehe auch: Konstruktion von inequivalenten binären Matrizen (obwohl man leider keine gültige Antwort erhalten zu haben scheint).