2013-01-18 6 views
6

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?

+0

Das klingt nach etwas, das in "Die Kunst der Computerprogrammierung, Band 4" sein könnte. – templatetypedef

Antwort

1

Graph Isomorphie ist meiner Meinung nach nicht etwas, das Sie sich selbst überlegen sollten. Ich glaube, der aktuelle Stand der Technik ist Brendan McKays Nauty (und zugehörige Programme/Bibliotheken). Es ist ein bisschen wie ein Bär, mit dem man arbeiten kann, aber es kann sich lohnen, wenn man seinen eigenen, naiven Graphisomorphismus vermeidet. Außerdem ist es hauptsächlich auf ungerichtete Graphen ausgerichtet, kann aber auch Digraphen verwenden. Vielleicht möchten Sie die geng (die ungerichtete Graphen generiert) und directg (die Digraphen mit einem zugrunde liegenden Graphen generiert) Dienstprogramme, die mit Nauty kommen.

+0

Danke, @mhum, mindestens +1. Sieht so aus, als ob Nautys 'geng' Einschränkungen für den Grad erlaubt (für k = 3' -d1' als untere und '-D3' für obere). Aber 'directg' wird diese Einschränkungen nicht beachten, und die Kombinatorik der Konvertierungsregeln wäre nicht-trivial: Während Grad eins sich selbst, innen und außen und Grad drei Kräfte alle entweder hinein oder heraus erzwingt, würde dies für Grad zwei der Fall sein auf die Nachbarn in einer sehr schönen Art und Weise, nicht wahr? –

+0

Sie werden wahrscheinlich ein wenig herumspielen müssen, um dies zum Laufen zu bringen. Ich würde wahrscheinlich mit * geng * mit -d6 und -D6 beginnen, um eine Liste von 6-regulären, ungerichteten Graphen zu erhalten, dann füge diese Graphen in * directg * ein und werfe diejenigen aus, die nicht indegree und outdegree = 3 entsprechen alle Knoten. Nicht sicher, ob das für dich schnell genug ist, aber ich würde wetten, dass es schneller wäre, als Isomorphismus allein zu überprüfen. – mhum

+0

Das macht sehr viel Sinn. Vielen Dank. –

1

Dies ist eher ein Kommentar als eine Antwort, weil es scheint, als ob ich etwas in Ihrer Frage verpasst habe.

Erstens ist es möglich, dass ein solches Diagramm azyklisch ist?

Ich frage mich auch über Ihre Symmetrie Einschränkung. Sind damit nicht alle derartigen Graphen symmetrisch zueinander? Darf man Zeilen und Spalten der Verbindungsmatrix permutieren?

Wenn wir zum Beispiel Selbstverbindungen im Graphen zulassen, erfüllt die folgende Verbindungsmatrix Ihre Bedingungen?

1  1  0  0  0  0  0  1 
1  1  1  0  0  0  0  0 
0  1  1  1  0  0  0  0 
0  0  1  1  1  0  0  0 
0  0  0  1  1  1  0  0 
0  0  0  0  1  1  1  0 
0  0  0  0  0  1  1  1 
1  0  0  0  0  0  1  1 

aus dieser Matrix ausgehend, ist es dann nicht möglich, die Zeilen und Spalten davon permutieren alle solche Graphen zu erhalten, in der alle Zeilen und Spalten eine Summe von drei haben?

Ein Beispiel für eine solche Matrix kann aus der obigen Matrix A in der folgenden Weise (unter Verwendung von MATLAB) erhalten werden.

>> A(randperm(8),randperm(8)) 

ans = 

    0  1  0  0  0  1  1  0 
    0  0  1  0  1  0  1  0 
    1  1  0  1  0  0  0  0 
    1  1  0  0  0  1  0  0 
    1  0  0  1  0  0  0  1 
    0  0  1  1  0  0  0  1 
    0  0  1  0  1  0  0  1 
    0  0  0  0  1  1  1  0 

PS. In diesem Fall habe ich den Befehl einige Male wiederholt, um eine Matrix mit nur Nullen in der Diagonalen zu erhalten.:)

bearbeiten

Ah, ich Ihre Kommentare sehen, dass ich nicht richtig war. Natürlich muss der Permutationsindex für Zeilen und Spalten gleich sein. Ich hätte es zumindest bemerken sollen, als ich mit einem Graphen mit Selbstverbindungen anfing und einen ohne sie nach der Permutation erhielt.

Eine zufällige isomorph Permutation würde stattdessen wie folgt aussehen:

idx = randperm(8); 
A(idx,idx); 

, die alle Selbst Verbindungen zu halten.

Vielleicht könnte dies von Nutzen sein, wenn die Matrizen erzeugt werden, aber es ist überhaupt nicht so nützlich wie ich dachte, es wäre.

+0

Danke, @ user1884905. Für k = 3 sind diese Graphen tatsächlich zyklisch. Ihre Idee, die Matrix zu permutieren, ist ordentlich. Bei systematischen Läufen überprüfen Sie "Dauerwellen". Um Isomorphismen zu testen, ist der Permutationsindex für Zeilen und Spalten gleich, sodass ein Generator solche identischen Indizes ausschließen kann. Mit einigen Bearbeitungen würde ich das aufwerten. Beachten Sie jedoch, dass eine Permutation mit eindeutiger Zeilen- und Spaltenindizierung nur notwendig ist, nicht ausreichend, um Isomorphismen zu vermeiden, und die Einsparungen daraus sind mir noch nicht klar. Für n = 3 und k = 2 sind die meisten Ergebnisse Isomorphe, obwohl für n >> k Kollisionen fallen sollten. –

+0

@ s.bandara Danke für die Kommentare, ich sehe, ich war etwas abseits. Ich wundere mich immer noch über die azyklischen Grafiken. Ist es nicht notwendig, dass azyklische Graphen Knoten ohne Nachfolger und Knoten ohne Vorgänger haben? – user1884905

+0

Guter Punkt. Ich wollte sagen, dass zyklisch oder nicht ist nicht Teil meiner Kriterien, aber ich sehe jetzt, dass sie alle Zyklen haben wird. –