python实现标号法确定最短路径

计量地理学布置了一道作业,通过标号法确定最短路径。老师说用arcgis来实现,但是我想锻炼一下,所以使用python来实现一下这个算法(具体算法可百度)。入门小白,希望路过的大佬多多指教。

在这里插入图片描述


#标号法求最短距离
#权重,字典形式
W = {}
#P列表和T列表
P = []
T = []
#一开始P中只有V1点
P.append([1])
P.append([0,1,0,0,0,0,0,0,0,1])
#T中包含有其余点,第一个只代表T值,由于一开始V1点在P中,因此取0,其他的取较大值,此处取1000
#通过0和1的对比来确定之间互通的两个点
#比如1点通向2,3,4点,那么这四个列表中的第二个值就是1,其余点为0
#列表中的最后一个值代表这个点的编号
T.append([1000,1,1,0,0,0,0,0,2])
T.append([1000,1,1,1,0,0,0,0,3])
T.append([1000,1,0,1,1,0,0,0,4])
T.append([1000,0,0,1,1,1,0,0,5])
T.append([1000,0,1,1,0,1,1,1,6])
T.append([1000,0,1,0,0,1,0,1,7])
T.append([1000,0,0,0,0,0,1,1,8])
#手动输入权值
W['12']=2
W['13']=5
W['14']=3
W['23']=2
W['26']=7
W['27']=4
W['34']=1
W['35']=3
W['36']=5
W['45']=5
W['56']=1
W['58']=7
W['68']=5
W['76']=2
W['78']=3

#传入两个列表参数
def go_through_dict(Plist,Tlist):
    templist = []
    #遍历T列表
    for key,value in enumerate(Tlist):
        #i代表P列表中新加进来元素的最后一个值,即最新确定P值的点的编号
        i = Plist[0][-1]
        #判断是否两点之间可以通向
        if Plist[-1][i] == value[i] :
            a = value[0]
            b = Plist[-1][0] + W['{}{}'.format(i,value[-1])]
            #更改T值
            value[0] = min(a,b)
    for i in range(len(Tlist)):
        templist.append(Tlist[i][0])
    #确定现存T列表中的最小值
    minvalue = min(templist)
    #通过最小值来更新P列表和T列表
    for key, value in enumerate(Tlist):
        if value[0] == minvalue:
            Plist.append(value)
            # temp = key+2
            Plist[0].append(value[-1])
            T.pop(key)
    print(P)

#通过k-1次迭代
for i in range(7):
    print('-------------------第{}次------------------'.format(i+1))
    go_through_dict(P,T)



运行结果

-------------------第1次------------------
[[1, 2], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2]]
-------------------第2次------------------
[[1, 2, 4], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4]]
-------------------第3次------------------
[[1, 2, 4, 3], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3]]
-------------------第4次------------------
[[1, 2, 4, 3, 7], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3], [6, 0, 1, 0, 0, 1, 0, 1, 7]]
-------------------第5次------------------
[[1, 2, 4, 3, 7, 5], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3], [6, 0, 1, 0, 0, 1, 0, 1, 7], [7, 0, 0, 1, 1, 1, 0, 0, 5]]
-------------------第6次------------------
[[1, 2, 4, 3, 7, 5, 6], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3], [6, 0, 1, 0, 0, 1, 0, 1, 7], [7, 0, 0, 1, 1, 1, 0, 0, 5], [8, 0, 1, 1, 0, 1, 1, 1, 6]]
-------------------第7次------------------
[[1, 2, 4, 3, 7, 5, 6, 8], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [2, 1, 1, 0, 0, 0, 0, 0, 2], [3, 1, 0, 1, 1, 0, 0, 0, 4], [4, 1, 1, 1, 0, 0, 0, 0, 3], [6, 0, 1, 0, 0, 1, 0, 1, 7], [7, 0, 0, 1, 1, 1, 0, 0, 5], [8, 0, 1, 1, 0, 1, 1, 1, 6], [9, 0, 0, 0, 0, 0, 1, 1, 8]]

这里面最后应该加一些代码,通过比较方向和大小确定最后的最短路径,有兴趣自尝试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值