當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python NetworkX bellman_ford_predecessor_and_distance用法及代碼示例


本文簡要介紹 networkx.algorithms.shortest_paths.weighted.bellman_ford_predecessor_and_distance 的用法。

用法:

bellman_ford_predecessor_and_distance(G, source, target=None, weight='weight', heuristic=False)

計算加權圖中最短路徑的最短路徑長度和前導。

該算法的運行時間為 ,其中 是節點數, 是邊數。它比 Dijkstra 慢,但可以處理負邊權重。

如果檢測到負循環,您可以使用 find_negative_cycle() 返回循環並檢查它。當存在負循環時,不會定義最短路徑,因為一旦達到,路徑可以永遠循環以建立任意低的權重。

參數

GNetworkX 圖

該算法適用於所有類型的圖,包括有向圖和多重圖。

source: node label

路徑的起始節點

target節點標簽,可選

路徑的結束節點

weight字符串或函數

如果這是一個字符串,則將通過帶有此鍵的邊屬性訪問邊權重(即,連接 uv 的邊的權重將為 G.edges[u, v][weight] )。如果不存在這樣的邊屬性,則假設邊的權重為 1。

如果這是一個函數,則邊的權重是函數返回的值。該函數必須準確地接受三個位置參數:一條邊的兩個端點和該邊的邊屬性字典。該函數必須返回一個數字。

heuristicbool

確定是否使用啟發式方法以希望可以忽略不計的成本及早檢測負循環。

返回

pred, dist字典

將節點鍵控的兩個字典分別返回到路徑中的前任和到源的距離。

拋出

NodeNotFound

如果 source 不在 G 中。

NetworkXUnbounded

如果 (di) 圖包含負 (di) 循環,則算法會引發異常以指示存在負 (di) 循環。注意:無向圖中的任何負權邊都是負循環。

注意

邊權重屬性必須是數字。距離計算為遍曆的加權邊的總和。

返回的字典僅具有可從源訪問的節點的鍵。

在(di)圖不連通的情況下,如果不包含源的組件包含負(di)循環,則不會被檢測到。

在 NetworkX v2.1 及更早版本中,源節點具有前任 [None] 。在 NetworkX v2.2 中,這更改為具有前任 [] 的源節點

例子

>>> G = nx.path_graph(5, create_using=nx.DiGraph())
>>> pred, dist = nx.bellman_ford_predecessor_and_distance(G, 0)
>>> sorted(pred.items())
[(0, []), (1, [0]), (2, [1]), (3, [2]), (4, [3])]
>>> sorted(dist.items())
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
>>> pred, dist = nx.bellman_ford_predecessor_and_distance(G, 0, 1)
>>> sorted(pred.items())
[(0, []), (1, [0]), (2, [1]), (3, [2]), (4, [3])]
>>> sorted(dist.items())
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
>>> G = nx.cycle_graph(5, create_using=nx.DiGraph())
>>> G[1][2]["weight"] = -7
>>> nx.bellman_ford_predecessor_and_distance(G, 0)
Traceback (most recent call last):
    ...
networkx.exception.NetworkXUnbounded: Negative cycle detected.

相關用法


注:本文由純淨天空篩選整理自networkx.org大神的英文原創作品 networkx.algorithms.shortest_paths.weighted.bellman_ford_predecessor_and_distance。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。