Dijkstra(迪杰斯特拉)算法通过实例描述+证明+python3实现

本文深入解析Dijkstra算法的步骤及证明,并通过Python代码实现寻找最短路径的过程。使用numpy进行矩阵操作,通过具体实例展示如何从起点到终点找到距离最短的路径。
  1. Dijkstra算法步骤
    以一个具体的例子为例:在这里插入图片描述在这里插入图片描述在这里插入图片描述
  2. Dijkstra证明
    在这里插入图片描述在这里插入图片描述
import numpy as np


def add_set(s,v,u): #s代表已经访问过结点的集合,V表示全部结点集合
    for i in u:
        s.add(i[1])
    s_=v-s
    return s_

def add_path(t1,t2,b):
    for a_ in b:
        i = a_[0]
        j = a_[1]
        a = a_[2]
        t=t1[i].copy()
        t.append(j)
        t1.append(t)
        t2.append(a)

def dijkstra(s,v,s_,dist_mat,i2,t1,t2): #t1里面记录了每一条可能路径,t2记录每一条路径的距离
    while i2 not in s:
        min=1000
        b=[] #把每次试探结果装起来
        for i in range(len(t1)): # 遍历路径集里第i条路径
            for j in s_: # 遍历s_里面每一个的结点 weight(t[i][-1],j)
                a=t2[i]+dist_mat[(t1[i][-1]-1),j-1]
                if a<min:
                    min=a # 找到最小距离
                a_=(i,j,a)
                b.append(a_)
        b=[x for x in b if x[2]==min]
        add_path(t1,t2,b)
        s_=add_set(s,v,b)
    a=[(x,t2[i]) for i, x in enumerate(t1) if x[-1]==i2]
    return a






a = float('inf')
dist_mat = np.array([[0, 3, 5, 3, a, a, a, a, a, a], [3, 0, a, a, 3, 6, a, a, a, a], [5, a, 0, 4, 2, a, 6, a, a, a],
                     [3, a, 4, 0, a, 8, a, a, a, a], [a, 3, 2, a, 0, a, a, 7, 3, a], [a, 6, a, 4, a, 0, 8, 5, a, 3],
                     [a, a, 6, a, a, 8, 0, a, 2, a], [a, a, a, a, 7, 5, a, 0, a, 2], [a, a, a, a, 3, a, 2, a, 0, 2],
                     [a, a, a, a, a, 3, a, 2, 2, 0]])  # 距离矩阵
t1=[[0]]
t2=[0]
i1=int(input('请输入开始点下标:'))
i2=int(input('请输入结束点下标: '))
t1[0][0]=i1 # 初始化第一条路径
S={i1} #初始化已遍历点集
V={1,2,3,4,5,6,7,8,9,10} # 初始化全集所有结点
S_=V-S
m=dijkstra(S,V,S_,dist_mat,i2,t1,t2)
print('最短路径的距离为:',m[0][-1])
print('最短路径为:')
for x in m:
    for i in x[0]:
        if i==x[0][-1]:
            print(str(i))
        else:
            print('{}-->'.format(i), end='')

输出结果:
请输入开始点下标:1
请输入结束点下标: 10
最短路径的距离为: 11.0
最短路径为:
1-->2-->5-->9-->10

参考博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值