并行BGL - Dijkstra最短路径

时间:2017-09-09 01:20:52

标签: c++ boost graph parallel-processing mpi

我目前正在尝试使用Parallel Boost Graph Library运行并行Dijkstra最短路径算法。 在此页面上详细解释了应该如何完成:http://www.boost.org/doc/libs/1_65_1/libs/graph_parallel/doc/html/dijkstra_example.html

然而,我遇到的第一个问题是,我的Windows HPC MPI和boost 1.63无法识别以下行:

  

typedef mpi :: process_group< mpi :: immediateS > process_group_type;

我发现在这种情况下可以使用 boost :: graph :: distributed :: mpi_process_group

我的代码看起来像这样,并且除了一行之外,解释与教程几乎完全相同:

using namespace boost;
using boost::graph::distributed::mpi_process_group;



int main(int argc, char *argv[]) {

    boost::mpi::environment env(argc, argv);

    typedef adjacency_list < listS, distributedS<mpi_process_group, vecS>,
        directedS,
        no_property,                 // Vertex properties
        property<edge_weight_t, int> // Edge properties
    > graph_t;
    typedef graph_traits < graph_t >::vertex_descriptor vertex_descriptor;
    typedef graph_traits < graph_t >::edge_descriptor edge_descriptor;

    typedef std::pair<int, int> Edge;
    const int num_nodes = 5;
    enum nodes { A, B, C, D, E };
    char name[] = "ABCDE";
    Edge edge_array[] = { Edge(A, C), Edge(B, B), Edge(B, D), Edge(B, E),
        Edge(C, B), Edge(C, D), Edge(D, E), Edge(E, A), Edge(E, B)
    };
    int weights[] = { 1, 2, 1, 2, 7, 3, 1, 1, 1 };
    int num_arcs = sizeof(edge_array) / sizeof(Edge);

    graph_t g(edge_array, edge_array + num_arcs, weights, num_nodes);
    // Keeps track of the predecessor of each vertex
    std::vector<vertex_descriptor> p(num_vertices(g));
    // Keeps track of the distance to each vertex
    std::vector<int> d(num_vertices(g));

    vertex_descriptor s = vertex(A, g);
    dijkstra_shortest_paths
        (g, s,
            predecessor_map(
                make_iterator_property_map(p.begin(), get(vertex_index, g))).
            distance_map(
                make_iterator_property_map(d.begin(), get(vertex_index, g)))
            );


    std::cout << std::endl;

    return EXIT_SUCCESS;

}

尽管如此,我仍然有一个错误:

  

.. boost_1_63_0 \ boost \ graph \ distributed \ dijkstra_shortest_paths.hpp(116):错误C2664:'void boost :: local_put,boost :: default_color_type&gt;(boost :: dummy_property_map,const Key&amp;,const Value&amp; )':无法从'boost :: iterator_property_map&gt;&gt;,IndexMap,boost :: default_color_type,boost :: default_color_type&amp;&gt;'转换参数1 'boost :: dummy_property_map'

我搜索了很多网站,我正在考虑尝试另一个提升版或另一个mpi。教程是否按照链接中的说明工作,我的代码是否正常工作,或者我做错了什么?

非常感谢!

附录:问题已解决

解决这个问题基本上是两件事:

  • 首先,为了检查包含,我以错误的顺序包含了boost目录,从序列化开始并继续......

  • 第二个因素是库和操作系统。一般来说,Boost Graph库在unix系统上运行得更顺畅。

0 个答案:

没有答案