1. 程式人生 > >根據鄰接矩陣計算各點之間的最短路徑矩陣(ODM也可以)

根據鄰接矩陣計算各點之間的最短路徑矩陣(ODM也可以)

我之前寫過一篇將arcgis的swm檔案處理成為儲存矩陣的文字檔案格式的部落格,得到的是csv檔案。該檔案儲存的空間權重矩陣。csv檔案方便進一步的空間分析。接下分享一下利用存有鄰接矩陣的csv檔案得到最短路徑矩陣(存有任意兩個節點之間的最短路徑)的csv檔案,想獲得一般的ODM也同樣適用。方法用的是Floyd演算法,基於python3,使用pandas和copy模組。

輸入文是一個csv檔案,存有空間鄰接矩陣,1代表相鄰,0代表不相鄰。比如4和2相鄰,4與3不相鄰。


import pandas as pd
import copy

A=pd.read_csv(r'E:\atest\NYC\drug\linjie.csv',index_col=0)
#A是鄰接矩陣,相鄰物件元素為1,不相鄰為0

D=copy.deepcopy(A)
#用於儲存節點對的最短路徑,相鄰的為實際權值(本例為1),不相鄰設定為很大的數(遠大於所有邊的權值,本例設定為999)
ilter=[i for i in range(len(A))]
#o代表起始節點ID,d是終點ID,mid是內插節點
for o in ilter:
    for d in ilter:
        if d==o:
            continue
        if D.iloc[o,d]==0:
            D.iloc[o,d]=999
print("得到矩陣D")
#D初始化完畢


#使用Floyd演算法計算SP

for mid in ilter:
    if mid%10==0:
        print("進度~~%d/%d"%(mid,len(A)))
    for o in ilter:
        for d in ilter:
            if D.iloc[o,mid]!=999 and D.iloc[mid,d]!=999 and D.iloc[o,d]>D.iloc[o,mid]+D.iloc[mid,d]:
                D.iloc[o,d]=D.iloc[o,mid]+D.iloc[mid,d]
                        
D.to_csv(r'E:\atest\NYC\drug\ODM.csv')
得到的最短路徑矩陣如下:

從檔案可以直觀看到0到1的SP為2,0到2的SP為4。
一段簡單的程式碼分享,希望能幫到需要解決相關問題的朋友們。