3

使用带有捆绑属性的 boost::graph。我希望能够使用各种不同的可能边缘加权方案来运行搜索。如果可能的话,我不想为捆绑的属性创建一个额外的类,并根据搜索类型传递不同的权重图,而无需创建新图表或修改图表中的所有现有属性。

我可以为 edge_weight_t 手动构建 property_map 吗?这是我到目前为止所得到的:

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 的新功能;不要假设我在这里没有做完全愚蠢的事情。

4

1 回答 1

2

我不确定我是否理解你的问题。以下是一些可能对您有所帮助的提示:

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之间)。此 property_map 通常在图中定义。

如果我的回答对您没有帮助(或不够),请在您的问题中更准确一点,以便我更新我的答案!

于 2009-04-04T18:45:47.037 回答