所以,我使用boost::graph
在带有定制A *的图表上实现了路径重叠,但都是从头开始的。
什么是路径重叠很简单。给定一个字母图('A'-> 'C'
,...)和一个单词HELLO,我需要从图中的'H'
开始找到最佳重叠,以{结尾{1}}(如果存在,或在达到路径长度时结束)。 “最佳”指的是候选节点的选择方式,只是探索更接近当前单词的字母。因此,图表权重是动态的,它们取决于输入字。请参阅以下示例:
'O'
我所做的很简单:使用跟踪节点并将其插入优先级队列的DFS。显然,这不是最优的:我非常想使用/*
* B H
* / \ /
* A---D---F---G---I
* \ /\
* C E
*
* input: A E I O U
* result: A D F G I
*/
。
我的问题很简单:所有示例都使用没有初始节点的图遍历。该图非常大,最小8M节点,希望在集群上获得高达100M的节点。所以我的目标是在具有Parallel BGL的集群上分发图形。
你有什么建议?
可能我从零开始的方法并不是最好的方法,使用BGL会更容易,但是虽然我成功地尝试了一个非常基本的boost::depth_first_search
,但我没有尝试一个简单的{{1} }。我无法理解彩色地图以及如何设置目标节点,因此我将发布我的代码,希望有人能指出我正确的方向。
再次注意,我需要将代码移动到Parallel BGL。
谢谢!
astar_search
答案 0 :(得分:0)
您似乎已定义了Bellman-Ford访问者,而不是DFS访问者。请注意,没有并行的bellman_ford_shortest_paths
,但是还有其他几种最短路径算法可用。
https://www.boost.org/doc/libs/1_71_0/libs/graph_parallel/doc/html/index.html
boost::depth_first_search
以root_vertex
作为起始顶点。
您不需要输入颜色图;如果将boost::vecS
存储类型用于顶点,将为您提供一个。否则,您可以创建如下的颜色图:
using Vert = boost::graph_traits<MyGraph>::vertex_descriptor
using Map = std::unordered_map<Vert, boost::default_color_type, boost::hash<Vert>>;
Map stlColors;
auto boostColors = boost::make_assoc_property_map(stlColors);
平行图工具的API已更改,但文档尚未更新以反映此情况。并行版本的算法中还存在无法映射回串行行为的意外行为。
a。并行地,您需要depth_first_visit
或tsin_depth_first_visit
而不是depth_first_search
,它们将从每个进程的不同节点开始。
b。对于分布式property_map
,您必须非常小心。仅从映射中读取可能会触发MPI操作,这可能导致depth_first_visit
变体被锁定。更糟糕的是,由于mpi_process_group.
breadth_first_search
的异步模型在我的经验中更加强大,因此锁定是不确定的。我尚未测试最短路径算法,但是由于问题似乎是由分布式property_map
引起的,因此请不要仅仅因为它可以在8个进程上工作就假定它不会在16个上冻结。 。或冻结您在8个进程上第四次运行它。
c。 mpi_process_group
并行Boost图形库中存在一个错误,该错误与某些进程上的零节点有关。这里有一个修复程序:https://github.com/boostorg/graph_parallel/issues/18