根据邻接矩阵计算各点之间的最短路径矩阵(ODM也可以)

我之前写过一篇将arcgis的swm文件处理成为保存矩阵的文本文件格式的博客,得到的是csv文件。该文件保存的空间权重矩阵。csv文件方便进一步的空间分析。接下分享一下利用存有邻接矩阵的csv文件得到最短路径矩阵(存有任意两个节点之间的最短路径)的csv文件,想获得一般的ODM也同样适用。方法用的是Floyd算法,基于python3,使用pandas和copy模块。

输入文是一个csv文件,存有空间邻接矩阵,1代表相邻,0代表不相邻。比如4和2相邻,4与3不相邻。

根据邻接矩阵计算各点之间的最短路径矩阵(ODM也可以)_第1张图片


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')
得到的最短路径矩阵如下:

根据邻接矩阵计算各点之间的最短路径矩阵(ODM也可以)_第2张图片

从文件可以直观看到0到1的SP为2,0到2的SP为4。
一段简单的代码分享,希望能帮到需要解决相关问题的朋友们。

你可能感兴趣的:(根据邻接矩阵计算各点之间的最短路径矩阵(ODM也可以))