Ich würde gerne NetworkX Graph
Objekte als Schlüssel in einem Python dict
verwenden. Ich möchte jedoch nicht das Standardverhalten für den Vergleich (d. H. Durch die Adresse des Objekts). Stattdessen möchte ich, dass sich iso- morphe Graphen als Schlüssel für die gleichen Elemente in dict
bezeichnen.'Isomorphe' Vergleich der NetworkX Graph-Objekte anstelle der Standard 'Adresse' Vergleich
Ist dieses Verhalten bereits irgendwo implementiert? Ich konnte keine Informationen in dieser Richtung finden.
Wenn ich es selbst implementieren muss, ist die folgende Einschätzung realistisch?
- Wrap
networkx.Graph
in einer Klasse. - Definieren Sie
__eq__
so, dass esis_isomorphic
aufruft. - Definieren Sie
__hash__
irgendwie (Vorschläge willkommen).
Ich denke, dass ich diese gewickelte Graph unveränderlich machen hätte, because:
Wenn eine Klasse veränderbare Objekte definiert und implementiert eine
__eq__()
Methode, sollte es nicht__hash__()
implementieren, da die Umsetzung der hashable Auflistungen erfordern, dass der Hash-Wert eines Schlüssels unveränderlich ist (wenn sich der Hash-Wert des Objekts ändert, befindet er sich im falschen Hash-Bucket). Hier
Verstehe ich richtig, dass Sie isophorphic Graphen wollen den gleichen Hash haben() Wert? Wenn ja, hilft dir das bei der Frage? - http://en.wikipedia.org/wiki/Graph_canonization – Aric
@Aric Wenn ich es selbst implementieren muss, dann ja, ich möchte, dass isomorphe Graphen den gleichen '__hash __()' Wert haben. Die Kanonisierung von Graphen ist jedoch möglicherweise übertrieben. Was ich im Sinn hatte, war, die [geordnete Abschlusssequenz] (http://en.wikipedia.org/wiki/Degree_sequence#Degree_sequence) zu bekommen und sie dann zu hashen. Wenn Sie dies tun, können nicht-isomorphe Graphen den gleichen Hash haben, aber isomorphe Graphen können keinen anderen Hash haben. Aber bevor ich damit anfange, hoffe ich zuerst, dass jemand es irgendwo schon getan hat :) – user1661473
Wenn Sie einen Weg finden können, eine eindeutige ganze Zahl aus der Grad-Sequenz zu machen, könnten Sie diese als hash() -Funktion verwenden. – Aric