gpt4 book ai didi

python - 如何让networkx shortest_path() 支持自定义权重函数?

转载 作者:行者123 更新时间:2023-11-28 18:51:23 26 4
gpt4 key购买 nike

在网络中,

shortest_path(G, source=None, target=None, weight=None)  
# weight/distance/cost 1 by default

可以支持边属性“权重”作为运算符来计算图中两个节点之间的最短路径。

但是,如果我有其他元类附加到节点/边缘,例如:

class meta( object ):
def __init__( self, weight_shift = 1 ):
self.weight_shift = weight_shift

G.add_node('A', meta_data = meta( weight_shift = 100 ) )
G.add_node('B', meta_data = meta( weight_shift = 200 ) )
G.add_node('C')
...
G.add_edge("A", "C", weight=10, meta_data = meta( weight_shift = -5 ))
G.add_edge("B", "C", weight=10, meta_data = meta( weight_shift = -10 ))
G.add_edge("A","B")

是否可以定义一个函数作为 shortest_path() 的权重参数?

def weight_sum():
...

可以在“运行时”计算“权重”,例如使用逻辑:

weight_sum = edge.weight + edge.meta.weight_shift + node_left.meta.weight_shift + node_right.meta.weight_shift

然后

shortest_path(G, source="A", target="B", weight=weight_sum())

求最短路径?

谢谢。

最佳答案

NetworkX 中的当前实现是不可能的。

两个选项是:

1) 在最短路径搜索处理所有边之前,根据您的权重函数添加新的边属性。使用该属性作为 shortest_path() 的“权重”参数

2) 替换像

这样的行
vw_dist = dist[v] + edgedata.get(weight,1)

在 Dijkstra 算法的代码中使用您的自定义函数来计算边权重,而不是获取“权重”属性。

关于python - 如何让networkx shortest_path() 支持自定义权重函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com