图的搜索(二):贝尔曼-福特算法、狄克斯特拉算法和A*算法

news2024/12/27 12:41:39

图的搜索(二):贝尔曼-福特算法、狄克斯特拉算法和A*算法

贝尔曼-福特算法

贝尔曼-福特(Bellman-Ford)算法是一种在图中求解最短路径问题的算法。最短路径问题就是在加权图指定了起点和终点的前提下,寻找从起点到终点的路径中权重总和最小的那条路径。

在这里插入图片描述

设置A为起点,G为终点。

在这里插入图片描述

首先设置各个顶点的初始权重 :起点为 0,其他顶点为无穷大(∞)。这个权重表示的是从 A 到该顶点的最短路径的暂定距离。随着计算往下进行,这个值会变得越来越小,最终收敛到正确的数值。

在这里插入图片描述

选中候补顶点,分别计算这条边从一端到另一端的权重,计算方法为:“顶点原本的权重+边的权重”

在这里插入图片描述

计算权重,如果计算结果小于顶点的值,就更新这个值。

如图,计算A到B的权重:顶点 B 的权重是无穷大,比 9 大,所以把它更新为 9。更新时需要记录计算的是从哪个顶点到该顶点的路径。

再次计算B到A的权重:B 的权重为 9,从 B 到 A 的权重便为 9+9=18。与顶点 A 现在的值 0 进行比较,因为现在的值更小,所以不更新。

A到C的路径计算同理。接下来计算B到C的路径。

在这里插入图片描述

在进行B-C计算时,发现A-C-B的路径比A-B的路径更短,于是更新如下:

在这里插入图片描述

接着对所有的边进行更新操作

在这里插入图片描述

更新完所有的边后,第 1 轮更新就结束了。接着,重复对所有边的更新操作,直到权重不能被更新为止。

在这里插入图片描述

第二轮更新后,顶点 B 的权重从 8 变成了 7,顶点 E 的权重从 9 变成了 8。接着进行第三轮更新。发现第三轮更新后,所有顶点的权重不再更新,操作结束。算法的搜索流程也就此结束,我们找到了从起点到其余各个顶点的最短路径。

在这里插入图片描述

根据搜索结果可知,从起点 A 到终点 G 的最短路径是 A-C-D-F-G,权重为 14。

将图的顶点数设为 n、边数设为 m。该算法经过 n 轮更新操作后就会停止,而在每轮更新操作中都需要对各个边进行 1 次确认,因此 1 轮更新所花费的时间就是 O(m),整体的时间复杂度就是 O(nm)。

有向图与以上步骤相同,只需按照边所指向的方向来计算即可。

计算最短路径时,边的权重代表的通常都是时间、距离或者路费等,因此基本都是非负数。不过,即便权重为负,贝尔曼 - 福特算法也可以正常运行。

如果闭环中有负数权重,就不存在最短路径。

狄克斯特拉算法

狄克斯特拉( Dijkstra)算法也是求解最短路径问题的算法,使用它可以求得从起点到终点的路径中权重总和最小的那条路径。

在这里插入图片描述

仍然设A为起点,G为终点。

在这里插入图片描述

与贝尔曼-福特算法相同,将起点设置为0,其他顶点设置为无穷大。设置从A出发,寻找可以从目前所在的顶点直达且尚未被搜索过的顶点,此处为顶点 B 和顶点 C,将它们设为下一步的候补顶点。

在这里插入图片描述

计算后结果如上图。计算方法是“目前所在顶点的权重+目前所在顶点到候补顶点的权重”。与贝尔曼-福特算法类似。

在这里插入图片描述

**从候补顶点中选出权重最小的顶点。**此处 B 的权重最小,那么路径 A-B 就是从起点 A 到顶点 B 的最短路径。确定了最短路径,移动到顶点B。

在这里插入图片描述

将可以从顶点B直达的顶点设为新的候补顶点,于是顶点 D 和顶点 E 也成为了候补。目前有三个候补顶点 C、D、E。

在这里插入图片描述

同理。在计算B到各顶点值后,比较各点值大小。其中B-C点的权重为8>5,所以不更新。确认了最短路径,移动到顶点D。计算D-E的权重为7>5,发现并不需要更新它。现在,有两个候补顶点(C和E)权重均为5,选择哪一个向下计算都可以。以下先选择C。

在这里插入图片描述

算出F点的权重后,回到E进行计算。

在这里插入图片描述

此时算出G点的权重为14。再次回到F,对F-G的权重进行计算得20>14。故G的最小权重为14。

在这里插入图片描述

最终得到的这颗橙色的树就 是最短路径树,它表示了起点到达各个顶点的最短路径。

比起需要对所有的边都重复计算权重和更新权重的贝尔曼 - 福特算法,狄克斯特拉算法多了一步选择顶点的操作,这使得它在求最短路径上更为高效。

将图的顶点数设为 n、边数设为 m,那么如果事先不进行任何处理,该算法的时 间复杂度就是 O( n²)。不过,如果对数据结构进行优化,那么时间复杂度就会变为 O(m + nlogn)。

有负数权重时不能使用狄克斯特拉算法

不存在负数权重时,更适合使用效率较高的狄克斯特拉算法,而存 在负数权重时,即便较为耗时,也应该使用可以得到正确答案的贝尔曼 - 福特算法。

A*算法

A*(A-Star)算法也是一种在图中求解最短路径问题的算法,由狄克斯特拉算法发展而来。

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

在这里插入图片描述

先使用狄克斯特拉算法来求解以上迷宫的最短路径。

将迷宫看作是一个图,其中每个方块都是一个顶点,各顶点间的距离(权重)都为 1。

在这里插入图片描述

用狄克斯特拉算法求最短路径的结果会如上图所示,方块中的数字表示从起点到该顶点的距离(权重),蓝色和橙色的方块表示搜索过的区域,橙色方块同时还表示从 S 到 G 的最短路径。

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

在这里插入图片描述

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

由人工预先设定的估算距离被称为**“距离估算值”。如果事先根据已知信息设定合适的距离估算值,再将它作为启发信息辅助计算,搜索就会变得更加高效。这样的算法也成为启发式算法**。

在这里插入图片描述

从起点开始搜索。分别计算起点周围每个顶点的权重。计算方法是“从起点到该顶点的距离”(方块左下)加上 “距离估算值”(方块右下)。

在这里插入图片描述
选择一个权重最小的顶点,用橙色表示,并继续向后搜索。

在这里插入图片描述

按照顺序继续向下搜索。

在这里插入图片描述

在这里插入图片描述

搜索完毕如上图。可以看出基本不回去计算离终点太远的区域。

如果我们能得到一些启发信息,即各个顶点到终点的大致距离(这个距离不需是准确的值)我们就能使用 A* 算法。当然,有时这类信息是完全无法估算的,这时就不能使用 A* 算法。

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

不过,当距离估算值小于实际距离时,是一定可以得到正确答案的(只是如果没有设定合适的距离估算值,效率会变差)。

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

参考资料:我的第一本算法书 (石田保辉 宮崎修一)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教3妹学编程-算法题】下一个更大元素 IV

3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包” 2哥 :3妹,什么事呀这么开发。 3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。 2哥&#x…

计算机网络:应用层(一)

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

STM32单片机项目实例:基于TouchGFX的智能手表设计(4)LPBAM的应用

STM32单片机项目实例:基于TouchGFX的智能手表设计(4)LPBAM的应用 目录 一、概述 二、LPBAM简介 2.1 支持 LPBAM 的外设 三、LPBAM硬件机制 3.1 电源和时钟架构 3.2 速度限制 3.3 LPGPIO_IOToggle实验 一、概述 STM32U5 系列微控制器基…

星际飞船大战

欢迎来到程序小院 星际飞船大战 玩法:滑动鼠标控制方向,点击鼠标左键射击,生命值100分,被敌船击中减去20, 5次生命复活机会,统计分数,快去星际飞船大战吧^^。开始游戏https://www.ormcc.com/pl…

深度解读 Cascades 查询优化器

数据库中查询优化器是数据库的核心组件,其决定着 SQL 查询的性能。Cascades 优化器是 Goetz 在 volcano optimizer generator 的基础上优化之后诞生的一个搜索框架。 本期技术贴将带大家了解 Cascades 查询优化器。首先介绍 SQL 查询优化器,接着分析查询…

css 表示具有特定类或者其他属性的某种标签类型的元素

需求 通过 css 选择器获取某种标签&#xff08;如&#xff1a;div、input 等&#xff09;具有某个属性&#xff08;如&#xff1a;class、id 等&#xff09;的元素&#xff0c;从而修改其样式。 代码 通过 [标签].[属性] 的方式来获取 <div class"test">&l…

HyperGCN笔记

1 Title HyperGCN: A New Method of Training Graph Convolutional Networks on Hypergraphs&#xff08;Naganand Yadati、Prateek Yadav、Anand Louis、Madhav Nimishakavi、Vikram Nitin、Partha Talukdar&#xff09;【NeurIPS 2019】 2 Conclision This paper proposes H…

gprMax安装步骤

本来是想直接在base环境下直接弄的&#xff0c;但是报错了&#xff0c;因为base环境里的conda版本不匹配&#xff0c;于是重新建立虚拟环境gprMax&#xff0c;如下所示。 然后激活建立的gprMax环境&#xff0c;在gprMax环境中安装git 参考文章&#xff1a; https://zhuanlan.…

mysqldump --set-gtid-purged参数详解

在开启了GTID模式的数据库&#xff0c;使用mysqldump进行部分数据备份的时候&#xff0c;经常会遇到如下警告 Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of t…

『 Linux 』进程地址空间概念

文章目录 &#x1fad9; 前言&#x1fad9; 进程地址空间是什么&#x1fad9; 写时拷贝&#x1fad9; 可执行程序中的虚拟地址&#x1fad9; 物理地址分布方式 &#x1fad9; 前言 在c/C中存在一种内存的概念; 一般来说一个内存的空间分布包括栈区,堆区,代码段等等; 且内存是…

智慧机房与3D机房动环监控系统的应用

智慧机房是什么&#xff1f; 智慧机房是集采集信息、实时监控、数据分析、统一管理、故障告警等功能于一体的全方位、立体化的智能环境监控系统&#xff0c;构建物联网、大数据和云计算背景下现代企业的“数据心脏”。它能为机房管理者呈现细致入微的关键性数据&#xff0c;优…

Error: Failed to resolve vue/compiler-sfc——vite项目启动报错——npm run serve

运行项目时&#xff0c;报错如下&#xff1a; Error: Failed to resolve vue/compiler-sfc 根据报错信息的提示&#xff1a;vue的版本必须大于3.2.25&#xff0c;经过查看package.json文件&#xff0c;可以看到vue的版本为3.2.36&#xff0c;是满足条件的。 因此考虑缓存问题&…

Git 硬重置之后恢复历史提交版本

****硬重置之前一定要备份分支呀&#xff0c;谨慎使用硬重置&#xff0c;特别是很多人一起使用的分支**** 如果你在reset的时候选择了Hard选项&#xff0c;也就是硬重置 重置完且push过&#xff0c;那么被你本地和远端后面的提交记录肯定就会被抹去。 解决办法&#xff1a; …

BearPi Std 板从入门到放弃 - 先天神魂篇(1)(RT-Thread 指令点亮LED)

简介 使用 BearPi IOT Std板&#xff0c; 开发板简单信息 主芯片: STM32L431RCT6 串口: Usart1 USER LED : PC13 E53_SC1 扩展板与主板连接: I2C : I2C1 (光照强度传感器&#xff1a;BH1750) LED: PB9RT-Thread 创建线程 线程的管理方式 添加用户代码 main.c #include <…

从零构建属于自己的GPT系列6:模型本地化部署2(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

adb命令学习记录

1、 adb ( android debug bridge)安卓调试桥&#xff0c;用于完成电脑和手机之间的通信控制。 xcode来完成对于ios设备的操控&#xff0c;前提是有个mac电脑。 安卓系统是基于linux内核来进行开发的。 2、adb的安装: 本身 adb是 android SDK 其中自带的工具&#xff0c;用于完…

山西电力市场日前价格预测【2023-12-09】

1.日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-09&#xff09;山西电力市场全天平均日前电价为366.40元/MWh。其中&#xff0c;最高日前电价为629.26元/MWh&#xff0c;预计出现在08:00。最低日前电价为216.58元/MWh&#xff0c;预…

PySpark大数据处理详细教程

欢迎各位数据爱好者&#xff01;今天&#xff0c;我很高兴与您分享我的最新博客&#xff0c;专注于探索 PySpark DataFrame 的强大功能。无论您是刚入门的数据分析师&#xff0c;还是寻求深入了解大数据技术的专业人士&#xff0c;这里都有丰富的知识和实用的技巧等着您。让我们…

使用工业级以太网交换机,需要注意哪些问题?

企业常用工业级以太网交换机进行网络组网&#xff0c;主要有两种情况。第一种是通过协议转换器将专线转换为以太网交换机&#xff0c;第二种是直接租用裸光纤。具体而言&#xff0c;在三、四层网络选择的三层交换机通常只能配置简单的动态路由协议、简单的策略路由和简单的访问…

如何管理大型网站的抓取预算

优化您的网站&#xff0c;以便 Google 更快地找到您的内容并将您的内容编入索引&#xff0c;这可以帮助您的网站获得更好的知名度和流量。 互联网是一个不断发展的虚拟世界&#xff0c;拥有超过 1 亿个网站。 你认为谷歌可以抓取世界上的每一个网站吗&#xff1f; 即使拥有谷…