scipy.sparse.csgraph.
floyd_warshall#
- scipy.sparse.csgraph.floyd_warshall(csgraph, directed=True, return_predecessors=False, unweighted=False, overwrite=False)#
使用 Floyd-Warshall 演算法計算最短路徑長度
在版本 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
- return_predecessorsbool,選用
若為 True,則傳回大小為 (N, N) 的前導矩陣。
- unweightedbool,選用
若為 True,則尋找未加權的距離。也就是說,不是尋找每個點之間權重總和最小化的路徑,而是尋找邊數最小化的路徑。
- overwritebool,選用
若為 True,則使用結果覆寫 csgraph。這僅適用於 csgraph 是具有 dtype=float64 的密集、c 順序陣列。
- 傳回:
- dist_matrixndarray
圖形節點之間距離的 N x N 矩陣。dist_matrix[i,j] 給出沿圖形從點 i 到點 j 的最短距離。
- predecessorsndarray
僅在 return_predecessors == True 時傳回。前導矩陣為 N x N 大小,可用於重建最短路徑。前導矩陣的第 i 列包含從點 i 出發的最短路徑資訊:每個條目前導矩陣[i, j] 給出從點 i 到點 j 的路徑中前一個節點的索引。如果點 i 和 j 之間不存在路徑,則前導矩陣[i, j] = -9999
- 引發:
- NegativeCycleError
如果圖形中存在負循環
註解
如果存在多個有效的解決方案,則輸出可能因 SciPy 和 Python 版本而異。
範例
>>> from scipy.sparse import csr_array >>> from scipy.sparse.csgraph import floyd_warshall
>>> 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 = floyd_warshall(csgraph=graph, directed=False, return_predecessors=True) >>> dist_matrix array([[0., 1., 2., 2.], [1., 0., 3., 1.], [2., 3., 0., 3.], [2., 1., 3., 0.]]) >>> predecessors array([[-9999, 0, 0, 1], [ 1, -9999, 0, 1], [ 2, 0, -9999, 2], [ 1, 3, 3, -9999]], dtype=int32)