查找 NetworkX 中所有节点对之间的所有最短路径

Posted

技术标签:

【中文标题】查找 NetworkX 中所有节点对之间的所有最短路径【英文标题】:Find all shortest paths between all pairs of nodes in NetworkX 【发布时间】:2021-11-30 23:58:55 【问题描述】:

我试图在无向未加权图中获取所有节点对之间的所有最短路径。我目前正在使用nx.all_pairs_shortest_path(),但我不明白为什么它只为每对节点返回一个最短路径。我的图中有循环,因此某些节点之间应该存在多条最短路径。有什么建议吗?

【问题讨论】:

“但我不明白为什么它只为每对节点返回一个最短路径” 因为这就是这个函数的作用。它为每对节点找到一条最短路径。 另外,这可能不是这里的情况,但可能在图中有一个循环,但每对节点的最短路径不超过一个。例如,任何具有奇数个节点的循环图对于每对节点都有唯一的最短路径。 【参考方案1】:

我可能迟到了,但我刚刚遇到了同样的问题,这是我的解决方案:

 def all_shortest_paths(G):
    a = list(nx.all_pairs_shortest_path(G))
    all_sp_list = []
    for n in range(len(G.nodes)):
      a1 = a[n][1]
      for k,v in a1.items():
        all_sp_list.append(len(v))
    return all_sp_list

我尝试的所有其他方法都变得非常慢,因为我的图表有一堆节点,所以这是我最快的解决方案。

【讨论】:

就我而言,我只需要最短路径长度来绘制直方图。如果你想要最短路径数据,你将不得不 tweek 代码。【参考方案2】:

遍历图中的所有节点:

results = []
for n1 in G.nodes():
    for n2 in G.nodes():
        shortest_path = nx.single_source_dijkstra(G, source=n1, target=n2, weight=f)
        results.append(shortest_path)
        

【讨论】:

以上是关于查找 NetworkX 中所有节点对之间的所有最短路径的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用networkx查找两个节点之间的距离(欧几里得)

python networkx 都可以干啥

减少networkx中图的节点/边数

Python:获取所有节点的度数,然后在networkx中绘制箱线图

如何用networkx绘制社区

Floyd-Warshall:所有最短路径