2011-05-02 189 views
2

我想用NetworkX庫實現最短路徑算法。在我的情況下,我的權重函數從其他邊緣屬性導出值。因爲weight是一個計算值,所以我不想將它作爲一個額外的屬性來存儲,以避免複雜性,例如當其他屬性改變時更新該值。然而,NetworkX的algorithm API似乎要求權重是邊緣數據密鑰。networkx:邊緣權重作爲計算值

所以我想知道是否有可能不存儲的價值?我的理想情況是爲算法指定一個自定義權重函數。

+1

如果你打算使用NetworkX內置的方法,我想你堅持存儲的值,然後更新它基於其他屬性的值。 – JoshAdel 2011-05-02 16:46:07

回答

4

該參數確實需要是邊緣屬性字典中的關鍵字。因此,您需要在字典中設置邊緣屬性以用作權重。您可以在計算最短路徑之前以簡單的循環方式指定這些路徑(如果需要,稍後再刪除它們)。

或者,您可以修改Dijkstra算法代碼以從其他邊屬性計算您的權重。假設你有一個圖(不是多圖),它是一個單行的變化。把你的體重公式線231 https://networkx.lanl.gov/trac/browser/networkx/networkx/algorithms/shortest_paths/weighted.py#L231

vw_dist = dist[v] + edgedata.get(weight,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方法中編寫更新代碼,但是這樣做的好處是,無論何時從屬屬性發生更改時,您都不必擔心更新具體值。相反,只有在需要時才計算。

如果您擔心導致不必要的潛在昂貴計算的許多訪問,可能很容易將此示例擴展到緩存值。在進行計算之前,getter會檢查查找表。這只是memoization

+0

對於NetworkX,它看起來像最短路徑函數需要該參數是與邊相關的字典的關鍵名稱([documentation](http://networkx.lanl.gov/tutorial/tutorial.html#添加的屬性到圖形節點和 - 邊))。雖然可以使用任意對象作爲邊緣,但我無法弄清楚如何使最短路徑函數使用邊緣對象屬性來計算權重值。 – ejel 2011-05-02 23:45:11