首页 > 编程语言 >MATLAB实现Dijkstra算法和Floyd算法

MATLAB实现Dijkstra算法和Floyd算法

时间:2024-09-08 21:54:16浏览次数:9  
标签:Dijkstra index 结点 Gp 路径 置定 算法 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

标签:Dijkstra,index,结点,Gp,路径,置定,算法,Floyd,节点
From: https://blog.csdn.net/m0_38106923/article/details/142033846

相关文章

  • UCB算法(帮助做出最优选择的算法)
    UCB(UpperConfidenceBound)算法是一种用于解决多臂老x虎机问题的启发式方法。多臂老x虎机问题是一种用以模拟现实世界决策问题的数学模型,其中“臂”代表不同的行动或选择,而“老x虎机”代表这些行动的随机结果。UCB算法的目标是在探索(exploration)和利用(exploitation)之间找到最佳平......
  • 代码随想录算法训练营,9月7日 | 150. 逆波兰表达式求值,239. 滑动窗口最大值,347.前 K 个
    150.逆波兰表达式求值题目链接:150.逆波兰表达式求值文档讲解︰代码随想录(programmercarl.com)视频讲解︰逆波兰表达式求值日期:2024-09-07想法:用栈解决,遇到运算符取前两个数字计算(表达式总是成立的,不用做额外的判定)Java代码如下:classSolution{publicintevalRPN(Stri......
  • 《动手学深度学习》笔记4——线性回归 + 基础优化算法
    李沐老师:线性回归是机器学习最基础的一个模型,也是我们理解之后所有深度学习模型的基础,所以我们从线性回归开始1.线性回归由于是案例引入,没有很难的知识点,咱直接贴上李沐老师的PPT:1.1线性模型--单层神经网络李沐老师:神经网络起源于神经科学,但现在深度学习的发展......
  • 文心一言 VS 讯飞星火 VS chatgpt (342)-- 算法导论23.2 1题
    一、对于同一个输入图,Kruskal算法返回的最小生成树可以不同。这种不同来源于对边进行排序时,对权重相同的边进行的不同处理。证明:对于图G的每棵最小生成树T,都存在一种办法来对G的边进行排序,使得Kruskal算法所返回的最小生成树就是T。如果要写代码,请用go语言。文心一言:证明为了证明对......
  • 算法编程题(Day01)
    1.雀魂启动!小包最近迷上了一款叫做雀魂的麻将游戏,但是这个游戏规则太复杂,小包玩了几个月了还是输多赢少。于是生气的小包根据游戏简化了一下规则发明了一种新的麻将,只留下一种花色,并且去除了一些特殊和牌方式(例如七对子等),具体的规则如下:总共有36张牌,每张牌是1~9。每个数字......
  • 图论篇--代码随想录算法训练营第五十三天打卡| 110. 字符串接龙,105.有向图的完全可达
    110.字符串接龙题目链接:110.字符串接龙题目描述:字典strList中从字符串beginStr和endStr的转换序列是一个按下述规格形成的序列: 序列中第一个字符串是beginStr。序列中最后一个字符串是endStr。 每次转换只能改变一个字符。 转换过程中的中间字符串必须是字典......
  • 深入解析多智能体强化学习算法的训练效率
    深入解析多智能体强化学习算法的训练效率在多智能体强化学习(MARL)领域,不同算法的训练效率和最终性能差异显著。本文将深入分析几种主流MARL算法的训练特性,探讨影响其效率的关键因素。1.算法概览我们将讨论以下几种典型的MARL算法:VDN(ValueDecompositionNetworks)QM......
  • 算法题之水壶问题
    水壶问题有两个水壶,容量分别为 x 和 y 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 target 升。你可以:装满任意一个水壶清空任意一个水壶将水从一个水壶倒入另一个水壶,直到接水壶已满,或倒水壶已空。示例1: 输入:x=3,y=5,target=4输出:tru......
  • 各排序算法及其时间复杂度比较
    排序算法及其时间复杂度比较在C语言中,排序算法是常见的算法之一,用于将一组数据按照一定顺序排列。下面我将简要介绍几种常见排序算法的时间复杂度,并给出每种排序算法的C语言代码示例。1.插入排序(InsertionSort)时间复杂度:平均和最坏情况:O(n^2)最好情况:O(n)(当输入数组已经排......
  • Java 面试题:Java的垃圾收集算法 --xunznux
    文章目录标记算法可达性分析算法标记算法的基本流程:标记算法的特点:标记算法的局限性:标记算法的优化:结论:1.标记-清除算法(Mark-Sweep)基本原理:优点:缺点:2.复制算法(Copying)核心思想基本原理:优点:缺点:3.标记-整理算法(Mark-Compact)基本原理:优点:缺点:4.分代收集算法(Genera......