使用Matlab、Python两种语言实现Dijkstra算法

使用Matlab、Python两种语言实现Dijkstra算法

迪杰斯特拉算法(Dijkstra algorithm)是一种采用贪心算法策略的经典算法,由荷兰计算机科学家狄克斯特拉提出,用于解决(有向或无向)带权图中最短路径问题。迪杰斯特拉算法主要特点是从起点开始,采用每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。在城市规划、路径选择等现实问题中该算法都有很广泛的应用场景。本文主要讨论迪杰斯特拉算法在单源最短路径问题中的具体实现。

算法简介

基本原理

① 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。

② 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。

③ 初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 … 重复该操作,直到遍历完所有顶点。

主要包含有如下几个操作:
① 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为”起点s到该顶点的距离”[例如,U中顶点v的距离为(s, v)的长度,然后s和v不相邻,则v的距离为∞]。

② 从U中选出”距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k。

③ 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s, v)的距离可能大于(s, k)+(k, v)的距离。

④ 重复步骤②和③,直到遍历完所有顶点。

推荐阅读:清华大学出版社《数据结构(C语言版)》7.6 最短路径
推荐观看:https://www.bilibili.com/video/BV1uX4y137Hf?t=941

算法步骤及流程图

  • 定义一个矩阵或二维数组用于存储邻接图中的数据,记为a, a[i][j]表示点 Vi 到 Vj 的到达状态,若可直接到达,则初始化为该两点边上的权值,否则为∞。注意到,对于无向图,邻接矩阵为对称阵;而对于有向图则不一定为对称阵
  • 定义dijkstra函数,传入参数为已定义的邻接矩阵vector和始点编号start
  • 定义visit数组记录各点的访问状态,V[i] 为1表示点 Vi 已被访问, 为0表示还未被访问,除始点外,均初始化为0
  • 定义dist数组存储起始点到其他各点的最短路径,dist[i]表示始点到 Vi 的最短路径,对dist[i]不断更新,以达到求出最短路径的目的。
  • 遍历各点寻找当前未被访问的顶点距始点最近的点,记为middle,相应距离为min_dist
  • 对于未被访问的某一个dist[k], 若 dist[k] > dist[middle] + vector[middle][k],则将dist[k]更新为dist[middle] + vector[middle][k]
  • 当所有点都被访问后,算法结束

算法流程图:

在这里插入图片描述

实例分析

任务

现有如图所示的数据:

任务一:以二维数组的形式定义该图,若两点之间不存在直达路径则权重定义为无穷大

任务二:
以该图为数据书写迪杰斯特拉算法,并输出:
① 以v0为起点,到达其他顶点的最短路径,若没有则输出-1;
② 以v1为起点,到达其他顶点的最短路径,若没有则输出-1;

实现

Python实现

源代码

任务一:

先用二维数组定义邻接图

import numpy as np

# 任务一:以二维数组的形式定义原数据图
a = np.zeros((6, 6))
a[0][0] = 0
a[0][1] = float('inf')
a[0][2] = 10
a[0][3] = float('inf')
a[0][4] = 30
a[0][5] = 100
a[1][0] = float('inf')
a[1][1] = 0
a[1][2] = 5
a[1][3] = float('inf'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值