shortest_path#
- scipy.sparse.csgraph.shortest_path(csgraph, method='auto', directed=True, return_predecessors=False, unweighted=False, overwrite=False, indices=None)#
在正向有向或無向圖上執行最短路徑圖搜尋。
在 0.11.0 版本中新增。
- 參數:
- csgrapharray_like,或稀疏陣列或矩陣,2 維
代表輸入圖的 N x N 距離陣列。
- method字串 [‘auto’|’FW’|’D’],選用
用於最短路徑的演算法。選項為
- ‘auto’ – (預設) 根據輸入資料選擇 ‘FW’、‘D’、‘BF’ 或 ‘J’ 中最佳的。
基於輸入資料。
- ‘FW’ – Floyd-Warshall 演算法。
計算成本約為
O[N^3]
。輸入 csgraph 將轉換為密集表示法。- ‘D’ – Dijkstra 演算法搭配費氏堆積。
計算成本約為
O[N(N*k + N*log(N))]
,其中k
是每個節點的平均連接邊數。輸入 csgraph 將轉換為 csr 表示法。- ‘BF’ – Bellman-Ford 演算法。
當權重為負數時,可以使用此演算法。如果遇到負環,將會引發錯誤。計算成本約為
O[N(N^2 k)]
,其中k
是每個節點的平均連接邊數。輸入 csgraph 將轉換為 csr 表示法。- ‘J’ – Johnson 演算法。
與 Bellman-Ford 演算法類似,Johnson 演算法設計用於權重為負數的情況。它結合了 Bellman-Ford 演算法和 Dijkstra 演算法,以實現更快的計算速度。
- directed布林值,選用
如果為 True (預設),則在有向圖上尋找最短路徑:僅沿著路徑 csgraph[i, j] 從點 i 移動到點 j。如果為 False,則在無向圖上尋找最短路徑:演算法可以沿著 csgraph[i, j] 或 csgraph[j, i] 從點 i 進行到點 j
- return_predecessors布林值,選用
如果為 True,則傳回大小為 (N, N) 的前導矩陣。
- unweighted布林值,選用
如果為 True,則尋找無權重距離。也就是說,與其尋找每個點之間權重總和最小化的路徑,不如尋找邊數最小化的路徑。
- overwrite布林值,選用
如果為 True,則以結果覆寫 csgraph。這僅在 method == ‘FW’ 且 csgraph 是具有 dtype=float64 的密集、c 順序陣列時適用。
- indicesarray_like 或 int,選用
如果指定,則僅計算從給定索引的點開始的路徑。與 method == ‘FW’ 不相容。
- 傳回值:
- 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
如果圖中存在負環
注意事項
如同目前實作的方式,當 directed == False 時,Dijkstra 演算法和 Johnson 演算法不適用於具有方向相依距離的圖。亦即,如果 csgraph[i,j] 和 csgraph[j,i] 是不相等的邊,則 method=’D’ 可能會產生不正確的結果。
如果有多個有效的解決方案,則輸出可能會因 SciPy 和 Python 版本而異。
範例
>>> from scipy.sparse import csr_array >>> from scipy.sparse.csgraph import shortest_path
>>> 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 = shortest_path(csgraph=graph, directed=False, indices=0, return_predecessors=True) >>> dist_matrix array([0., 1., 2., 2.]) >>> predecessors array([-9999, 0, 0, 1], dtype=int32)