我要计算一个图中所有对之间的所有最短路径。为了实现这一点,我对图中的每个节点对使用graph_tool的所有最短路径函数。根据文档,如果给定,函数可以考虑边缘权重。乍一看,这个很好。然而,我发现返回的最短路径列表不完整。它似乎只包括最短路径,而最短路径也使用最短路径集中最少的跳数。在
下面是一个小例子: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条路径,如下所示:
^{pr2}$
显然,在跳数方面,路径[0,1,2]比[0,4,3,2]短。如果没有给出度量,则可以正确识别(此处未演示)。在
在本例的开头,边以这样一种方式加权,即具有更多跳数的第二条路径“更短”。度量值之和为6,而另一条路径的总值为7。因此,算法正确返回[0,4,3,2]。在
然后,0和4之间的边的度量增加1。现在这两个路径的总值相同,应该都返回。但是,算法只返回[0,1,2]。尽管我指定了一个度量,但我只能假设跳跃计数仍然被考虑在内,这就是第二条路径被忽略的原因。据我所见,官方文件中没有提到这种行为。在
我是不是忽略了什么?是否有更好的函数来实现这一点,即使使用不同的库?我已经研究过igraph作为一种替代方案,但它似乎只能够计算每个节点对的一条最短路径。在