networkx:边缘权重作为计算值

时间:2011-05-02 16:31:48

标签: python graph shortest-path networkx

我想用NetworkX库实现最短路径算法。就我而言,我的权重函数从其他边缘属性中获取值。因为权重是一个计算值,我不想将其存储为额外的属性,以避免复杂性,例如其他属性更改时更新值。然而,NetworkX的algorithm API似乎要求权重为边缘数据密钥。

所以我想知道是否有可能不存储价值?我的理想情况是为算法指定自定义权重函数。

2 个答案:

答案 0 :(得分:4)

参数确实需要是边缘属性字典中的键。因此,您需要在字典中设置edge属性以用作权重。在计算最短路径之前,您可以在一个简单的循环中分配它们(如果需要,可以在以后删除它们)。

或者,您可以修改Dijkstra算法代码,以根据其他边缘属性计算您的权重。假设你有一个图形(不是一个多图),它是一个单行的变化。将你的体重公式放在第231行 https://networkx.lanl.gov/trac/browser/networkx/networkx/algorithms/shortest_paths/weighted.py#L231

vw_dist = dist[v] + edgedata.get(weight,1)

答案 1 :(得分:3)

您可以懒惰地计算权重值,但使用属性将其显示为属性。例如:

class Edge(object):

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def get_z(self):
        return self.x + self.y

    z = property(get_z)


e = Edge(3,4)
print e.z

此处e.z似乎是实际存储的值,即Edge对象的属性。但事实并非如此 - 它是按需计算的。您仍然需要使用get_z方法编写更新代码,但这样做的好处是,只要依赖属性发生更改,您就不必担心更新具体值。相反,您只能在被要求时计算它。

如果您担心z的许多访问导致不必要的潜在昂贵计算,那么将此示例扩展为缓存值会很容易。在进行计算之前,getter会检查查找表。这只是memoization