2009-04-03 6 views
3

boost :: graph mit gebündelten Eigenschaften verwenden. Ich möchte in der Lage sein, Suchvorgänge mit einer Vielzahl von verschiedenen möglichen Gewichtungsschemata durchzuführen. Ich möchte, wenn möglich, keine zusätzliche Klasse für die gebündelten Eigenschaften erstellen und je nach Art der Suche unterschiedliche Gewichtungsfelder übergeben, ohne ein neues Diagramm zu erstellen oder alle vorhandenen Eigenschaften im Diagramm zu ändern.boost :: graph edge_weight property map erstellen

Kann ich manuell ein property_map für edge_weight_t erstellen? Hier ist, was ich bisher habe:

typedef boost::property_map<SSPSGraph_t, boost::edge_weight_t>::type WeightMap; 
typedef boost::property<boost::edge_weight_t, float> DistanceProperty; 

Und ich möchte nur in der Lage sein zu tun,

WeightMap distances; 
edge_descriptor_t e = some_edge_or_another; 
float d=some_derived_distance_value; 

und ordnen Abstände [e] auf den entsprechenden values--

distances[e]= ? 

Oder muss ich nur eine neue Struktur für die gebündelten Eigenschaften aufteilen - etwas, das ich vermeiden wollte - und daraus die Gewichtungskarte erstellen? Neu bei boost :: graph; Ich gehe nicht davon aus, dass ich hier nicht etwas völlig Dummes mache.

Antwort

2

Ich bin mir nicht sicher, ob ich Ihre Frage verstehe. Hier sind ein paar Tipps, die Ihnen helfen können:

boost :: property_map, die Sie verwendet haben, zu definieren WeightMap erfordert, dass Sie Eigentum in Ihrem Diagramm hinzufügen entspricht (Sie tat nur die Hälfte von dem, was durch die Definition DistanceProperty benötigt):

Wenn dies nicht getan wurde, boost :: property_map wird Ihnen sowieso nicht helfen.

Wenn Sie für jedes andere Schema, das Sie ausprobieren möchten, keine andere Gewichtungseigenschaft hinzufügen möchten, besteht die Alternative darin, solche Eigenschaften außerhalb der Diagrammdefinition zu definieren. Dies kann entweder getan werden - mit std :: map und boost::associative_property (das ist ziemlich einfach, aber hat die Effizienz einer Karte) - mit boost::vector_property_map, die effizienter ist (danke zugrunde liegenden std :: vector), erfordert aber eine Kennung property_map dh eine property_map, die einen numerischen Bezeichner (idealerweise zwischen 0 und num_edges() - 1) von der angegebenen Kante extrahieren kann. Diese property_map wird normalerweise innerhalb des Graphen definiert.

Wenn meine Antwort Ihnen nicht hilft (oder nicht genug), seien Sie bitte ein bisschen genauer in Ihrer Frage, also kann ich meine Antwort aktualisieren!