当前位置: 首页 > 知识库问答 >
问题:

networkx是否有一个函数来计算考虑权重的路径长度?

窦涵忍
2023-03-14

我正在使用networkx计算k最短的简单路径。nx.shortest_simple_paths(G,源,目标,权重=权重)返回成本递增顺序的路径列表(考虑权重的累积路径长度)。

我有兴趣获得这些路径的成本。networkX中是否有任何简单的函数来获得这个?

这个问题类似于这个问题:Networkx中是否已经实现了返回路径长度和路径的算法?。

我相信在那篇帖子里贴出的答案是错误的。如何添加自定义函数来计算图形中的边权重?我提出了以下解决方案(见下文)。

这是正确的方法吗?

networkx库中是否有简单的可用内容?

我的目标是求k-最短路径的代价。

G = nx.Graph()   # or DiGraph, MultiGraph, MultiDiGraph, etc
G.add_edge('a', 'b', weight=2)
G.add_edge('b', 'c', weight=4)
G.add_edge('a', 'c', weight=10)
G.add_edge('c', 'd', weight=6)
G.size()

def path_length(G, nodes, weight):
    w = 0
    for ind,nd in enumerate(nodes[1:]):
        prev = nodes[ind]
        w += G[prev][nd][weight]
    return w

for path in nx.shortest_simple_paths(G, 'a', 'd', weight='weight'):
    print(path, len(path)) # wrong approach
    print(path, path_length(G,path,'weight')) # correct solution
    print("--------------")

这将输出以下内容:

['a', 'b', 'c', 'd'] 4
['a', 'b', 'c', 'd'] 12
--------------
['a', 'c', 'd'] 3
['a', 'c', 'd'] 16
--------------

共有3个答案

于捷
2023-03-14

您可以使用path\u weight(G,path,weight=“weight”)如下所示:

from networkx.algorithms.shortest_paths.generic import shortest_path
from networkx.classes.function import path_weight

path = shortest_path(G, source=source, target=target, weight="weight")
path_length = path_weight(G, path, weight="weight")
汪耀
2023-03-14

显然,NetworkX中尚未实现k_最短路径功能,尽管需求并不新鲜,您可以在web上找到一些实现Yen算法的尝试。

您的问题的(非常)粗略的解决方案可以是:

def k_shortest_path(G, source, target, k):
    def path_cost(G, path):
        return sum([G[path[i]][path[i+1]]['weight'] for i in range(len(path)-1)])
    return sorted([(path_cost(G,p), p) for p in nx.shortest_simple_paths(G, source,target,weight='weight') if len(p)==k])[0]

对于此类图形:

import networkx as nx

G = nx.Graph()

G.add_edge('a', 'b', weight=2)
G.add_edge('b', 'c', weight=4)
G.add_edge('a', 'c', weight=10)
G.add_edge('c', 'd', weight=6)
G.add_edge('b', 'd', weight=2)
G.add_edge('b', 'e', weight=5)
G.add_edge('e', 'f', weight=8)
G.add_edge('d', 'f', weight=8)

打电话:

k_shortest_path(G, 'a', 'f', 4)

返回:

(12, ['a', 'b', 'd', 'f'])
东方化
2023-03-14

我感谢@SENTION和@nbeuchat的解决方案。然而,如果你有一个大的图,@SENTION的解决方案需要花费很多时间,而nbeuchat的解决方案不提供k-最短路径。我合并了他们的解决方案,得到了更快的具有路径长度的k-最短简单路径。

import networkx as nx

G = nx.Graph()

G.add_edge('a', 'b', weight=2)
G.add_edge('b', 'c', weight=4)
G.add_edge('a', 'c', weight=10)
G.add_edge('c', 'd', weight=6)
G.add_edge('b', 'd', weight=2)
G.add_edge('b', 'e', weight=5)
G.add_edge('e', 'f', weight=8)
G.add_edge('d', 'f', weight=8)

from itertools import islice
from networkx.classes.function import path_weight

def k_shortest_paths(G, source, target, k, weight=None):
    return list(islice(nx.shortest_simple_paths(G, source, target, weight='weight'), k))

for path in k_shortest_paths(G, 'a','f', 3):
    print(path, path_weight(G, path, weight="weight"))
 类似资料:
  • 如何计算路径的平均路径长度是一个,或两个在networkx?例如,在下面的图表中,平均路径长度等于一是6,二是2。

  • 我正在做一个平板游戏。跳跃和移动都很有效,现在我想对碰撞进行编程。我有一种想法,这将如何工作: 我不确定这个问题应该在这里还是在游戏开发网站上。 > 每一帧,我首先得到输入。动量根据按下的键增加和/或增加(例如:

  • 我在Spring Boot应用程序中使用React Axios进行API调用。 我的应用程序上下文路径是test 当我在浏览器中启动应用程序时,http://localhost:8080/test,反应页面呈现。在页面呈现中,我正在调用服务 因此,预期调用应为http://localhost:8080/test/api/events,因为test是上下文根。但是,API调用中添加了测试。 只是打电

  • 例如,给定以下矩阵: 其中对于每个元组,第一个数字是食物,第二个数字是水。我需要从右下角到左上角,我只能向上或向左移动。

  • 我有一个由未加权边构建的图(a),我想计算主图(a)中最大连通图(giantC)的平均最短路径长度。但是,到目前为止,该脚本已经运行了3个多小时(在Colab和本地进行了尝试),对于和都没有输出任何结果。 我使用的是, 这是我的剧本 有没有办法让它更快?或者是计算giantC图的直径和最短路径长度的替代方法?