图论:迪克斯特求解最短路径算法及MATLAB实现
文章目录
- 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. 理论讲解
- 约定AimedPathNodes为所要求解的从某一目标点HeadNode(为了便于理解,将此节点约定为HeadNode,即头结点,目标路径上开头的那个节点)到另一目标点TrailNode(为了便于理解,将此节点约定为TrailNode,即尾结点,目标路径上结尾的那个节点)的最短的目标路径。
- 目标路径是由多个点组成的,刚开始时目标路径AimedPathNodes仅包含起始点HeadNode。
- 找出当前目标路径(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. 执行算法
- 刚开始时AimedPathNodes仅包含v1
- 此时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。
- 此时AimedPathNodes为v1, v4。
找AimedPathNodes的最近邻接点,即先找出v1的不包含AimedPathNodes上的点的最短邻接点v2,再找出v4的不包含AimedPathNodes上的点的最近邻接点v3。
由于v1到v2的距离为2,v4到v3的距离为7,因此v2为到此时AimedPathNodes的最近点,将v2加入到AimedPathNodes。
- 此时AimedPathNodes为v1, v4, v2。
易得AimedPathNodes的最近邻接点为v5,将v5加入到AimedPathNodes中
- 此时AimedPathNodes为v1, v4, v2, v5。
易得AimedPathNodes的最近邻接点为v8
- 此时AimedPathNodes为v1, v4, v2, v5, v8。
AimedPathNodes的最近邻接点为v6
- 此时AimedPathNodes为v1, v4, v2, v5, v8, v6。
AimedPathNodes的最近邻接点为v3
- 此时AimedPathNodes为v1, v4, v2, v5, v8, v6, v3。
AimedPathNodes的最近邻接点为v7
- 此时AimedPathNodes为v1, v4, v2, v5, v8, v6, v3, v7。
AimedPathNodes的最近邻接点为v10
- 此时AimedPathNodes为v1, v4, v2, v5, v8, v6, v3, v7, v10。
AimedPathNodes的最近邻接点为v9
- 此时AimedPathNodes为v1, v4, v2, v5, v8, v6, v3, v7, v10, v9。
AimedPathNodes的最近邻接点为v11
- 停止找最近的邻接点。实际求解最短路径时,除了上面的之外,还要再声明一个变量用于存储最短路径,并且每一步还有一个对该变量进行退栈和入栈的操作。
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实现相关推荐
- 最短路径算法【matlab仿真】
最短路径问题因为其问题的普遍性,以及应用的实际性,不仅是数据结构的热点问题,也是数学信息学科.计算机学科.地理信息学科等学科的一个研究热点.由于科学技术的不断进步,使得应用数学中的图论与计算机算法与结 ...
- 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)
前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...
- 图的最短路径算法及matlab实现(Dijkstra算法、Floyd算法、Bellman-Ford算法、Johnson 算法)
图的最短路径算法 Dijkstra算法 Dijkstra算法研究的是从初始点到其他任一结点的最短路径,即单源最短路径问题,其对图的要求是不存在负权值的边. Dijkstra算法主要特点是以起始点为中心 ...
- 数据结构与算法--图论最短路径算法应用-词阶求解
最短路径案例 词梯应用,在一个词梯中,每个单词均由前一个单词改变一个字母而得到.例如,我们通过一系列单字母替换而得到zero转换为five,如下:five:zero,hero,here,hire,fi ...
- matlab求任意点最短路径,【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现...
代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P18 书中提出了基于经典Dijkstra算法改进的两种算法. 其中算法Ⅱ的效率较高. 代码如下: 1 function ...
- 最短路径 Dijkstra算法的Matlab代码实现
为了搞清楚最短路径的算法过程,自己编写代码实现dijkstra算法寻找路径 % 文件名:dijkstra.m % 时间:2020年9月12日 % 来源:https://blog.csdn.net/li ...
- pagerank算法实现matlab,Matlab 入门及PageRank算法求解.ppt
Matlab 入门及PageRank算法求解 矩阵运算 + 矩阵加 - 矩阵减 * 矩阵乘 / 矩阵左除 \ 矩阵右除 ^ 矩阵幂 维数相同才能加减:方 阵才能求幂. 注意左乘,右乘. a\b?求a* ...
- 货物配送问题的matlab,免疫算法求解配送中心选址问题matlab代码
免疫算法求解配送中心选址问题matlab代码 所属分类:matlab例程 开发工具:matlab 文件大小:31KB 下载次数:3 上传日期:2020-12-01 16:11:00 上 传 者:代码大 ...
- 分步傅里叶算法_分布傅里叶算法求解非线性薛定谔的matlab程序问题
[size=14.399999618530273px]分布傅里叶算法求解非线性薛定谔的matlab程序里,我注释的可能也有错误,请指导@alpha=0; %光纤损耗值,单位dB/km alph=al ...
最新文章
- jstl sql标签使用
- 混合编程黑科技:跨语言编程问题迎刃而解的3个要点
- 笔记本能连上WIFI网络,但是无法上网怎么办
- Adaboost算法和提升树算法
- 【本质】你知道C语言编译的过程吗?
- java扫描器创建,java – 如何创建条码扫描器(Android)?
- Ubuntu安装anaconda,tensorflow,keras,pytorch
- java 对象与引用_Java --对象引用与对象的区别
- 未来计算机二级软件vc,江苏省计算机二级VC++上机模拟软件
- 字距调整属性font-kerning,怎么查老婆的网贷信息,看看老婆在外面借了多少钱?
- 关于ERP系统提前期运算逻辑的三点介绍
- VB6 加载控件Windows Common Controls 6.0(mscomctl.ocx)失败提示“对象库未注册”
- TensorFlow CTPN Demo Windows 无痛搭建
- WWDC20 Session 清单(06-23)
- 344. 反转字符串
- 两年过去了,4399依旧坚挺,Flash还能继续?
- ES千亿级搜索实战-架构优化
- Latch的四种写法及为何要避免其产生,以及Latch与DFF的区别?
- git安装及使用,超详细版
- 如何在springboot项目中使用自定义注解实现系统操作日志的功能
热门文章
- Mybatis 之 foreach 批处理 map 中的键值 为list 的操作
- 2022中国科学技术大学计算机考研复试分数线是多少
- AUTOWARE下底盘CAN通讯实现
- 数据结构与算法:一图弄懂维特比viterbi算法
- 知到网课营养与食疗学题库及真题答案
- 个人- TODO计划表
- 【C语言】指针表达进阶:指针在一维数组、二维数组的应用(如何用指针表达一维数组、二维数组的元素的地址、元素值)
- requirejs html缓存,requirejs 缓存问题
- matlab如何取对数坐标,利用Matlab提取图片中曲线数据(线性修正,支持对数坐标)
- 架设虚拟环境下的传真服务器