图与网络优化--dijkstra算法

在这里插入图片描述
给定赋权有向图D=(V, A),求V1-V8的最短路径。
 开始(i=0)给 Vs 以 P标号, 即P(Vs)=0, λ(Vs)=0;其余各点均给T标号,即对每一 个V≠Vs,T(V)=+∞,λ(V)=M。令S0={Vs}
 ① 如果Si=V,算法终止,这时,对每个 V∈Si,d(Vs,V)=P(V);否则转入②。
 ② 若Vk为刚获得P标号的点,考查每个使 (Vk,Vj)∈A且Vj不属于Si的点Vj。如果T(Vj) > P(Vk)+wkj ,则将T(Vj)修改 为 P(Vk)+wkj,令λ(Vj )=k 。
 ③ 令T(Vj)=min{T(Vj)}(Vj不属于Si)。 如果T(Vj)<+∞,则把的T标号变为P标号, 令Si+1=Si U {Vj},把i换成i+1,转入①; 否 则 终 止 , 这 时 对 每 一 个 v∈Si , d(Vs,v)=P(V), 而 对 每 一 个V不属于Si, d(Vs,V)=T(V)。

import numpy as np

dismat = np.array([[0,6,3,1,0,0,0,0,0],
                   [0,0,0,0,1,0,0,0,0],
                   [0,2,0,2,0,0,0,0,0],
                   [0,0,0,0,0,10,0,0,0],
                   [0,0,0,6,0,4,3,6,0],
                   [0,0,0,0,10,0,2,0,0],
                   [0,0,0,0,0,0,0,4,0],
                   [0,0,0,0,0,0,0,0,0],
                   [0,0,0,0,2,0,0,3,0]])

p = [-1 for i in range(dismat.shape[0])]     #起始点到各点的最短距离
PT = ['T' for i in range(dismat.shape[0])]   #各点的标号
λ = [-1 for i in range(dismat.shape[0])]     #最短路中各点至前一个点的最短路
T = [float("inf") for i in range(dismat.shape[0])]    #各点的T标号值
s = []                                       #具P标号的点的集合
p[0] = 0                                     # 0为第一个获得P标号的点
PT[0] = 'P'
λ[0] = 0
T[0] = 0
s.append(0)
while len(s) != 9:
    for k in s:
        for i in range(len(dismat[k])):
            if dismat[k][i] != 0 and i not in s:
                if T[i] > p[k] + dismat[k][i]:
                    T[i] = p[k] + dismat[k][i]
                    λ[i] = k
    minVal = float("inf")
    for i in range(len(T)):
        if PT[i] != 'P' and T[i] < minVal:
            minVal = T[i]
    PT[T.index(minVal)] = 'P'
    p[T.index(minVal)] = minVal
    s.append(T.index(minVal))
print(p)
print(λ)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值