我有这个节点列表,我想获得最小路径,因为我有负重的节点必须使用Bellman Ford,我使用的是networkx库,但是我没有得到打印路径的表单,这是具有权重的节点列表和我正在使用的命令
1 10 {'weight': 96}
1 13 {'weight': 97}
2 11 {'weight': -70}
2 13 {'weight': 77}
3 12 {'weight': 30}
3 13 {'weight': -30}
4 10 {'weight': 17}
4 14 {'weight': -75}
5 11 {'weight': -4}
5 14 {'weight': 45}
6 12 {'weight': -67}
6 14 {'weight': 63}
7 10 {'weight': 38}
7 15 {'weight': -40}
8 11 {'weight': -30}
8 15 {'weight': -46}
9 12 {'weight': 37}
9 15 {'weight': -97}
assert_raises(nx.NetworkXUnbounded,nx.bellman_ford,G_Bellman_Ford,1)
G_Bellman_Ford是图表
答案 0 :(得分:1)
In [1]: import networkx as nx
In [2]: edges ="""1 10 {'weight': 96}
1 13 {'weight': 97}
2 11 {'weight': -70}
2 13 {'weight': 77}
3 12 {'weight': 30}
3 13 {'weight': -30}
4 10 {'weight': 17}
4 14 {'weight': -75}
5 11 {'weight': -4}
5 14 {'weight': 45}
6 12 {'weight': -67}
6 14 {'weight': 63}
7 10 {'weight': 38}
7 15 {'weight': -40}
8 11 {'weight': -30}
8 15 {'weight': -46}
9 12 {'weight': 37}
9 15 {'weight': -97}"""
In [3]: lines = edges.split('\n')
In [4]: G = nx.parse_edgelist(lines, nodetype = int, create_using=nx.DiGraph())
In [5]: nx.bellman_ford(G,1)
Out[5]: ({1: None, 10: 1, 13: 1}, {1: 0, 10: 96, 13: 97})
答案 1 :(得分:0)
对于你的问题,要从nx.bellman_ford()打印路径,只需按照Aric的答案,但更新最后一个语句。
pred, dist = nx.bellman_ford(G,1)
定义将返回前趋转换为路径的函数
def predecessors_to_path(pred, source, target):
path = []
curr = target
while curr != source:
path.append(curr)
curr = pred[curr]
path.append(source)
path.reverse()
return path
要获取路径表单,只需转换格式
即可
>>> print(predecessors_to_path(pred,1,10))
[1, 10]