создание карты свойств boost::graph edge_weight

используя boost::graph со связанными свойствами. Я хочу иметь возможность выполнять поиск, используя множество различных возможных схем взвешивания ребер. Я хотел бы не создавать дополнительный класс для связанных свойств, если это возможно, и передавать разные карты весов в зависимости от типа поиска без создания нового графика или изменения всех существующих свойств в графике.

Могу ли я вручную создать карту свойств для edge_weight_t? Вот что у меня есть:

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

И я хотел бы просто быть в состоянии сделать

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

И присвойте расстоянию [e] соответствующие значения:

distances[e]= ?

Или мне просто нужно разбить и создать новую структуру для объединенных свойств — чего я пытался избежать — и создать из этого карту весов? Новое в boost::graph; не предполагая, что я не делаю здесь что-то совершенно глупое.


person Community    schedule 03.04.2009    source источник


Ответы (1)


Я не уверен, что понимаю ваш вопрос. Вот несколько советов, которые могут вам помочь:

boost::property_map, который вы использовали для определения WeightMap, требует, чтобы вы добавили соответствующее свойство внутри вашего графика (вы сделали только половину того, что необходимо, определив 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;

Если этого не сделать, то boost::property_map вам все равно не поможет.

Если вы не хотите добавлять разные свойства веса для каждой схемы, которую хотите попробовать, альтернативой является определение таких свойств вне определения графика. Это можно сделать либо с помощью std::map и boost: :associative_property (что довольно просто, но имеет эффективность карты) — с использованием boost::vector_property_map, который более эффективен (благодаря базовому std::vector), но требует идентификатора property_map, т. е. property_map, который может извлекать числовой идентификатор (в идеале от 0 до num_edges( ) - 1) от предусмотренного края. Эта карта свойств обычно определяется в графе.

Если мой ответ вам не поможет (или недостаточен), пожалуйста, будьте более точны в своем вопросе, чтобы я мог обновить свой ответ!

person Benoît    schedule 04.04.2009