2009-07-14 10 views
4

Ich schreibe eine Bibliothek für die Manipulation Bond Grafiken, und ich verwende die Boost Graph Library, um die Daten für mich zu speichern. Leider kann ich nicht herausfinden, wie man ein richtiges Besuchermuster mit ihm implementiert, da man keine Vertices herauslösen kann - man muss sich stattdessen auf "Eigenschaften" verlassen. Das Besucher-Framework, das in der Bibliothek bereitgestellt wird, scheint stark darauf ausgerichtet zu sein, mit bestimmten Algorithmen zu arbeiten, bei denen die Scheitelpunkte alle von demselben Typ sind, aber unterschiedliche Informationen speichern. In meinem Problem sind die Scheitelpunkte unterschiedlicher Art und speichern unterschiedliche Arten von Informationen - einige Scheitelpunkte sind Widerstände, während einige Kondensatoren usw. sind. Wie gehe ich beim Schreiben eines Besuchermusters vor, das auf der Grundlage einer Eigenschaft eines Scheitelpunkts arbeitet der Eckpunkt selbst?Boost Graph Bibliothek und Besucher

Mein einziger Gedanke war bisher, eine kleine Klasse zu schreiben, die den Typ eines Objekts darstellt, das auf den ursprünglichen Scheitelpunkt verweist, den ich brauche, um die Grapheninformationen zu erhalten. Das scheint jedoch sehr klatschig und böse zu sein.

Antwort

6

Was meinst du, Sie können keine Scheitelpunkte ableiten? Sie können Ihre eigene Vertex-Klasse verwenden, es ist nur eine Frage der Angabe in der Graph typedef. Sie können sogar Mitglieder als Eigenschaften verwenden, wenn Sie mit BGL-Algorithmen arbeiten.

Wie für die andere Möglichkeit (die härtere IMO ist), müssen Sie eine Vertex-Eigenschaftsliste erstellen und darauf zugreifen mit einem Vertex-Deskriptor ... ich denke.

Bearbeiten: Sie Vertex/edge Klassen angeben, wenn Ihr Grafiktyp definieren:

struct Vertex { 
    double some_property; 
}; 

struct Edge { 
    double weight; 
}; 

typedef boost::adjacency_list< 
    boost::listS, boost::vecS, boost::undirectedS, Vertex, Edge 
> Graph; //sorry about the formatting 

Graph g; 

Von wo auf g [vertex_descriptor] einen Verweis auf Vertex zurückkehren soll, zB:

//add 100 vertices 
for (int i=0; i<100; ++i) { 
    Graph::vertex_descriptor v = add_vertex(g); 
    g[v].some_property = -1.0; 
} 

//zero some_property for all vertices 
for (Graph::vertex_iterator i = vertices(g).first; 
          i != vertices(g).second; 
          ++i) 
{ 
    g[*i].some_property = 0.0; 
} 

I couldn Ich finde nicht, dass mein Besuchercode diese Eigenschaften nutzt, aber ich habe den relevanten Teil der BGL-Dokumentation gefunden:

1) Der Teil über Internal Properties, der empfohlen wird ds Sie verwenden stattdessen:
2) Bundled Properties

Die zweite Verbindung scheint mit einem Elementzeiger eine Boost-Funktion unter Verwendung von gebündelten Eigenschaften zu haben.

Hilft das?

+0

Wirklich? Ich bin auf der Suche nach Dokumentation dazu, und ich kann nicht viel finden - könnten Sie ein kurzes Beispiel geben, wo Sie eine benutzerdefinierte Vertex-Klasse bereitstellen, anstatt Eigenschaften stattdessen auf Scheitelpunkte anzuheften? –

+1

Ich hatte auch Probleme mit der Dokumentation. Sobald ich nach Hause komme, werde ich ein Codebeispiel posten. – aib

+0

Es tut - ich endete mit einem ähnlichen Ansatz in einem Versuch für das Problem. Das einzige Problem hierbei ist, dass ich auch von den Eigenschaften des Elements aus auf die Vertex-Informationen zugreifen musste. Dies beinhaltete die Verfolgung des eigenen Vertex-Deskriptors des Elements und das Weiterleiten aller Anfragen für Verbindungsinformationen über den Deskriptor.Es war ziemlich kompliziert, und ich bin ziemlich sicher, dass es mir jetzt besser geht, selbst eine kleine Graphimplementierung zu schreiben. Danke, wenn ich diese Bibliothek in Zukunft für andere Dinge verwende, sind gebündelte Eigenschaften definitiv der richtige Weg! –

0

Vielleicht könnten Sie boost :: variant verwenden, um eine disjunkte Summe der Vertex-Typen zu erstellen, und dann den BGL-Besucher mit einem boost :: variant-Besucher an jedem Knoten kombinieren?

4

Wenn jemand interessiert ist, nach 2 Monaten, hier ist ein Besucher, der auf die Eigenschaft schaut.

Wenn der Besucher die Eigenschaften ändern muss, dann sind die Dinge etwas komplizierter. Für die Ausgaben - click here

+0

Wie verwenden Sie das? 'breast_first_search (G, Vertex (0, G), demo_visitor())' gibt einen Fehler. – Arlen

+0

@ user1344784 Was ist der Fehler, den Sie bekommen? Vielleicht könnten Sie eine neue Frage mit Ihrem Code und dem Fehler, den Sie erhalten, posten. Wenn ja, poste bitte einen Link zu deiner Frage, damit ich sie finde. – ravenspoint