我正在使用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
--------------
您可以使用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")
显然,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'])
我感谢@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图的直径和最短路径长度的替代方法?