scipy.sparse.csgraph.

bellman_ford#

scipy.sparse.csgraph.bellman_ford(csgraph, directed=True, indices=None, return_predecessors=False, unweighted=False)#

使用 Bellman-Ford 演算法計算最短路徑長度。

Bellman-Ford 演算法可以穩健地處理具有負權重的圖形。如果偵測到負環,則會引發錯誤。對於沒有負邊權重的圖形,Dijkstra 演算法可能會更快。

在 0.11.0 版本中新增。

參數:
csgrapharray_like,或稀疏陣列或矩陣,2 維

代表輸入圖形的 N x N 距離陣列。

directedbool,選用

如果為 True (預設值),則在有向圖上尋找最短路徑:僅沿著路徑 csgraph[i, j] 從點 i 移動到點 j。如果為 False,則在無向圖上尋找最短路徑:演算法可以沿著 csgraph[i, j] 或 csgraph[j, i] 從點 i 前進到 j

indicesarray_like 或 int,選用

如果指定,則僅計算從給定索引的點開始的路徑。

return_predecessorsbool,選用

如果為 True,則傳回大小為 (N, N) 的前導矩陣。

unweightedbool,選用

如果為 True,則尋找未加權的距離。也就是說,不是尋找每個點之間權重總和最小化的路徑,而是尋找邊數最小化的路徑。

傳回值:
dist_matrixndarray

圖形節點之間距離的 N x N 矩陣。 dist_matrix[i,j] 給出從點 i 到點 j 沿圖形的最短距離。

predecessorsndarray

僅在 return_predecessors == True 時傳回。前導矩陣的 N x N 矩陣,可用於重建最短路徑。前導矩陣的第 i 列包含從點 i 開始的最短路徑的資訊:每個條目 predecessors[i, j] 給出從點 i 到點 j 的路徑中前一個節點的索引。如果點 i 和 j 之間不存在路徑,則 predecessors[i, j] = -9999

引發:
NegativeCycleError

如果圖形中存在負環

註解

此常式專為具有負邊權重的圖形而設計。如果所有邊權重均為正數,則 Dijkstra 演算法是更好的選擇。

如果有多個有效解,則輸出可能會因 SciPy 和 Python 版本而異。

範例

>>> from scipy.sparse import csr_array
>>> from scipy.sparse.csgraph import bellman_ford
>>> graph = [
... [0, 1 ,2, 0],
... [0, 0, 0, 1],
... [2, 0, 0, 3],
... [0, 0, 0, 0]
... ]
>>> graph = csr_array(graph)
>>> print(graph)
<Compressed Sparse Row sparse array of dtype 'int64'
    with 5 stored elements and shape (4, 4)>
    Coords  Values
    (0, 1)  1
    (0, 2)  2
    (1, 3)  1
    (2, 0)  2
    (2, 3)  3
>>> dist_matrix, predecessors = bellman_ford(csgraph=graph, directed=False, indices=0, return_predecessors=True)
>>> dist_matrix
array([0., 1., 2., 2.])
>>> predecessors
array([-9999,     0,     0,     1], dtype=int32)