提升DFS教程:从串口到并行

时间:2014-11-14 13:35:36

标签: c++ boost boost-graph

所以,我使用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

1 个答案:

答案 0 :(得分:0)

  1. 您似乎已定义了Bellman-Ford访问者,而不是DFS访问者。请注意,没有并行的bellman_ford_shortest_paths,但是还有其他几种最短路径算法可用。 https://www.boost.org/doc/libs/1_71_0/libs/graph_parallel/doc/html/index.html

  2. 可以给
  3. boost::depth_first_searchroot_vertex作为起始顶点。

  4. 您不需要输入颜色图;如果将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);
  1. 平行图工具的API已更改,但文档尚未更新以反映此情况。并行版本的算法中还存在无法映射回串行行为的意外行为。

    a。并行地,您需要depth_first_visittsin_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