首页 > 编程语言 >路径规划算法 - 求解最短路径 - Dijkstra算法

路径规划算法 - 求解最短路径 - Dijkstra算法

时间:2023-12-06 16:01:29浏览次数:35  
标签:12 15 前序 路径 Dijkstra 距离 算法 最优 节点

Dijkstra算法的思想是广度优先搜索(BFS) 贪心策略。
是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数
如果是负数,则需要 Bellman-Ford 算法
如果想求任意两点之间的距离,就需要用 Floyd 算法

image

求节点0 -> 4 的最短路径

  • 每次从未标记的节点中选择距离出发点最近的节点,标记,收录到最优路径集合中
  • 计算刚加入节点A的邻近节点B的距离(不包括标记的节点),若(节点A的距离 + 节点A到节点B的边长)< 节点B的距离,就更新节点B的距离和前序节点

初始状态

节点 0 1 2 3 4 5 6 7 8 备注
出发节点 当前节点,到每个节点的距离
前序点 为了记录最短路径,需要记录每个节点的前序节点
最优节点 标记为最优节点

刚开始,所有的节点都认为是 ∞ 无穷大

从0出发

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0
前序点

首先,节点0的距离是0,所有节点中距离最短的是它自己,0为最优路径中的节点

更新0邻近节点1、7

image

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 8
前序点 0 0

将出发点0到节点1和节点7,更新为 4、8
把节点 0 作为节点1 和 节点7 的前序节点
从未标记最优节点(1~8)中,找距离出发点最小的节点 => 4

更新1邻近节点2、7

image

从0点出发,到 节点1 相邻的节点 2、7
0->1->2 = 4 + 8 = 12 , 节点2此时为 ∞,因此 节点2 的 距离 标为 12
0->1->7 = 4 + 11 = 15 , 节点 7 有值 = 8 小于 15,因此 节点 7 的距离不更新

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 8
前序点 0 1 0

把节点 1 作为节点2 的前序节点
从未标记最优节点(1~8)中,找距离出发点最小的节点 => 7

更新7邻近节点 8、6

image

从0点出发,到 上一次最优节点7 相邻的节点 8、6
0->7->8 = 8 + 7 = 15 , 节点8此时为 ∞,因此 节点8 的 距离 标为 15
0->7->6 = 8 + 1 = 9 , 节点6此时为 ∞,因此 节点6 的 距离 标为 9

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 9 8 15
前序点 0 1 7 0 7

把节点 7 作为节点8、6 的前序节点
从未标记最优节点(2~6、8)中,找距离出发点最小的节点 => 6

更新6邻近节点 8、5

image
从0点出发,到 上一次最优节点6 相邻的节点 8、5
0->7->6->8 = 8 + 1 + 6 = 15 , 节点8此时为 15,因此 节点8 的 距离 不变,前序节点不变
0->7->6->5 = 8 + 1 + 2 = 11 , 节点5此时为 ∞,因此 节点5 的 距离 标为 11,前序节点为 6

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 11 9 8 15
前序点 0 1 6 7 0 7

从未标记最优节点(2~5、8)中,找距离出发点最小的节点 => 5

更新5邻近节点 2、3、4

image

从0点出发,到 上一个最优节点5 相邻的节点 2、3、4
0->7->6->5->2 = 8 + 1 + 2 + 4 = 15 , 节点2此时为 12,15>12,所以节点2 保持不变
0->7->6->5->3 = 8 + 1 + 2 + 14 = 25 , 节点3此时为 ∞,因此 节点3 的 距离 标为 25,前序节点为 5
0->7->6->5->4 = 8 + 1 + 2 + 10 = 21 , 节点4此时为 ∞,因此 节点4 的 距离 标为 21,前序节点为 5

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 25 21 11 9 8 15
前序点 0 1 5 5 6 7 0 7

从未标记最优节点(2~4、8)中,找距离出发点最小的节点 => 2

更新2邻近节点 3、8

image

从0点出发,到 上一个最优节点2 相邻的节点 3、8,节点5已标记,所以不处理节点5
0->1->2->3 = 4 + 8 + 7 = 19 , 节点3此时为 25,19<25,因此 节点3 的 距离 标为 19,前序节点为 2
0->1->2->8 = 4 + 8 + 2 = 14 , 节点8此时为 15,14<15,因此 节点8 的 距离 标为 14,前序节点为 2

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 19 21 11 9 8 14
前序点 0 1 2 5 6 7 0 2

从未标记最优节点(3、4、8)中,找距离出发点最小的节点 => 8

邻近节点

8的邻近节点,2、7、6 都已被标记为最优节点,所以不需要处理

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 19 21 11 9 8 14
前序点 0 1 2 5 6 7 0 2

从未标记最优节点(3、4)中,找距离出发点最小的节点 => 3

image

最优节点3的邻近节点:2、5、4中 2、5已标记,处理4

3-> 4 = 19 + 9 = 28 , 节点4此时为 21 , 28 > 21 , 所以节点4保持不变

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 19 21 11 9 8 14
前序点 0 1 2 5 6 7 0 2

从未标记最优节点(4)中,找距离出发点最小的节点 => 4

最短距离

从出发点0 到节点 4 的最短距离 = 21

最短路径

反过来追溯
4 的前序节点 5,5的前面是 6 。。。
4 -> 5 -> 6 -> 7 -> 0
因此
0 -> 7 -> 6 -> 5 -> 4 是最短路径

标签:12,15,前序,路径,Dijkstra,距离,算法,最优,节点
From: https://www.cnblogs.com/vipsoft/p/17879343.html

相关文章

  • 拒绝算法推荐,使用rss订阅消息与新闻!
    算法推荐的弊端就不说了借用RSSHub镜像网站如果你实在不会,又或者觉得麻烦,那你还可以搭其他网友的“便车”。我收集了 9 个公开的 RSShub镜像网站,它们用的都是用自己的服务器,所以在流量方面也不会有问题。服务器1 :https://rsshub.rssforever.com 服务器2 :https://rss......
  • java与算法Day1 Scanner的应用(一)
    java中使用输入需要用到java.util.Scanner。Scanner有next,nextInt,nextString,hasNext,hasNextLine等方法。使用XXX variable=Scanner.NextXXX就可以获取一个输入值。next系列的方法,他们的作用都是从键盘中接收数据。当程序执行到他们的时候,在命令行中就开始等待键盘输入了,而......
  • 文心一言 VS 讯飞星火 VS chatgpt (130)-- 算法导论11.2 2题
    二、用go语言,对于一个用链接法解决冲突的散列表,说明将关键字5,28,19,15,20,33,12,17,10插入到该表中的过程。设该表中有9个槽位,并设其散列函数为h(k)=kmod9。文心一言:在这个问题中,我们使用Go语言来解决一个散列(Hash)表的问题,该问题需要我们使用链接法解决冲突。我们的散列......
  • 文心一言 VS 讯飞星火 VS chatgpt (129)-- 算法导论11.1 4题
    四、用go语言,我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典。开始时该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个存储对象占用O(1)空间;SEARCH、INSERT和DELETE操......
  • Xlinx FPGA for DSP CORDIC 算法
    https://wenku.baidu.com/view/6c623aa8910ef12d2bf9e732.html?_wkts_=1701401816748&needWelcomeRecommand=1           ......
  • 从字符串中分离文件路径,文件名及文件扩展名
    从字符串中分离文件路径,文件名及文件扩展名如一个文件:D:\文档\C#BASE\StringBuilder.md要分离出文件路径:D:\文档\C#BASE\文件名:StringBuilder文件扩展名:md这是我们要拿到“\”和“.”这两个字符最后出现的索引stringpath="D:\文档\C#BASE\StringBuilder.md";inti=path.la......
  • Linux查找java安装路径
    先看java-version$javaversion"1.8.0_111"Java(TM)SERuntimeEnvironment(build1.8.0_111-b14)JavaHotSpot(TM)64-BitServerVM(build25.111-b14,mixedmode)然后:echo$JAVA_HOME不一定有如果没有,那就要找一下先$whichjava/usr/bin/java再找到/usr/bin/java的超链接......
  • 单调栈与单调队列算法总结
    单调栈知识概览单调栈最常见的应用是找到每一个数离它最近的且比它小的数。单调栈考虑的方式和双指针类似,都是先想一下暴力做法是什么,然后再挖掘一些性质如单调性,最终可以把目光集中在比较少的状态中,从而达到降低时间复杂度的作用,都是算法优化的一种手段。对于的情况,更有可能......
  • 代码随想录算法训练营第六天| 454.四数相加 15.三数之和 18.四数之和
    LeetCode454.四数相加题目链接:LeetCode454思路: 将两个数组中的数存放到一个map中,用另外两个数组的值在map中去减 classSolution{public:intfourSumCount(vector<int>&A,vector<int>&B,vector<int>&C,vector<int>&D){unordered_map&l......
  • 扩展欧几里得算法
    扩展欧几里得算法裴蜀定理(Bézout'slemma)定义设\(a,b\)是不全为零的整数,对任意整数\(x,y\),满足\(\gcd(a,b)\midax+by\),且存在整数\(x,y\),使得\(ax+by=\gcd(a,b)\).证明对于第一点由于\(\gcd(a,b)\mida,\gcd(a,b)\midb\)所以\(\gcd(a,b)\midax,\gcd(a,b)\mid......