создание карты свойств boost :: graph edge_weight - PullRequest
3 голосов
/ 03 апреля 2009

используя 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; не предполагая, что я не делаю что-то совершенно глупое здесь.

1 Ответ

2 голосов
/ 04 апреля 2009

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

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 ) от предоставленного края. Это свойство_карты обычно определяется в графе.

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

...