2009-04-03 11 views
3

en utilisant boost :: graph avec des propriétés groupées. Je veux être en mesure d'exécuter des recherches en utilisant une variété de différents schémas de pondération de bord possibles. Je ne souhaite pas créer une classe supplémentaire pour les propriétés groupées, si possible, et passer des cartes de poids différentes en fonction du type de recherche sans créer de nouveau graphique ou modifier toutes les propriétés existantes dans le graphique. Est-ce que je peux construire manuellement un property_map pour edge_weight_t? Voici ce que j'ai jusqu'à présent:création de boost :: graph edge_weight propriété map

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

Et je voudrais simplement être en mesure de le faire

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

et d'assigner des distances [e] à la values-- appropriée

distances[e]= ? 

Ou ai-je juste besoin de décomposer et de créer une nouvelle structure pour les propriétés groupées - quelque chose que j'ai essayé d'éviter - et de créer la carte de poids à partir de cela? Nouveau pour amplifier :: graphique; ne suppose pas que je ne fais pas quelque chose de complètement stupide ici.

Répondre

2

Je ne suis pas sûr de comprendre votre question. Voici quelques conseils qui peuvent vous aider:

boost :: property_map, que vous avez utilisé pour définir WeightMap suppose que vous ajoutez la propriété correspondant à l'intérieur de votre graphique (vous ne l'avez fait la moitié de ce qui est nécessaire en définissant DistanceProperty):

typedef boost::property<boost::edge_weight_t, float> DistanceProperty; 

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirS, boost::no_property, DistanceProperty> MyGraph; 

Si cela n'a pas été fait, boost :: property_map ne vous aidera pas du tout.

Si vous ne souhaitez pas ajouter de propriété de poids différente pour chaque schéma que vous souhaitez essayer, vous pouvez définir ces propriétés en dehors de la définition de graphique. Cela peut être fait - en utilisant std :: map et boost::associative_property (ce qui est assez simple mais a l'efficacité d'une carte) - en utilisant boost::vector_property_map, qui est plus efficace (merci std :: vector), mais nécessite un identifiant property_map c'est-à-dire une propriété_map qui peut extraire un identifiant numérique (idéalement entre 0 et num_edges() - 1) du bord fourni. Cette propriété_map est généralement définie dans le graphique.

Si ma réponse ne vous aide pas (ou pas assez), veuillez être un peu plus précis dans votre question afin que je puisse mettre à jour ma réponse!