根據鄰接矩陣計算各點之間的最短路徑矩陣(ODM也可以)
阿新 • • 發佈:2019-02-18
我之前寫過一篇將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。
一段簡單的程式碼分享,希望能幫到需要解決相關問題的朋友們。