文章目录

  • 1. 按
  • 2. 算法讲解
    • 2.1. 理论讲解
    • 2.2. 实例讲解
      • 2.2.1. 初始化
      • 2.2.2. 执行算法
  • 3. matlab实现
  • 4. 测试
    • 4.1. 测试一
    • 4.2. 测试二

1. 按

Dijkstra算法用于求解一个顶点到另一顶点的最短路径,它采用了非暴力的贪心思想,因此时间复杂度较低,为O(N^2)。
Dijkstra算法是一种贪心算法,每一次都求最短路径,但与常见的贪心算法不同的是,Dijkstra算法是一种步步为营的贪心算法,因此能求解一个顶点到另一个顶点的最短路径。

2. 算法讲解

2.1. 理论讲解

  1. 约定AimedPathNodes为所要求解的从某一目标点HeadNode(为了便于理解,将此节点约定为HeadNode,即头结点,目标路径上开头的那个节点)到另一目标点TrailNode(为了便于理解,将此节点约定为TrailNode,即尾结点,目标路径上结尾的那个节点)的最短的目标路径。
  2. 目标路径是由多个点组成的,刚开始时目标路径AimedPathNodes仅包含起始点HeadNode。
  3. 找出当前目标路径(AimedPathNodes)的最近的邻接点并将其加入到AimedPathNodes中,随后再次找出AimedPathNodes的最近邻接点,并将其加入到AimedPathNodes中,这样一直下去,直到AimedPathNodes包含结尾的那个点(TrailNode)为止。

2.2. 实例讲解

2.2.1. 初始化

给每个点进行编号v1、v2 … v11,这里的v是vertex的缩写,是点的意思,因此v1是点1的意思。
给每条边初始化一个权重,权重用数字表示,如下图中v1与v2两点间的边的权重为2。
此例用于求解v1到v11两点间的最短路径。
约定AimedPathNodes为一个存储目标路径上所有点的变量。

2.2.2. 执行算法

  1. 刚开始时AimedPathNodes仅包含v1
  2. 此时AimedPathNodes为v1。
    找AimedPathNodes最近的邻接点,即找v1的最近的邻接点。
    与v1相邻的点为v2、v3、v4,因此v1的邻接点为v2、v3、v4。
    其中v1与v2的边权重位2,v1与v3的边权重位8,v1与v4的边权重位1。
    易得:v1的最近邻接点为v4
    将v4加入到AimedPathNodes。
  3. 此时AimedPathNodes为v1, v4。
    找AimedPathNodes的最近邻接点,即先找出v1的不包含AimedPathNodes上的点的最短邻接点v2,再找出v4的不包含AimedPathNodes上的点的最近邻接点v3。
    由于v1到v2的距离为2,v4到v3的距离为7,因此v2为到此时AimedPathNodes的最近点,将v2加入到AimedPathNodes。
  4. 此时AimedPathNodes为v1, v4, v2。
    易得AimedPathNodes的最近邻接点为v5,将v5加入到AimedPathNodes中
  5. 此时AimedPathNodes为v1, v4, v2, v5。
    易得AimedPathNodes的最近邻接点为v8
  6. 此时AimedPathNodes为v1, v4, v2, v5, v8。
    AimedPathNodes的最近邻接点为v6
  7. 此时AimedPathNodes为v1, v4, v2, v5, v8, v6。
    AimedPathNodes的最近邻接点为v3
  8. 此时AimedPathNodes为v1, v4, v2, v5, v8, v6, v3。
    AimedPathNodes的最近邻接点为v7
  9. 此时AimedPathNodes为v1, v4, v2, v5, v8, v6, v3, v7。
    AimedPathNodes的最近邻接点为v10
  10. 此时AimedPathNodes为v1, v4, v2, v5, v8, v6, v3, v7, v10。
    AimedPathNodes的最近邻接点为v9
  11. 此时AimedPathNodes为v1, v4, v2, v5, v8, v6, v3, v7, v10, v9。
    AimedPathNodes的最近邻接点为v11
  12. 停止找最近的邻接点。实际求解最短路径时,除了上面的之外,还要再声明一个变量用于存储最短路径,并且每一步还有一个对该变量进行退栈和入栈的操作。

3. matlab实现

dijkstra.m

function [min,path]=dijkstra(w,start,terminal)n=size(w,1); label(start)=0; f(start)=start;for i=1:nif i~=startlabel(i)=inf;end, ends(1)=start; u=start;while length(s)<nfor i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;end,  endif ins==0v=i;if label(v)>(label(u)+w(u,v))label(v)=(label(u)+w(u,v)); f(v)=u;end, end, end   v1=0;k=inf;for i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;end, endif ins==0v=i;if k>label(v)k=label(v);  v1=v;end,  end,  ends(length(s)+1)=v1;  u=v1;endmin=label(terminal); path(1)=terminal;i=1; while path(i)~=startpath(i+1)=f(path(i));i=i+1 ;endpath(i)=start;L=length(path);path=path(L:-1:1);

4. 测试

4.1. 测试一

  • 代码

    weight=[0     2     8     1   Inf   Inf   Inf   Inf   Inf   Inf   Inf;2     0     6   Inf     1   Inf   Inf   Inf   Inf   Inf   Inf;8     6     0     7     5     1     2   Inf   Inf   Inf   Inf;1   Inf     7     0   Inf   Inf     9   Inf   Inf   Inf   Inf;Inf     1     5   Inf     0     3   Inf     2     9   Inf   Inf;Inf   Inf     1   Inf     3     0     4   Inf     6   Inf   Inf;Inf   Inf     2     9   Inf     4     0   Inf     3     1   Inf;Inf   Inf   Inf   Inf     2   Inf   Inf     0     7   Inf     9;Inf   Inf   Inf   Inf     9     6     3     7     0     1     2;Inf   Inf   Inf   Inf   Inf   Inf     1   Inf     1     0     4;Inf   Inf   Inf   Inf   Inf   Inf   Inf     9     2     4     0;]
    [dis, path]=dijkstra(weight,1, 11)
    

  • 结果
    dis = 13
    path = 1 2 5 6 3 7 10 9 11

4.2. 测试二

  • 代码

    weight=[0     8   Inf   Inf   Inf   Inf     7     8   Inf   Inf   Inf;Inf     0     3   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf;Inf   Inf     0     5     6   Inf     5   Inf   Inf   Inf   Inf;Inf   Inf   Inf     0     1   Inf   Inf   Inf   Inf   Inf    12;Inf   Inf     6   Inf     0     2   Inf   Inf   Inf   Inf    10;Inf   Inf   Inf   Inf     2     0     9   Inf     3   Inf   Inf;Inf   Inf   Inf   Inf   Inf     9     0   Inf   Inf   Inf   Inf;8   Inf   Inf   Inf   Inf   Inf   Inf     0     9   Inf   Inf;Inf   Inf   Inf   Inf     7   Inf   Inf     9     0     2   Inf;Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf     2     0     2;Inf   Inf   Inf   Inf    10   Inf   Inf   Inf   Inf   Inf     0;];
    [dis, path]=dijkstra(weight,1, 11)
    

  • 结果
    dis = 21
    path = 1 8 9 10 11

图论:迪克斯特求解最短路径算法及MATLAB实现相关推荐

  1. 最短路径算法【matlab仿真】

    最短路径问题因为其问题的普遍性,以及应用的实际性,不仅是数据结构的热点问题,也是数学信息学科.计算机学科.地理信息学科等学科的一个研究热点.由于科学技术的不断进步,使得应用数学中的图论与计算机算法与结 ...

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

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

  3. 图的最短路径算法及matlab实现(Dijkstra算法、Floyd算法、Bellman-Ford算法、Johnson 算法)

    图的最短路径算法 Dijkstra算法 Dijkstra算法研究的是从初始点到其他任一结点的最短路径,即单源最短路径问题,其对图的要求是不存在负权值的边. Dijkstra算法主要特点是以起始点为中心 ...

  4. 数据结构与算法--图论最短路径算法应用-词阶求解

    最短路径案例 词梯应用,在一个词梯中,每个单词均由前一个单词改变一个字母而得到.例如,我们通过一系列单字母替换而得到zero转换为five,如下:five:zero,hero,here,hire,fi ...

  5. matlab求任意点最短路径,【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现...

    代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P18 书中提出了基于经典Dijkstra算法改进的两种算法. 其中算法Ⅱ的效率较高. 代码如下: 1 function ...

  6. 最短路径 Dijkstra算法的Matlab代码实现

    为了搞清楚最短路径的算法过程,自己编写代码实现dijkstra算法寻找路径 % 文件名:dijkstra.m % 时间:2020年9月12日 % 来源:https://blog.csdn.net/li ...

  7. pagerank算法实现matlab,Matlab 入门及PageRank算法求解.ppt

    Matlab 入门及PageRank算法求解 矩阵运算 + 矩阵加 - 矩阵减 * 矩阵乘 / 矩阵左除 \ 矩阵右除 ^ 矩阵幂 维数相同才能加减:方 阵才能求幂. 注意左乘,右乘. a\b?求a* ...

  8. 货物配送问题的matlab,免疫算法求解配送中心选址问题matlab代码

    免疫算法求解配送中心选址问题matlab代码 所属分类:matlab例程 开发工具:matlab 文件大小:31KB 下载次数:3 上传日期:2020-12-01 16:11:00 上 传 者:代码大 ...

  9. 分步傅里叶算法_分布傅里叶算法求解非线性薛定谔的matlab程序问题

    [size=14.399999618530273px]分布傅里叶算法求解非线性薛定谔的matlab程序里,我注释的可能也有错误,请指导@alpha=0;  %光纤损耗值,单位dB/km alph=al ...

最新文章

  1. jstl sql标签使用
  2. 混合编程黑科技:跨语言编程问题迎刃而解的3个要点
  3. 笔记本能连上WIFI网络,但是无法上网怎么办
  4. Adaboost算法和提升树算法
  5. 【本质】你知道C语言编译的过程吗?
  6. java扫描器创建,java – 如何创建条码扫描器(Android)?
  7. Ubuntu安装anaconda,tensorflow,keras,pytorch
  8. java 对象与引用_Java --对象引用与对象的区别
  9. 未来计算机二级软件vc,江苏省计算机二级VC++上机模拟软件
  10. 字距调整属性font-kerning,怎么查老婆的网贷信息,看看老婆在外面借了多少钱?
  11. 关于ERP系统提前期运算逻辑的三点介绍
  12. VB6 加载控件Windows Common Controls 6.0(mscomctl.ocx)失败提示“对象库未注册”
  13. TensorFlow CTPN Demo Windows 无痛搭建
  14. WWDC20 Session 清单(06-23)
  15. 344. 反转字符串
  16. 两年过去了,4399依旧坚挺,Flash还能继续?
  17. ES千亿级搜索实战-架构优化
  18. Latch的四种写法及为何要避免其产生,以及Latch与DFF的区别?
  19. git安装及使用,超详细版
  20. 如何在springboot项目中使用自定义注解实现系统操作日志的功能

热门文章

  1. Mybatis 之 foreach 批处理 map 中的键值 为list 的操作
  2. 2022中国科学技术大学计算机考研复试分数线是多少
  3. AUTOWARE下底盘CAN通讯实现
  4. 数据结构与算法:一图弄懂维特比viterbi算法
  5. 知到网课营养与食疗学题库及真题答案
  6. 个人- TODO计划表
  7. 【C语言】指针表达进阶:指针在一维数组、二维数组的应用(如何用指针表达一维数组、二维数组的元素的地址、元素值)
  8. requirejs html缓存,requirejs 缓存问题
  9. matlab如何取对数坐标,利用Matlab提取图片中曲线数据(线性修正,支持对数坐标)
  10. 架设虚拟环境下的传真服务器