任务:我想使用Python的graph-tool
有效地来计算DAG(有向无环图)中源节点和目标节点之间的最短路径。我的DAG负重。
从理论上讲,这是一个计算上的“简单”问题(即 O(V + E)),方法是先计算图的拓扑排序,然后访问并更新父节点和距离(例如here所述。
如何使用graph-tool
有效地实现这一点?
到目前为止,我的尝试失败:
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
有效地计算此功能?
答案 0 :(得分:0)
此功能已添加到graph-tool的git版本:
https://git.skewed.de/count0/graph-tool/commit/012787ecde818efc2b893ad0d8aff819b8deb6ca
现在可以将可选参数dag=True
传递给shortest_path()
,以实现所需的功能。
答案 1 :(得分:-1)
您是否尝试过使用Networkx库?据我所知,它是高效的,适用于加权图和非加权图,并且使用非常简单。
一个例子:
>>> 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]