MATLAB实现Dijkstra算法和Floyd算法

目录

1、文件功能介绍

2、代码执行效果展示

3、Dijkstra算法求图的单源最短路径

4、Dijkstra fullPath的更新逻辑

5、DIjkstra算法流程图

6、Floyd算法实现图的任意两点间最短路径

7、Floyd算法流程图

8、Floyd fullPath的更新逻辑(非递归算法)


1、文件功能介绍

代码文件功能
workspace.m代码一步执行工作区
Dijkstra.mDijkstra算法计算最短路径的距离dist和路径fullPath以及置定节点集Gp
Floyd.mFloyd算法获得完全优化后的权值矩阵W和路由矩阵R
getGraph.m获取网络图(默认图或者手动输入)
getFloydMinPath利用Floyd计算得到的W和R获取任意起点v到其他节点的最短路径fullPath及距离dist
drawPath利用fullPath、dist、point(随机值获取)、figureIndex(图的句柄),绘制对应的最短路径
drawDijkstraPath.m绘制Dijkstra各轮下对应的最短路径

2、代码执行效果展示

Dijkstra执行效果图,可看到每一轮更新之后的最短路径情况。

图0.1 Dijkstra执行效果图

​Floyd执行效果图,可看到执行起点v到其他各节点的最短路径。

图0.2 Floyd执行效果图

3、Dijkstra算法求图的单源最短路径

算法思想简述如下: 将图中各点分为两个集合:置定结点集合Gp(并入了最短路径的)、非置定结点集合Gs. 使用dist记录源点v到各点的距离,fullPath记录源点v到其余各点的最短路径.

  • 将源点v加入置定结点集合Gp

  • 找出置定结点集合Gp到Gs的当前最短边(及其对应顶点k)

  • 将该顶点k加入到置定结点集合Gp中,利用k作为中间结点,如果Gp中(i->k+k->j)<(i->j),则更新Gp到Gs的路径,并将中间结点k记录到对应dist中

  • 循环运行n-1次,将所有剩余结点加入到Gp中

4、Dijkstra fullPath的更新逻辑

  • fullPath记录的是源点v到各顶点的最短路径(起点->中间结点s->终点)

  • 当新的顶点k加入到Gp后,需要利用k作为中间结点更新Gp到Gs的路径,若此时有结点i,j(i属于Gp,j属于Gs),满足(i->k+k->j)<(i->j),则认定源点到j点需要经过中间结点k

  • 将k结点的当前fullPath对应最短路径,赋值给j的fullPath对应最短路径(记录下来到中间结点k的前面的路径)。

  • 在j的最短路径后面加上当前的结点号j(终点记录)。

5、DIjkstra算法流程图

图1.0 Dijkstra算法流程图

图1.1 Dijkstra轮数0

初始化Dijkstra图,标出起点V1(置定节点集Gp此时只有V1),及置定节点集Gp与非置定节点集的连线(橙色线. V1-V2,V1-V3,V1-V4)。

图1.2 Dijkstra轮数1

选取置定节点集Gp与非置定节点集的连线(橙色线)中最短的那条线(V1-V4),将V4并入置定节点集(节点V4及其连线V1-V4标蓝),同时更新置定节点集Gp与非置定节点集的连线(橙色线. V4-V2,V4-V3,V4-V5)。

图1.3 Dijkstra轮数2

选取最短的那条线(V4-V5),将V5并入置定节点集(节点V5及其连线V4-V5标蓝),同时更新置定节点集Gp与非置定节点集的连线(橙色线.V5-V3,V5-V6)。

图1.4 Dijkstra轮数3

选取最短的那条线(V5-V3),将V3并入置定节点集(节点V3及其连线V5-V3标蓝),同时更新置定节点集Gp与非置定节点集的连线(橙色线.V3-V2,V3-V6),移除置定节点集本身间的连线(V1-V3.V4-V3)。

图1.5 Dijkstra轮数4

选取最短的那条线(V1-V2),将V2并入置定节点集(节点V2及其连线V1-V2标蓝)。

图1.6 Dijkstra轮数5

选取最短的那条线(V5-V6),将V6并入置定节点集(节点V6及其连线V5-V6标蓝),此时置定节点集包含所有节点,Dijkstra构造完成最短路径。

图1.7 Dijkstra结果图

6、Floyd算法实现图的任意两点间最短路径

算法思想简述如下: 如果要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转,即a->k->b,才可能缩短原来从顶点a点到顶点b的路程。 图的权值矩阵W(Weight,记录一点到任意各点的最短距离)、最短路由矩阵R(Router,记录中间结点路由) 首先以第一个顶点(k=1:n)作为第一个中间结点, 遍历权值矩阵(i=1:n,j=1:n)来寻找是否能利用当前结点k=1为中间结点,使得w(i->k+k->j)<w(i->j),若满足,则更新(i->j)的距离W(i,j)=w(i->k+k->j),同时更新中间结点路由R(i,j)=k; 利用k=1:n所有结点作为中间结点进行W和R的优化后,最终得到的W和R即为最短路径W和最短路径路由矩阵R.

7、Floyd算法流程图

图2.0 Floyd流程图

8、Floyd fullPath的更新逻辑(非递归算法)

  • 由于Floyd算法的关键就是利用中间结点优化源点v到终点u的路径

  • 当找到一个可优化的中间结点k时,将k插入到源点v和终点u中间(v->k(中间结点)->u)

  • 这时候,需要注意到,v->k可能有中间结点可以优化,k->u也可能有中间结点可以优化,我们需要做这两件事情:1.不断找中间结点插入到路径;2.保证各段没有中间结点可以再优化了

  • 怎样保证能把所有中间结点都记录下来呢?没有中间结点可优化的条件(R(path(index),path(index+1))==path(index+1))

  • 设立一个index记录之前已经完成了最优化,一个rNum记录中间结点的个数(便于插入新中间结点),不断寻找index到index+1顶点的中间结点并插入到index到index+1顶点中间,知道index到index+1之间没有中间结点(R(index,index+1)==index+1),这时候令index加一,去更新下一级的index到index+1的中间结点,由此不断优化,不断向前推index,最终当所有的路径都已经没有中间结点可以增加时path(index+1)==u,则表示最优化达到了终点,完成了路径检索。

项目资源下载:https://download.csdn.net/download/m0_38106923/87740211

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/422122.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

labview串口大数据量报错的一种解决思路(通过tcp进行写入和读取串口数据)

因为项目要求&#xff0c;用labview给客户开发了一个上位机&#xff0c;在现场给客户调试上位机时&#xff0c;发现了几种奇怪的现象 1&#xff1a;客户样件有两路串口&#xff0c;一路串口可以多字节进行发送数据&#xff0c;一路只能单字节发送数据&#xff0c;每次单字节数据…

Pygame中获取鼠标按键状态的方法

在《Pygame中获取鼠标位置的方法》中提到&#xff0c;可以通过鼠标事件和mouse模块中的函数获取鼠标位置&#xff0c;这两种方法同样适用于获取鼠标按键状态。 1 通过鼠标点击事件获取鼠标按键状态 通过鼠标点击事件获取鼠标按键状态的代码如图1所示。 图1 鼠标点击事件获取鼠…

Gin-封装自动路由

O.0 思路一、API二、控制层三、自动路由核心四、分组路由外加中间件使用 思路 由于Java转Go直接使用的goframe框架&#xff0c;然学习Gin时觉得一个接口一个路由太麻烦&#xff0c;于是有了...1、在请求结构体中采用标签的形式&#xff0c;直接给出路由和请求方式 2、在控制层…

QXml 使用方法

VS2019 QT 编译工具链问题解决 使用winqtdeploy.exe 打包环境就可以正常运行&#xff0c;缺少某一个运行库引起的 简易使用python脚本编译运行 Python3 中的 slots 和 QT 中的 slots 宏定义重复, 放在不同的文件中进行调用可以避免 还是比较习惯从源码包引入&#xff08;方便定…

【区块链通用服务平台及组件】信息数据流转验真技术研究项目 | FISCO BCOS应用案例

在日常工作中&#xff0c;相关系统每天会产生大量数据&#xff0c;系统之间有多种模式数据交互方式&#xff0c;数据监管工作量巨大&#xff0c;急需 数据追溯定位工具来辅助监管&#xff1b;数据在生产过程中经常会出现采集、提交、修改、删除等操作&#xff0c;需要对数据变更…

Vue(9)——.sync修饰符、ref和$refs、$nextTick

.sync 作用:可以实现子组件与父组件数据的双向绑定&#xff0c;简化代码。 特点&#xff1a;prop属性名&#xff0c;可以自定义&#xff0c;非固定位value 场景&#xff1a;封装弹框类的基础组件&#xff0c;visible属性 true显示&#xff0c;false隐藏 本质&#xff1a;就是 …

鸿蒙界面开发——组件(7):组件导航 页面路由

组件导航 (Navigation)(推荐) Navigation() Navigation(pathInfos: NavPathStack)Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation组件适用于模块内和跨模块的路由切换&#xff0c…

2024年金九银十最新版Java面试题及答案整理(持续更新)

2024年金九银十到了&#xff0c;发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全~这套互联网 Java 工程师面试题包括了&#xff1a;MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Spring…

文件加密最简单的方法有哪些?十个电脑文件加密方法【超详细】

在当今数字化和信息化的时代&#xff0c;数据已成为企业最重要的资产之一。内部数据外泄不仅可能导致商业秘密的丧失&#xff0c;还可能对企业的声誉和财务健康造成严重影响。为了有效防止内部数据外泄&#xff0c;企业需要实施综合的防泄密解决方案。以下是十大最佳防泄密解决…

内网安全-横向移动【3】

1.域横向移动-内网服务-Exchange探针 Exchange是一个电子右键服务组件&#xff0c;由微软公司开发。它不仅是一个邮件系统&#xff0c;还是一个消息与协作系统。Exchange可以用来构建企业、学校的邮件系统&#xff0c;同时也是一个协作平台&#xff0c;可以基于此开发工作流、…

19:I2C一:程序模拟I2C通信时序

I2C 1、什么是I2C2、I2C的通信时序2.1&#xff1a;起始信号2.2&#xff1a;停止信号2.3&#xff1a;主机向从机发送一个字节数据2.4&#xff1a;主机向从机读取一个字节数据2.5&#xff1a;主机接收应答2.6&#xff1a;主机发送应答 3、程序模拟I2C的通信时序3.1&#xff1a;指…

NX1872三维电气布线

电气部件审核与定义

Windows系统介绍

文章目录 1、Windows启动过程1.1 启动过程BIOS1.2 启动过程MBR1.3 启动过程 GPT1.4 启动过程BootMgr1.5 启动过程Winload.exe1.6 启动过程1.7 explorer.exe 2、Windows重要进程及组件2.1 注册表Services注册表服务管理器Services.mscsc.exe计划任务taskschd.msc计划任务schtask…

区块链学习笔记1--比特币

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。 从狭义上来说&#xff1a;区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学的方式保证的不可篡改和不可伪造的分布式账本。 意思就是…

第67期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

组播 2024 9 11

PIM&#xff08;Protocol Independent Multicast&#xff09;是一种常用的组播路由协议&#xff0c;其独立于底层的单播路由协议&#xff0c;能够在多种网络环境中有效地实现多播路由功能。PIM主要有两种模式&#xff1a;PIM Sparse Mode (PIM-SM) 和 PIM Dense Mode (PIM-DM)&…

DDoS对策是什么?详细解说DDoS攻击难以防御的理由和对策方法

攻击规模逐年增加的DDoS攻击。据相关调查介绍&#xff0c;2023年最大的攻击甚至达到了700Gbps。 为了抑制DDoS攻击的危害&#xff0c;采取适当的对策是很重要的。 特别是在网站显示花费时间或频繁出现504错误的情况下&#xff0c;可能已经受到了DDoS攻击&#xff0c;需要尽早采…

Spring面试

一、对Spring的理解 &#xff08;一&#xff09;Spring的发展史 &#xff08;二&#xff09;Spring的体系结构 &#xff08;三&#xff09;Spring相关组件 1.Spring和SpringMVC的关系 2.Spring和SpringBoot的关系 3.Spring和SpringCloud的关系 4.Spring和SpringSecurity的…

C语言基础——⑩③数据结构——②栈和队列

一、栈(Stack) 1、基本概念 栈是一种逻辑结构&#xff0c;是特殊的线性表。特殊在&#xff1a; 只能在固定的一端操作 只要满足上述条件&#xff0c;那么这种特殊的线性表就会呈现一种“后进先出”的逻辑&#xff0c;这种逻辑就被称为栈。栈 在生活中到处可见&#xff0c;比…

为什么企业需要数据目录?

想象一下&#xff0c;如果在没有目录系统的庞大图书馆里寻找一本特定的书&#xff0c;你可能会耗费无数个小时搜索&#xff0c;但最终却一无所获。 同理&#xff0c;企业的数据如果没有一个组织良好、易于搜索的系统&#xff0c;也无法充分发挥其潜力。企业数据目录能够简化这一…