我想用NetworkX库实现最短路径算法。就我而言,我的权重函数从其他边缘属性中获取值。因为权重是一个计算值,我不想将其存储为额外的属性,以避免复杂性,例如其他属性更改时更新值。然而,NetworkX的algorithm API似乎要求权重为边缘数据密钥。
所以我想知道是否有可能不存储价值?我的理想情况是为算法指定自定义权重函数。
答案 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。