如何使networkx shortest_path()可以支持self_defined权重函数?

时间:2012-09-16 18:11:21

标签: python graph metadata networkx

在networkx中,

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())

获得最短路径?

感谢。

1 个答案:

答案 0 :(得分:1)

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

有两个选项:

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

的'weight'参数

2)替换

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

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