Erkenntnis-Zyklus von 3 Knoten ( oder Dreiecke) in einem Diagramm
Arbeite ich mit komplexen Netzwerken. Ich möchte zu finden eine Gruppe von Knoten, welche Formen einen Zyklus von 3 Knoten (oder Dreiecke), die in einem gegebenen Graphen. Als mein graph enthält über Millionen Kanten, mit einem einfachen iterativen Lösung (mehrere "for" - Schleife) ist nicht sehr effizient.
Bin ich mit python für meine Programmierung, wenn diese einige der eingebauten Module, für die Behandlung dieser Probleme, bitte lassen Sie mich wissen.
Wenn jemand weiß, dass jeder Algorithmus, der verwendet werden kann für die Suche nach Dreiecken in Graphen, bitte Antworten zurück.
Welche algorithmen haben Sie sich überlegt? Was haben Sie versucht?
InformationsquelleAutor zapa | 2009-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer million Kanten ist ziemlich klein. Es sei denn, Sie tun es Tausende Male, einfach nur eine naive Implementierung.
Werde ich davon ausgehen, dass Sie über ein Wörterbuch von node_ids, die eine Folge von Ihren Nachbarn, und, dass der graph gerichtet ist.
Beispiel:
Meine Lösung:
Überprüfung der Leistung:
Als ich es versucht habe, es hat länger gedauert die zu bauen, die zufällige Graphen als Anzahl der Zyklen.
Möchten Sie vielleicht, um es zu testen obwohl 😉 ich nicht garantieren, dass es richtig ist.
Konnte man auch einen Blick in networkx, das ist der große python-Grafik-Bibliothek.
InformationsquelleAutor wisty
Ich will nicht zu hart klingen, aber haben Sie versucht, Google es? Der erste link ist eine ziemlich schnellen Algorithmus zu tun, dass:
http://www.mail-archive.com/[email protected]/msg05642.html
Und dann gibt es noch diese Artikel auf ACM (die Sie möglicherweise Zugriff haben):
http://portal.acm.org/citation.cfm?id=244866
(und wenn Sie keinen Zugriff haben, bin ich sicher, dass, wenn Sie bitten die Dame, die es schrieb, Sie erhalten eine Kopie.)
Außerdem kann ich mir vorstellen, ein Dreieck-enumeration-Methode basiert auf clique-Zersetzung, aber ich weiß nicht, ob es war irgendwo beschrieben.
InformationsquelleAutor J S
Ziemlich einfache und klare Art und Weise zu tun, ist die Verwendung von Networkx:
Mit Networkx Sie können die loops von einem ungerichteten Graphen durch nx.cycle_basis(G) und wählen Sie dann die, die mit 3 Knoten
oder finden Sie alle Cliquen von find_cliques(G) und dann wählen Sie die, die Sie wollen (mit 3 Knoten). Cliquen sind Teile des Graphen, wo alle Knoten miteinander verbunden sind, und das passiert in Zyklen/loops mit 3 Knoten.
InformationsquelleAutor Ash
Angenommen es ist ein ungerichteter graph, die Antwort liegt in networkx-Bibliothek von python.
wenn Sie brauchen nur zu zählen, Dreiecke, verwenden Sie:
Aber wenn Sie benötigen, zu wissen, die Liste der Kanten mit Dreieck (triadische) Beziehung, verwenden
Dieser wird Ihnen alle Cliquen (k=1,2,3...max degree - 1)
So, um filter nur Dreiecke ich.e k=3,
Den triad_cliques geben wird, eine Liste der Kanten mit nur Dreiecke.
InformationsquelleAutor Ajay JM
Obwohl es ist nicht effizient, möchten Sie vielleicht, um eine Lösung implementieren, so verwenden Sie das Schleifen. Einen test schreiben, damit Sie eine Vorstellung bekommen, wie lange es dauert.
Dann, wie Sie versuchen, neue Ansätze können Sie zwei Dinge tun:
1) Stellen Sie sicher, dass die Antwort bleibt die gleiche.
2) Sehen Sie, was die Verbesserung ist.
Dass ein schneller Algorithmus, der findet etwas, das wahrscheinlich Schlimmeres, als mit einer langsameren.
Sobald Sie die langsamen Tests können Sie sehen, wenn Sie tun können diese in parallel-und sehen, was die performance-Steigerung ist.
Dann können Sie sehen, wenn Sie können markieren Sie alle Knoten mit weniger als 3 vertices.
Idealerweise möchten Sie vielleicht, um es schrumpfen zu nur 100 oder so den ersten, so können Sie es ziehen, und sehen, was geschieht grafisch.
Manchmal Ihr Gehirn zu sehen, ein Muster, das nicht so offensichtlich, wenn man auf algorithmen.
InformationsquelleAutor James Black
Ich arbeite an dem gleichen problem des Zählens der Anzahl der Dreiecke auf ungerichtete Grafik und wisty die Lösung funktioniert wirklich gut in meinem Fall. Ich habe Sie ein bisschen verändert, so dass nur ungerichtete Dreiecke werden gezählt.
Natürlich, Sie müssen, verwenden Sie ein Wörterbuch zum Beispiel
Mit dem code von Wisty, die Dreiecke gefunden werden
[(0, 1, 2), (0, 2, 1), (0, 3, 1), (1, 2, 3)]
denen gezählt, die das Dreieck (0, 1, 2) und (0, 2, 1) als zwei verschiedene Dreiecke. Mit dem code habe ich geändert, werden diese gezählt, da nur ein Dreieck.
Habe ich diese mit einer relativ kleinen Wörterbuch von unter 100 Schlüssel und jeder Schlüssel hat im Durchschnitt 50-Werte.
InformationsquelleAutor Alex Huong Tran
Brauchen Sie 'alle' die 'Dreiecke', oder nur 'einige'/'any'?
Oder vielleicht brauchen Sie nur, um zu testen, ob ein bestimmter Knoten ist Teil eines Dreiecks?
Der test ist einfach - gegeben ein Knoten A ist, gibt es keine zwei verbundenen Knoten B & C, die sind auch direkt verbunden.
Wenn Sie brauchen, um alle Dreiecke, insbesondere alle Gruppen von 3 Knoten, in denen jeder Knoten angeschlossen, die anderen beiden - dann müssen Sie prüfen, alle möglichen Gruppen in eine sehr lang andauernde "for each" - Schleife.
Die einzige Optimierung ist, die sicherstellen, dass Sie überprüfen Sie nicht die gleiche "Gruppe" zweimal, wenn Sie z.B. bereits getestet haben, dass B & C sind nicht in einer Gruppe mit einem, dann nicht überprüfen, ob Ein & C sind in einer Gruppe mit B.
InformationsquelleAutor Kirk Broadhurst
Überrascht zu sehen, keine Erwähnung der Networkx Dreiecke Funktion. Ich weiß es nicht zurückgeben, die Gruppen von Knoten, die ein Dreieck bilden, aber sollte ziemlich relevant für viele, die sich auf dieser Seite.
Alternative Möglichkeit zur Rückkehr Klumpen von Knoten, wäre so etwas wie...
InformationsquelleAutor Miss Palmer
Wenn Sie nicht kümmern, über mehrere Kopien des gleichen Dreieck in einer anderen Reihenfolge dann eine Liste von 3-Tupeln arbeitet:
Die Logik hier ist zu prüfen, jedes paar von Nachbarn eines jeden Knotens, um zu sehen, wenn Sie verbunden sind.
G[n]
ist eine schnelle Art und Weise zu Durchlaufen oder sich Nachbarn.Wenn Sie möchten, um loszuwerden, reorderings, wiederum jeweils dreifach in ein frozenset und machen Sie einen Satz von der frozensets:
Wenn Sie nicht wie frozenset wollen und eine Liste der sets dann:
InformationsquelleAutor dschult
Dies ist eine effizientere version der Ajay M Antwort (ich würde kommentiert haben, aber ich habe nicht genug reputation).
In der Tat die
enumerate_all_cliques
Methode dernetworkx
zurück alle Cliquen im graph, unabhängig von deren Länge; daher Durchlaufen, es kann eine Menge Zeit (vor allem bei sehr dichten Graphen).Außerdem, einmal definiert, für die Dreiecke, es ist nur eine Frage der Parametrisierung Verallgemeinerung der Methode für jede clique Länge, so ist hier eine Funktion:
Man Dreiecke verwenden Sie einfach
get_cliques_by_length(G, 3)
.VORBEHALT: diese Methode funktioniert nur für ungerichtete Graphen. Algorithmus für Cliquen in gerichteten Graphen nicht in
networkx
InformationsquelleAutor gibbone