这里写目录标题

  • 一、算法原理
  • 二、MATLAB实现
  • 三、参考文献

一、算法原理

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止
以下图为例,首先介绍Dijstra的原理。

红字为各结点的编号,黑字为各结点之间的距离。

  1. 首先定义几个变量:
    节点个数nnn;
    二维矩阵W(n×n)W(n×n)W(n×n):距离(权值)矩阵。连通的结点间即为距离,不连通的结点间为正无穷(InfInfInf),和自己的距离为0;
    一维矩阵visit(1×n)visit(1×n)visit(1×n):访问矩阵。若第iii个节点已找到最短路径,则visit(i)=0visit(i)=0visit(i)=0,否则等于1,对于初始节点,visit=0visit=0visit=0;
    距离矩阵d(1×n)d(1×n)d(1×n):若第iii个节点已找到最短路径,则d(i)d(i)d(i)为这条路径的距离,否则为0,初始节点d=0d=0d=0;
    上一节点矩阵path(1×n)path(1×n)path(1×n):若第iii个节点找到了最短路径,则pathpathpath存放这一条最短路径的前一个节点,通过对每一节点的回溯,可以找到最短路径。
  2. 根据距离写出以下距离矩阵W=[063infinfinf6025infinf32034infinf53023infinf4205infinfinf350]W=\begin{bmatrix} 0 & 6 & 3 & inf & inf & inf \\ 6 & 0 & 2 & 5 & inf & inf \\ 3 & 2 & 0 & 3 & 4 & inf \\ inf & 5 & 3 & 0 & 2 & 3 \\ inf & inf & 4 & 2 & 0 & 5 \\ inf & inf & inf & 3 & 5 & 0 \\ \end{bmatrix} W=⎣⎢⎢⎢⎢⎢⎢⎡​063infinfinf​6025infinf​32034inf​inf53023​infinf4205​infinfinf350​⎦⎥⎥⎥⎥⎥⎥⎤​
  3. 确定初始点为v1v_1v1​,则visit(1)=0visit(1)=0visit(1)=0;
    在图中,结点上,我们将已找到最短路径的点标为它的最短距离,(可以理解为v1v_1v1​点已找到最短路径,距离为0),未找到的其余点表为正无穷(即表示不连通)。

    在与v1v_1v1​连通的点中,即在矩阵WWW的第1行,寻找最小值,最小值所在列即确定的最短路径的节点,此时v3v_3v3​最短,visit(3)=0visit(3)=0visit(3)=0,d(3)=3d(3)=3d(3)=3,对于已找到最短路径的v3v_3v3​上一节点为v1v_1v1​,path(3)=1path(3)=1path(3)=1

    接着,在
    与v1v_1v1​连通的,且未找到最短距离的节点的距离,以及
    与v3v_3v3​连通的,且未找到最短距离节点的距离+v3v_3v3​的最短距离
    以上两种中寻找最短距离,最短为v2v_2v2​,visit(2)=0visit(2)=0visit(2)=0,d(2)=5d(2)=5d(2)=5,path(2)=3path(2)=3path(2)=3

    重复以上步骤,在
    与v1v_1v1​连通的,且未找到最短距离的节点的距离
    与v3v_3v3​连通的,且未找到最短距离节点的距离+v3v_3v3​的最短距离
    与v2v_2v2​连通的,且未找到最短距离节点的距离+v2v_2v2​的最短距离
    以上三种中寻找最短路径,最短为v4v_4v4​,visit(4)=1visit(4)=1visit(4)=1,d(4)=6d(4)=6d(4)=6,path(4)=3path(4)=3path(4)=3

    我们可以发现,所要寻找的最短路径即为对于已找到最短路径的点(包括初始结点),在与其连通的,未找到最短路径的结点中,将之间距离与圆圈中的距离(即上一结点已找到的最短路径)相加,求得的最小值。 如果有多个相同的最短距离,任取其中一个。 最终最短路径和距离如下图所示。

二、MATLAB实现

dijkstra函数如下:

function [distance, path] = dijkstra(W, st, e)
%% dijkstra单源最短路径算法
% 输入:W  权值矩阵   st 搜索的起点   e 搜索的终点
% 输出:distance 路径距离  path  最短路径
n = length(W);          % 节点数
D = W(st, :);
visit = ones(1, n);
visit(st) = 0;          % 已访问  0;未访问  1
parent = zeros(1, n);   % 记录每个节点的上一个节点
path = [ ];
for i = 1:n-1temp = [ ];  % 从起点出发,找最短距离的下一个点,每次不会重复原来的轨迹,设置visit判断节点是否访问for j = 1:nif visit(j)temp = [temp, D(j)];elsetemp = [temp, inf];endend[value, index] = min(temp);visit(index) = 0; % 更新:如果经过index节点,从起点到每个节点的路径长度更小,则更新,记录前驱节点,方便后面回溯循迹for k = 1:nif D(k) > D(index)+W(index, k)D(k) = D(index)+W(index, k);parent(k) = index;endend
end
distance = D(e);             % 最短距离
% 回溯法:从尾部往前寻找搜索路径
t = e;
while t ~= st && t > 0path =[t, path];p = parent(t);t = p;
end
path = [st, path];           % 最短路径

测试用例代码如下:

clear;clc;
% 权值表
W = [0 6 3 inf inf inf;6 0 2 5 inf inf;3 2 0 3 4 inf;inf 5 3 0 2 3;inf inf 4 2 0 5;inf inf inf 3 5 0];
[distance, path] = dijkstra(W, 1, 4)

Command Window中显示的结果为:

distance =6path =1     3     4

三、参考文献

[1] 小东和小凤. 最短路径Dijkstra算法原理及Matlab实现. CSDN博客.
[2] 郝搞笑. 详解 Dijkstra算法以及实现. CSDN博客.

Dijkstra单源最短路径算法相关推荐

  1. C++实现dijkstra单源最短路径算法-邻接表+优先队列

    dijkstra单源最短路径算法不允许边权值为负,适用的图范围可以很大. 代码如下: #include <iostream> #include <queue> #include ...

  2. Dijkstra 单源最短路径算法 Java实现

    Dijkstra 单源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 结尾 算法导入 在图论中,求最短路径有一个经典的算法 Dijkstra算法 ...

  3. C++实现有向图最短路径-Dijkstra单源最短路径算法

    #include <iostream> using namespace std; #define INFINE 99999999//假装我是无穷大 const int N = 1010; ...

  4. 单源路径分支界限java_java单源最短路径算法

    . .. .. . 单源最短路径的 Dijkstra 算法: 问题描述: 给定一... 并 应用贪心法求解单源最短路径问题.环境要求对于环境没有特别要求.对于算法实现,可以自由选择 C, C++, J ...

  5. 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)

    前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...

  6. Bellman-Ford 单源最短路径算法

    Bellman-Ford 单源最短路径算法 Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 R ...

  7. 四种不同单源最短路径算法性能比较

    四种不同单源最短路径算法性能比较   一.最短路径问题描述 单源最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数.另外,还给定V中的一个顶点,称之为源.现在要计算从源到其他各顶点的 ...

  8. 应用单源最短路径算法解决套利交易问题

    目录 导言 基本定义与延伸 基本概念与定义 概念延伸 最短路径算法 Bellman-Ford算法 问题简述 问题分析 问题求解 第一题 第二题 总结 导言 最短路径问题是图论领域中的核心问题之一,也是 ...

  9. 【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)

    Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径). 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比. 算法的基本思想: 把图中的定点分成两组, ...

最新文章

  1. Stacking+Blending
  2. Html一修改就会自动刷新,web 前端修改 自动刷新 插件使用 liveReload
  3. AI同传效果媲美人类,百度翻译出品全球首个上下文感知机器同传模型
  4. 关于这件事,我有话要说!
  5. Android 界面布局之RelativeLayout
  6. 《Python和HDF 5大数据应用》——2.4 你的第一个HDF5文件
  7. 进行有效编辑的七种习惯
  8. element.style内联样式修改
  9. Golang 反射操作整理
  10. Ubuntu16.04安装百度网盘亲测可用
  11. gpio引脚介绍 树莓派3b_树莓派引脚对照表
  12. 开源共轴双桨无人机 Tdrone 软硬件全部在 GitHub 开源
  13. Unity让物体跟随鼠标移动
  14. myeclipse优化配置指南、myeclipse常用功能设置、 myeclipse快捷键
  15. 超市销售管理系统---设计报告
  16. 电脑怎么设置定时关机?用这个方法就可以搞定
  17. 个人计算机中的防毒软件无法防御,win10系统中无法启动defender防御软件的处理办法...
  18. 无线系统笔记(2)----麦克斯韦方程组
  19. 1的平方加2的平方一直加到n的平方
  20. 文本议题分类及态度赋值分类

热门文章

  1. Android版本的”Wannacry”文件加密病毒样本分析(附带锁机)
  2. 【JAVA】小米集团-2021校招-算法方向在线考试(矩阵相乘+盒子包裹问题)
  3. Container功能简述 java
  4. af if no sooner than..
  5. GIZA++运行报告zz
  6. ChatGPT 整理的 “Java基础面试题集锦:完全版“ (1)
  7. java中resultset返回值_JDBC基础教程之ResultSet对象 | 学步园
  8. Oracle Spacial(空间数据库)数据模型
  9. 一个案例告诉你,GIS技术与数据可视化结合能帮助我们什么?
  10. mysqli mysql assoc_在预准备语句上使用fetch_assoc(php mysqli)