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

求节点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

从0点出发,到 相邻的节点 1、7
0->1 = 4 , 节点 1 此时为 ∞,因此 节点 1 的 距离 标为 4,前序节点为 0
0->7 = 8 , 节点 7 此时为 ∞,因此 节点 7 的 距离 标为 8,前序节点为 0
从未标记最优节点(1~8)中,找距离出发点最小的节点 => 1
| 节点 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 最优节点 | ️ | ||||||||
| 0 出发 | 0 | 4 | ∞ | ∞ | ∞ | ∞ | ∞ | 8 | ∞ |
| 前序点 | 0 | 0 |
更新1邻近节点2、7
上一次的最优节点是 1

从0点出发,到 节点 1 相邻的节点 2、7
0->1->2 = 4 + 8 = 12 , 节点 2 此时为 ∞,因此 节点 2 的 距离 标为 12,前序节点为 1
0->1->7 = 4 + 11 = 15 , 节点 7 已有值 8,8<15,因此 节点7 的 距离、前序节点保持不变
从未标记最优节点(2~8)中,找距离出发点最小的节点 => 7
| 节点 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 最优节点 | ️ | ||||||||
| 0 出发 | 0 | 4 | 12 | ∞ | ∞ | ∞ | ∞ | 8 | ∞ |
| 前序点 | 0 | 1 | 0 |
更新7邻近节点 8、6
上一次的最优节点是 7

从0点出发,到 节点 7 相邻的节点 8、6
0->7->8 = 8 + 7 = 15 , 节点 8 此时为 ∞,因此 节点 8 的 距离 标为 15,前序节点为 7
0->7->6 = 8 + 1 = 9 , 节点 6 此时为 ∞,因此 节点 6 的 距离 标为 9,前序节点为 7
从未标记最优节点(2~6、8)中,找距离出发点最小的节点 => 6
| 节点 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 最优节点 | ️ | ||||||||
| 0 出发 | 0 | 4 | 12 | ∞ | ∞ | ∞ | 9 | 8 | 15 |
| 前序点 | 0 | 1 | 7 | 0 | 7 |
更新6邻近节点 8、5
上一次的最优节点是 6

从0点出发,到 节点 6 相邻的节点 8、5
0->7->6->8 = 8 + 1 + 6 = 15 , 节点 8 已有值 15,15=15,因此 节点 8 的 距离、前序节点保持不变
0->7->6->5 = 8 + 1 + 2 = 11 , 节点 5 此时为 ∞,因此 节点 5 的 距离 标为 11,前序节点为 6
从未标记最优节点(2~5、8)中,找距离出发点最小的节点 => 5
| 节点 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 最优节点 | ️ | ||||||||
| 0 出发 | 0 | 4 | 12 | ∞ | ∞ | 11 | 9 | 8 | 15 |
| 前序点 | 0 | 1 | 6 | 7 | 0 | 7 |
更新5邻近节点 2、3、4
上一次的最优节点是 5

从0点出发,到 节点 5 相邻的节点 2、3、4
0->7->6->5->2 = 8 + 1 + 2 + 4 = 15 , 节点 2 已有值 12,12<15,因此 节点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
从未标记最优节点(2、3、4、8)中,找距离出发点最小的节点 => 2
| 节点 | 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邻近节点 3、8
上一次的最优节点是 2

从0点出发,到 节点 2 相邻的节点 3、5、8,节点5已标记,所以不处理节点5
0->1->2->3 = 4 + 8 + 7 = 19 , 节点 3 已有值 25,25>19,因此 节点 3 的 距离 标为 19,前序节点为 2
0->1->2->8 = 4 + 8 + 2 = 14 , 节点 8 已有值 15,15>14,因此 节点 8 的 距离 标为 14,前序节点为 2
从未标记最优节点(3、4、8)中,找距离出发点最小的节点 => 8
| 节点 | 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 |
更新8邻近节点
上一次的最优节点是 8

8的邻近节点,2、7、6 都已被标记为最优节点,所以不需要处理
从未标记最优节点(3、4)中,找距离出发点最小的节点 => 3
| 节点 | 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邻近节点
上一次的最优节点是 3

最优节点3的邻近节点:2、5、4中 2、5都已被标记为最优节点,处理 4
0->1->2->3->4 = 19 + 9 = 28 , 节点 4 已有值 21,21<28,因此 节点 4 的 距离 、前序节点保持不变
从未标记最优节点(4)中,找距离出发点最小的节点 => 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 |
已时已全部结束
最短距离
从出发点0 到节点 4 的最短距离 = 21
最短路径
反向追溯
4 的前序节点 5,5的前面是 6 ... => 4 -> 5 -> 6 -> 7 -> 0
因此 0 -> 7 -> 6 -> 5 -> 4 是最短路径
https://www.bilibili.com/video/BV1zz4y1m7Nq
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法的更多相关文章
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- (Dijkstra)迪杰斯特拉算法-最短路径算法
迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想:设G=(V,E)是一个带权有向图 ...
- 最短路径之迪杰斯特拉算法的Java实现
Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...
- 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)
上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...
- 最短路径之迪杰斯特拉算法(Java)
1)Dijkstra算法适用于求图中两节点之间最短路径 2)Dijkstra算法设计比较巧妙的是:在求源节点到终结点自底向上的过程中,源节点到某一节点之间最短路径的确定上(这也是我之前苦于没有解决的地 ...
- Dijkstra(迪杰斯特拉)算法求解最短路径
过程 首先需要记录每个点到原点的距离,这个距离会在每一轮遍历的过程中刷新.每一个节点到原点的最短路径是其上一个节点(前驱节点)到原点的最短路径加上前驱节点到该节点的距离.以这个原则,经过N轮计算就能得 ...
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP
文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...
随机推荐
- 应用性能监控工具(pinpoint)部署
Pinpoint是一款全链路分析工具,提供了无侵入式的调用链监控.方法执行详情查看.应用状态信息监控等功能.pinpoint使用HBASE储存数据. 下面介绍pinpoint部署及应用. 1. 安装 ...
- sql-labs--Less-1--Error based-Single quotes
sql="SELECT * FROM users WHERE id='id' LIMIT 0,1"; 打开第一关,我们看到如下界面,上面写着Please input the ID ...
- prometheus 监控实战篇
prometheus 监控 目录 prometheus 监控 1.上传tar包 2.解压到对应文件夹 3.配置开机自启动 4.配置Prometheus 5.black_exporter 监控网站状态 ...
- 【krpano】KRPano打开黑屏: FATAL ERROR
在KRPano开发过程中,初学者打开项目经常遇到如下的问题: FATAL ERROR:tour.xml – loading failed! (0) 或者是: ERROR:Local usage wit ...
- 文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题
四.用go语言,重写 ENQUEUE 和 DEQUEUE 的代码,使之能处理队列的下溢和上溢. 文心一言: 在 Go 语言中,我们可以使用切片来实现队列.下面是如何实现 ENQUEUE 和 DEQUE ...
- MySQL系列之主从复制基础——企业高可用性标准、主从复制简介、主从复制前提(搭建主从的过程)、主从复制搭建、主从复制的原理、主从故障监控\分析\处理、主从延时监控及原因
文章目录 0.企业高可用性标准 *** 0.1 全年无故障率(非计划内故障停机) 0.2 高可用架构方案 1. 主从复制简介 ** 2. 主从复制前提(搭建主从的过程) *** 3. 主从复制搭建(C ...
- ModuleNotFoundError: No module named 'qrcode'
W File "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/candidates.py", ...
- 关于C++拷贝控制
通常来说,对于类内动态分配资源的类需要进行拷贝控制:要在拷贝构造函数.拷贝赋值运算符.析构函数中实现安全高效的操作来管理内存.但是资源管理并不是一个类需要定义自己的拷贝控制成员的唯一原因.C++ Pr ...
- 04-Shell字符串变量
1. 字符串变量的三种方式 字符串(String)就是一系列字符的组合.字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了) 单引号方式 双引号方式, 推荐 不用引号 ...
- EMC ndmp NAS
NAS 是带存储系统的专用高性能文件服务器.它可提供文件级数据访问和共享. NAS 使用网络和文件共享协议,包括用于数据传输的 TCP/IP 以及用于远程文件服务的 CIFS 和 NFS. 最简单的备 ...