欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-22 11:35:39
...

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

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

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


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也可以)

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