Verwenden Sie eine Grafik-Bibliothek/Knoten-Netzwerk-Bibliothek oder Schreibe Meine Eigenen?
Ich versuche zu entscheiden, zwischen gehen mit einem pre-made-graph/node-Netzwerk-Bibliothek oder zu Rollen, meine eigene.
Ich bin der Umsetzung einige graph-such-algorithmen, die möglicherweise erfordern einige erhebliche Anpassung der Klasse der Struktur der Knoten und/oder Kanten.
Der Grund, warum ich bin mir nicht sicher, was zu tun ist, ich bin mir nicht sicher, ob die Anpassung eines vorgefertigten könnte teurer sein/ärger, als meine eigenen in den ersten Platz. Ich bin auch neugierig, aber weniger so, von der performance trade-offs.
Gibt es jemand da draußen haben eine direkte Erfahrung mit der Verwendung einer der Bibliotheken gibt, und die Beratung auf einen Erfolg oder Misserfolg der Geschichte? Ich möchte hören, das Schlimmste also, dass alles, was ich habe, weiß ich, was ich bin immer in.
Gibt es nur zwei, die ich gefunden habe bei meiner Suche bisher: Die Boost Graph Library (BGL) und GOBLIN. Konkrete Hinweise auf die beiden oder Vorschläge für andere stark geschätzt, wie auch. BGL scheint ziemlich verdammt geheimnisvoll. Lohnt es sich zu kämpfen durch?
- Boost bekannt für seine Qualität im Allgemeinen, und der BGL-Schnittstellen mit GraphViz.
- richtig ist - unterschätzen Sie nicht die macht des seins in der Lage zu nutzen GraphViz - es ist absolut erstaunlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann ich vielleicht eine kleine Anleitung auf der BGL.
Die Bibliothek ist sehr flexibel. Die Kosten für dieses ist, dass die syntax kann sehr Barock, um Platz für alle Möglichkeiten. Es ist jedoch ausreichend flexibel, dass einfache Dinge, die getan werden kann, einfach.
Leider die boost-Dokumentation geht in Sachen full tilt Poker bietet nur eine Beschreibung des ganzen Komplexität, ohne eine Andeutung, wie einfach die Dinge sein können.
( "Jede hinreichend fortschrittliche Technologie ist von Magie nicht unterscheiden" - Arthur C. Clarke. Was sollte er haben, sagte ist "Jede fortschrittliche Technologie, ausreichend schlecht dokumentiert ist, ist von Magie nicht unterscheiden )
Betrachten:
Dies ist, wie die "quick-tour" schlägt vor, wir drucken Sie eine Liste der graph-Knoten. Jedoch, eine kleine Studie zeigt, dass ein vertex nicht mehr als ein integer-index, und Sie können den code stark vereinfacht,
Vielleicht gibt es einige Magische Dinge, die nicht erreicht werden kann mit diesem vereinfachten code, aber für den alltäglichen Gebrauch ist es sinnvoll, drastisch beschneiden die syntax, encrust BGL, so dass Sie sehen können, was Ihre Codierung.
Manchmal die aufwändige syntax kann nicht entfernt werden. ( Oder vielleicht habe ich nur nicht bemerkt, die zugrunde liegende Wahrheit ). Dann habe ich in der Regel verwenden Sie eine kleine utility-Funktion zu Kapseln, die Komplexität abd halten Sie es Weg von dem Algorithmus, den ich auf Arbeit bin.
Beispielsweise, brauche ich oft eine Schleife über die Kinder eines Knotens
In der unteren Zeile ist: gehen Sie voran und verwenden BGL. Es kann vereinfacht werden, einfache Dinge zu tun, aber sobald Sie gelernt haben, es zu benutzen, all die immensen Flexibilität wird verfügbar sein, Wann immer Sie es brauchen.
"erfordert einige signifikante Anpassungen an den Klassen-Struktur der Knoten und/oder Kanten."
Haben Sie mir die "gebündelten Eigenschaften" - Funktion des BGL?
http://www.boost.org/doc/libs/1_40_0/libs/graph/doc/bundles.html
Dies ist sowohl kraftvoll und kein bisschen acrcane.
Definieren Sie die Klassen für Ihre Kanten und Ihre Scheitelpunkte
Nun definieren Sie eine Grafik geben, die Ihre Klassen
Nun können Sie erstellen Diagramme dieses Typs verwenden Ihre Klassen, was auch immer Sie sind, für die Ecken und Kanten.
Können Sie auf die Attribute und Methoden der Klassen in einer vollkommen natürlichen Weise
Ich habe vor kurzem gab die boost graph library eine Studie für Dijkstras shortest-path-problem. Ergebnisse:
Sehr Hohe Leistung
Sehr wenig code benötigt
Sehr flexibel und erweiterbar
Schwer zu verstehen, oder Debuggen
Beratung: Verwenden aber bevor Sie dies tun Lesen Die Boost Graph Library: User Guide and Reference Manual
Ich denke, wenn Sie in den Genuss der graph-traversal-algorithmen, lohnt es sich, mit der Boost Graph. Erstellen und verwenden von benutzerdefinierten Knoten ziemlich einfach. Die Beispiele enthalten BGL waren nützlich für das lernen, wie es zu benutzen.
Ich Stimme mit Clifford, ich habe GraphViz zu visualisieren Diagramm bei der Entwicklung und fand es sehr nützlich.
Können Sie auch einen Versuch mit ZITRONE graph-Bibliothek.
Konnte ich es verwenden, um durchzuführen Dijsktra kürzesten Weg suchen, nach dem Lesen des Graphen aus einer Konfigurationsdatei.
Eine neue version gerade raus gekommen.
Dies ist nicht wirklich eine schlüssige Antwort, mehr hinzufügen, was bereits gesagt worden ist.
Die Lösung dieses Problems hängt vom Kontext des Problems. Wenn Sie möchten Holen Sie sich ein großes Verständnis, wie graph-algorithmen, und die software funktioniert. Schreiben Sie Ihre eigene. Wenn Sie erhalten möchten eine fortgeschrittene Kenntnisse von graph-algorithmen und Strukturen oder implementieren Sie Sie in Ihre eigenen Programme lernen Sie dann eine standard-Grafik-Bibliothek. (Siehe die Gründe für die Verwendung von wieder verwendbarem code)
Das beste aus beiden Welten. Beide tun. Wenn Sie gestreckt sind, für die Zeit, bekommen Sie ein Buch oder tutorials und Beispiele.
Einen anderen Vorschlag: stellen Sie eine neue zugespitzte Frage, was das {beste, zuverlässigste, am einfachsten zu lernen,} graph-Bibliothek für {beschreibt ein sehr Allgemeines problem}? Dies wird Ihnen helfen, wählen, was zu lernen, als zu versuchen, Sie zufällig zu finden, die am besten Ihren Anforderungen entspricht. Hat jemand schon dieses problem gesehen, um Rat zu Fragen.
Verwendung Von Wiederverwendbaren Code:
Rollte ich meinen eigenen. Sie sollten nicht Folgen Sie diesem Beispiel, es sei denn, Sie absolut sicher sind, müssen Sie.
Immer noch, es ist eine großartige Lernerfahrung, wenn Sie Graphentheorie ist rostig.
Ich hatte viel "Spaß" mit der Kombination Digraphen mit EBNF-Operatoren, und das tun epsilon-elimination und Hopcroft-basierte Minimierung. Vor allem mit der Verharmlosung, wenn Sie anrufen können, verzweifelt versuchen zu finden gute Informationen und herauszufinden, wie es funktioniert "Spaß" 🙁
Wenn Sie Rollen Sie Ihre eigenen, empfehle ich die Trennung von high-level-Operationen von dem niedrigen Niveau digraph Datenstrukturen - Klassen nicht nur verschiedene Methoden. Ich nicht - und schon bald werde ich die Umgestaltung stark, weil der, dass eine schlechte Entscheidung.
Einige Diagramme mit Anmerkungen versehen von Knoten, einige Anmerkungen Kanten einige beide. Manchmal zwei Anmerkungen sind hilfreich, auch wenn Sie nur Fremdschlüssel für externe Daten. Zum Beispiel in finite-state-machines, eine Kante kann mit Anmerkungen versehen werden mit einem Eingang und einem Ausgang. Sie sind wahrscheinlich daran interessiert, Determinismus WRT die Eingabe aber nicht den Ausgang, so dass Sie beide versteckt hinter einer einzigen ID ist ein Schmerz - und das ist neben dem ganzen Problem der sekundären Behälter für die was-hat-dieses-ID-verweisen-zu-lookups.
Auch, manchmal Sie nur wollen, um die Arbeit mit Dingen, die nicht konstruiert waren explizit als digraph IYSWIM - z.B. eine Reihe von Daten-Struktur werden Knoten, die miteinander verlinkt sind.
IOW, ist es sinnvoll, in der Lage sein zu Stecker in verschiedenen digraph Darstellungen, aber immer noch die gleichen high-level-Werkzeuge für viele Vorgänge.
IMO bekam ich es richtig, wenn ich schrieb einen 'Baum-tool" - Klasse, die nicht Dinge wie Iteration und subscripting im treeview -, um-und XML-element-tag um. Der zugrunde liegende Baum-Darstellung ist steckbar (policy based template). Mit Digraphen, ich Durcheinander.
Sowieso, ich weiß nicht, was der Boost-oder andere Grafik-Bibliothek bietet tatsächlich, aber wenn es das bietet, was Sie brauchen, sage ich es verwenden. Sie sparen eine Menge Kopfschmerzen.
Bevor Sie sich entscheiden, bauen Sie Ihre eigenen Grafik-Bibliothek, hätte ich einen guten Blick auf igraph (http://igraph.sourceforge.net/). Es ist in C geschrieben und ist extrem schnell und bietet eine größere Auswahl an basic-und advanced graph-algorithmen (inklusive Visualisierung). Darüber hinaus hat es einen python-wrapper für die schnelle Kodierung von daher halte ich diese Lösung kombiniert die Geschwindigkeit der Codierung und die Geschwindigkeit der Ausführung.
Ich die BGL sehr viel, aber das, was mich stört, mit BGL ist der Mangel an grundlegenden algorithmen wie edge-und vertex-connectivity -, min-cost-flow und Allgemeine maximum weight perfect matching, um nur diejenigen, die ich am meisten vermisse.
ZITRONE bietet all das und hat auch einen einfacheren syntax ist es, was mich nervt mit ZITRONE ist die installation und Kompilierungs-Probleme auf WINDOWS-Plattformen, aber ich werde wohl wechseln ZITRONE trotz dieser Probleme ist.