使用Python的图工具在DAG中有效的最短路径

时间:2019-01-21 15:57:24

标签: python graph-tool

任务:我想使用Python的graph-tool 有效地来计算DAG(有向无环图)中源节点和目标节点之间的最短路径。我的DAG负重。

从理论上讲,这是一个计算上的“简单”问题(即 O(V + E)),方法是先计算图的拓扑排序,然后访问并更新父节点和距离(例如here所述。

如何使用graph-tool有效地实现这一点?

到目前为止,我的尝试失败:

  • 手动在Python中实现理论上有效的算法。但是,由于我必须遍历图中的每个顶点,所以它变得缓慢得令人无法接受
  • 使用shortest_path中的graph-tool函数来调用Boost Graph Library中的Dijkstra例程将具有可接受的运行时间,但不能完全利用DAG结构,并且对负数也无效无论如何
  • 使用shortest_path调用Bellman-Ford会返回正确的最短路径,但不会利用DAG结构,而且速度太慢( O(VE))。

高效的DAG最短路径算法在基础Boost Graph Library中实现为dag_shortest_paths。是否有任何方法可以通过graph-tool访问此功能,或者可以通过其他任何方式使用graph-tool有效地计算此功能?

2 个答案:

答案 0 :(得分:0)

此功能已添加到graph-tool的git版本:

https://git.skewed.de/count0/graph-tool/commit/012787ecde818efc2b893ad0d8aff819b8deb6ca

现在可以将可选参数dag=True传递给shortest_path(),以实现所需的功能。

答案 1 :(得分:-1)

您是否尝试过使用Networkx库?据我所知,它是高效的,适用于加权图和非加权图,并且使用非常简单。

https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.shortest_paths.weighted.all_pairs_dijkstra_path.html#networkx.algorithms.shortest_paths.weighted.all_pairs_dijkstra_path

一个例子:

    >>> import networkx as nx

    >>> G=nx.path_graph(5)
    >>> path=nx.all_pairs_dijkstra_path(G)
    >>> print(path[0][4])

[0, 1, 2, 3, 4]