【发布时间】:2017-12-09 07:50:27
【问题描述】:
我想计算图中所有对之间的所有最短路径。为此,我对图中的每个节点对使用graph_tool 的 all_shortest_paths 函数。根据文档,如果给定,该函数能够尊重边缘权重。乍一看,这很好用。但是,我发现返回的最短路径列表不完整。它似乎只包括最短路径,也使用完整最短路径集中的最少跳数。
这是一个小例子:
import graph_tool
import graph_tool.topology
#setup graph
g = graph_tool.Graph()
g.add_vertex(5)
edges = [(0,1),(1,2),(3,2),(0,4),(4,3)]
metrics = [3, 4, 2, 1, 3]
g.edge_properties["metric"] = g.new_edge_property("int")
for i in range(len(metrics)):
e = g.add_edge(*(edges[i]))
g.edge_properties["metric"][e] = metrics[i]
#compute all shortest paths from 0 to 2
paths = graph_tool.topology.all_shortest_paths(g, 0, 2, weights=g.edge_properties["metric"])
for path in paths:
print(path)
print("-"*10)
#increase metric of edge 0-4
g.edge_properties["metric"][g.edge(0,4)] = 2
#recompute all shortest paths from 0 to 2
paths = graph_tool.topology.all_shortest_paths(g, 0, 2, weights=g.edge_properties["metric"])
for path in paths:
print(path)
它生成一个包含 5 个顶点和边的图,这些边形成了从顶点 0 到顶点 2 的 2 条路径,如下所示:
0 --- 1 --- 2
\ /
\ /
4 --- 3
显然,路径 [0, 1, 2] 在跳数方面比 [0, 4, 3, 2] 短。如果没有给出度量,则可以正确识别(此处未演示)。
在示例的开头,边缘以这样一种方式加权,即第二条路径具有更多跳数,“更短”。度量之和为 6,而另一条路径的总值为 7。因此,该算法正确返回 [0, 4, 3, 2]。
然后,0 到 4 之间的边的度量值增加 1。现在两条路径的总值相同,都应该返回。然而,该算法仅返回 [0, 1, 2]。我只能假设跳数仍然以某种方式被考虑在内,即使我指定了一个指标,这就是为什么第二条路径被忽略的原因。据我所知,官方文档中没有提到这种行为。
我是否忽略了什么?是否有更好的功能来做到这一点,即使是不同的库?我已经研究过igraph 作为替代方案,但它似乎只能为每个节点对计算一条最短路径。
【问题讨论】:
标签: python algorithm graph shortest-path graph-tool