1. Dijkstra算法

  • Dijkstra算法是求单源最短路径问题的算法,使用它可以求得从起点到终点的路径中权重总和最小的那条路径。
  • Dijkstra的主要特点是以起始点为中心向外层层拓展(广度优先搜索思想),直到拓展到终点为止。
  • 单源:从一个顶点出发,Dijkstra算法只能求一个顶点到其他点的最短距离而不能任意两点。

现在我们假设有下列的一副图,求起始点A到终点G的最短路径。其中边上面的数据表示权重,初始时刻,从起始点A开始,A的顶点值为0,其他顶点为无穷大(∞)。

寻找可以从目前所在的顶点直达且尚未被搜索过的顶点,此处为顶点B和顶点C,将它们设为下一步的候补顶点。并计算候补顶点的权重。比如起点A的权重是0,那么顶点B的权重就是0+2=2。用同样的方法计算顶点C,结果就是0+5=5。

如果计算结果小于候补顶点的值,就更新这个值。顶点B和顶点C现在的权重都是无穷大,大于计算结果,所以更新这两个顶点的值。更新步骤如下图:

从候补顶点中选出权重最小的顶点,并移动到最小顶点处。此处B的权重最小,那么路径 A-B 就是从起点 A 到顶点 B 的最短路径。因为如果要走别的路径,那么必定会经过顶点 C,其权重也就必定会高于 A-B 这条路径。

和上一步一样,更新顶点B的候补顶点,它的候补顶点为C、D和E,因为起初D和E都是无穷大,所以可以更新它。从B到C的权重为2+6=8,比C当前的权重5大,因此不更新这个值。在C、D和E中选取权重最小的顶点,也就是D。步骤如下图:

要重复执行同样的操作直到到达终点G为止。移动到顶点D后算出了E的权重,然而并不需要更新它(因为 3+4=7)。现在,两个候补顶点C和E的权重都为5,所以选择哪一个都可以。 此处我们选择C,于是起点A到顶点C的最短路径便确定了。然后移动到C点后,F成了新的候补顶点。

此时候补顶点中,E为5(因为上一步中我们选择了C,所以E依旧是候补顶点),F为13,所以我们选择权重更小的E,起点A到顶点E的最短路径也就确定了下来。此时候补顶点为G和F。

候补顶点为G为14,F为13,所以移动到F。如下图所示。

移动到F后,只剩下一个候补顶点G了,也就是终点G,顶点G的权重计算结果为13+7=20,比现在的值 14 要大,因此不更新它。也就找到了A到G的最短路径,也就是下图红色顶点标注位置A-B-E-G。

2. A星算法

A*(A-Star)算法也是一种在图中求解最短路径问题的算法,由狄克斯特拉算法发展而来。狄克斯特拉算法会从离起点近的顶点开始,按顺序求出起点到各个顶点的最短路径。也就是说,一些离终点较远的顶点的最短路径也会被计算出来,但这部分其实是无用的。与之不同,A* 就会预先估算一个值,并利用这个值来省去一些无用的计算。

我们先用狄克斯特拉算法求解下图中从起始点到终点最短路径。可以将每个方块都看做一个顶点,而各顶点之间的距离为1。 更新图的结果如下图所示。

狄克斯特拉算法只根据起点到候补顶点的距离来决定下一个顶点。因此,它无法发现蓝色箭头所指的这两条路径其实离终点越来越远,同样会继续搜索。

而A*算法不仅会考虑从起点到候补顶点的距离,还会考虑从当前所在顶点到终点的估算距离(启发式)。这个估算距离可以自由设定,此处我们用的是将顶点到终点的直线距离四舍五入后的值,如下图所示。

下面介绍A*算法的步骤。

首先把起点设为搜索完毕状态。搜索完的点都用蓝色表示。分别计算起点周围每个顶点的权重。计算方法是“从起点到该顶点的距离”(方块左下)加上“距离估算值”(方块右下)。

选择一个权重最小的顶点,用橙色表示,并将选择的顶点设为搜索完毕状态。

计算搜索完毕的顶点到下一个顶点的权重。选择距离最短的一个顶点。

将选好的顶点设为搜索完毕状态。之后重复上述操作,直到到达终点为止。

搜索完毕。效率比狄克斯特拉算法的高了很多。

距离估算值越接近当前顶点到终点的实际值,A* 算法的搜索效率也就越高;反过来,如果距离估算值与实际值相差较大,那么该算法的效率可能会比狄克斯特拉算法的还要低。如果差距再大一些,甚至可能无法得到正确答案。不过,当距离估算值小于实际距离时,是一定可以得到正确答案的(只是如果没有设定合适的距离估算值,效率会变差)。

A* 算法在游戏编程中经常被用于计算敌人追赶玩家时的行动路线等,但由于该算法的计算量较大,所以可能会使游戏整体的运行速度变慢。因此在实际编程时,需要考虑结合其他算法,或者根据具体的应用场景做出相应调整。


参考:《我的第一本算法书》

【算法】路径规划中的Dijkstra(狄克斯特拉)与A星算法相关推荐

  1. 最短路径--Dijkstra(狄克斯特拉)算法

    最短路径 路径的概念:       在一个无权的图中,若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减 1 .        由于从一顶点到另一顶 ...

  2. 用图讲解狄克斯特拉(DiskStra)算法,python实现 。

    最短路径 在一个带权图中,顶点V0到图中任意一个顶点Vi的一条路径所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径最短的那条路径称为最短路径. 如图所示,求双子峰到金门大桥的最短距离. 此 ...

  3. Dijkstra(狄克斯特拉)求加权重的邻接矩阵最短路径(初级版)

    算法 参考资源:https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/ 百度百科:迪杰斯特拉算法是 ...

  4. Dijkstra(狄克斯特拉) 算法

    文章目录 加权图 算法步骤 算法实现: 适用场景: 负权边 该算法是一种计算有向无环图最短路径的算法. 加权图 其中每个数字表示时间.要计算非加权图中的最短路径,可使用广度优先搜索.要计算加权图中的最 ...

  5. 狄克斯特拉(Dijkstra)算法原理详细解释与实现(python)

    目录 写在前面 1. 简介 2. 原理 2.1 找出最便宜的节点 2.2 计算前往该节点的各个邻居的开销 2.3 重复上面的步骤 实现 总结 写在前面 本文原理摘自<算法图解>这本书. 其 ...

  6. 算法快学笔记(十三):狄克斯特拉(Dijkstra)算法原理与实现

    1. 简介 广度优先算法可以找出段数最少的路径,但是对于路径上带权重的图,想要找出最快的路径,则需要使用狄克斯特拉算法. 2. 原理 为了说明狄克斯特拉算法的原理,使用换钢琴的的例子来做说明. 假设R ...

  7. 狄克斯特拉(Dijkstra)算法详解

    1.前言 最近在看<算法图解>,其中第七章狄克斯特拉算法个人感觉并没有讲的清楚,比如看完7.1节给人的感觉是狄克斯特拉算法会遍历图中的每一条边,后续狄克斯特拉不适用负权边的说法就站不住脚了 ...

  8. 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  9. 算法图解 第7章 狄克斯特拉算法

    本章内容 继续图的讨论,介绍加权图------提高或降低某些边的权重. 介绍狄克斯特拉算法,让你能够找出加权图中前往X的最短路径. 介绍图中的环,它导致狄克斯特拉算法不管用. 在前一章,你找出了从A点 ...

  10. 小白的算法初识课堂(part7)--狄克斯特拉算法

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 狄克斯特拉算法 具体步骤实现 术语 跳蚤市场 具体步骤实现 负权边 python实现 狄克斯特拉算法 在上一个 ...

最新文章

  1. 文本挖掘预处理之向量化与Hash Trick
  2. ip地址详解,ip地址各种写法的意义,私有局域网搭建(IPv4)
  3. 进程中dll模块的隐藏
  4. CentOS 6安装详解及PXE 安装
  5. 标签内超出的文字显示省略号
  6. [BZOJ1026] [SCOI2009] windy数 (数位dp)
  7. excel转las文件_这3种Word、Excel格式不变的互转方法,实在太好用了
  8. 《操作系统真象还原》——0.23 操作系统是如何识别文件系统的
  9. C++有符号和无符号数的转换
  10. java修改原有txt文件_(转)Java创建txt文件并进行读、写、修改操作
  11. 【转】 基于C#.NET的高端智能化网络爬虫 2
  12. ASP.NET Page执行顺序如:OnPreInit()、OnInit()(转)
  13. [非线性控制理论]8_三种鲁棒控制器的比较
  14. pandas数据处理操作大全
  15. java谜题读书笔记_《java深度历险》读书笔记(一)
  16. 天刀霸王枪服务器怎么维护了,霸王枪27日合服 11批天涯合服维护公告
  17. html表格标题居于标题左侧,css如何设置表格标题(caption标签)的位置
  18. 计算机文档排版的心得体会,排版心得体会-20210523074838.docx-原创力文档
  19. Vue-纯前端导出word文档 Can‘t find end of central directory:is this a zip file?
  20. java webclient使用,java – Spring Reactive WebClient

热门文章

  1. 简直太强,把任意图片设置为鼠标指针
  2. Echarts教程篇:概览
  3. Vue3使用echarts教程
  4. 18650锂电池保护板接线图_锂电池保护板的基础知识及常见不良分析
  5. 【雨滴风格 时间倒计时置顶显示小工具】
  6. 九月热点:EasyDL智能边缘控制台、EdgeBoard路内停车分析盒全新发布
  7. 软件测试--移动应用主要针对软测比赛(教程)
  8. 微信如何收发企业邮箱邮件
  9. java.net.UnknownHostException 异常处理
  10. 触摸屏驱动开发——转载