A*算法详解(新手入门)——图文并茂,学习笔记分享

news2025/4/6 10:42:48

前言

本文是博主在学习A*算法时做的一个小案例,有不懂的地方可以私信博主一起讨论学习,由于博主水平有限,可能存在部分知识点遗漏或书写不够严谨,欢迎各位志同道合的朋友批评指教,博主定当虚心学习,感谢各位阅读。

一. 基本概念

A*算法在Dijkstra算法的基础上引入了启发函数,启发函数是对当前节点到目标节点所需代价的预估,有助于提高搜索速度。相较于Dijkstra算法,A*算法搜索最短路径的效率更高。启发式函数一般使用曼哈顿距离、欧几里德距离。原理:从起点开始不断向目标点的方向遍历(常见的遍历方式分为八邻域、四邻域),并记录下每一个遍历点的父节点(找到目标点后回溯路径),反复循环,直到搜索到目标点后停止,再从目标点回溯起点,找到成本最小的路径。

优点:启发式函数能提高算法的运行效率,更快的找到最优路径。

缺点:地图尺寸过大或精度过高时,需要搜索的节点数量较多,搜索速度慢。

成本函数: 

是从起点到目标点的成本估计; 是起点到达中间点的实际成本;中间点到目标点的估计距离。

假设起点:;中间点:;目标点:

实际距离:

曼哈顿距离(如图1):

图1

欧几里德距离(如图2):

图2

二. 寻路实例

这里通过一个实例来记录我学习A*寻路算法的全过程:以采用曼哈顿距离为估计代价的成本函数为例(因为欧几里德距离的计算涉及到平方和开根号,步骤更加复杂,对算力的要求更高,所以一般采用曼哈顿距离),深蓝色为障碍物,两个绿色点分别为起始点和目标点(前文已做假设),将横直线移动一格的距离记作10,斜移一格的距离记作14。

在实例中建立两个集合,分别是openlis和closelist。openlis用于记录所有已经遍历过的点(图中的红色格子),这些点可以被重复遍历并更新距离成本;closelist用于记录在当前位置所有遍历点中距离成本最小的点(来源于closelist集合,图中的浅蓝色格子),且放入closelist集合里的点不再重复遍历更新。

1.遍历起始点附近邻域的八个点(由于起始点位置原因例中只有五个),并通过代价函数计算邻域中每一个点的距离成本(已写在每个格子中),此轮遍历距离成本最小的点为10+130=144,将此点放入closelist中,并标记为浅蓝色,如图3。

图3

2.遍历图3中距离成本最小的点的附近邻域,同样通过代价函数计算邻域中每一个点的距离成本(如图4),此轮距离成本最小的点为28+110=138,将此点放入closelist中,并标记为浅蓝色。

图4

3.每一轮遍历都是按照此原理进行的,没有特殊情况便不再过多赘述,下面直接给出几轮遍历的结果(图5-图7),遇到特殊情况,后文会给出详细解释。

图5

图6

图7

4.图7中选出的上一轮成本最小的点为62+70=132,但遍历此点的邻域后发现此点邻域并不存在openlis中成本最小的点,所以此时从openlis中选出成本最小的点不再是62+70=132这个点的邻域(每一轮都是从openlis中选取最小的点放入colselist中,只是前几轮成本最小的点刚好在上一轮最小点的邻域)。如图8:此轮从openlis中选出的最小点是38+100=138(注意:此时出现了两个最小点,读者可以根据自己的习惯,在算法中设置优先选择先遍历到的那个点或者后遍历到的那个点。这里的两个点虽然都是第二轮最小点28+110=138的邻域,看似不能判断其先后顺序,但可在算法中设置遍历一个点邻域的顺序,这里假设从此邻域的正右方邻域顺时针计算每个邻域的距离,那么28+110=138正上方的点便是后遍历到的那个最小点),为了方便对比这两个点的区别,我在这里同时选中了这两个点放入colselist中,并同时计算两个点的邻域,这一轮遍历出现了对openlis中距离成本的更新(黄色字体为本轮遍历距离小于此前遍历距离的点,并更新了数据。注意:更新后的点,父节点也会随之改变为前一轮最小的点)。

图8

5.从上一轮遍历后的openlis中选出距离成本最小的点,刚好是上一轮更新的点48+90=138。

图9

6.图10中选出的上一轮成本最小的点为58+80=138,但遍历此点的邻域后发现此点邻域并不存在openlis中成本最小的点,所以此时从openlis中选出成本最小的点不再是58+80=138这个点的邻域,而是整个openlis中距离成本最小的点24+122=144,这一轮我依旧选择了两个点,如图11,同前文不再赘述。

图10

图11

7.我在此实例中遇到的特殊情况和要说明的重点基本讲完,下面我会直接给出每一轮遍历的结果。

图12

图13

图14

图15

图16

图17

图18

8.A*算法经过启发式遍历,最终找到了目标点,根据父节点的记录,从目标点向起始点回溯,找到了最短路径——黄色格子连线。(这里提出一个疑惑点:在图19的路径中从44+100=144这个点向58+80=138这个点移动时,需要从障碍物边缘经过,但不能保证机器人或车辆不碰到障碍物,如何通过优化算法来解决这个问题,欢迎大家评论区或私信讨论)

图19

9.以上实例是A*算法八邻域搜索的结果,在同样的条件下四邻域搜索的结果如图20和图21。图20和图21的区别是:当openlis中出现多个相同距离的最小点时,优先选择最先遍历的点和最后遍历的点。

图20

图21

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

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

相关文章

初学STM32系统时钟设置

资料来自正点原子 在学习江科大教程示例的时候默认系统时钟是72MHZ,但是这个系统时钟是怎么过来的呢,通过时钟树以及相关的资料的学习可知,系统时钟它可以是内部RC时钟HSI 8MHZ通过锁相环倍频而来,也可以是外部晶振4-16MHZ通过锁相…

如何在 Windows 10 上安装 PyGame

PyGame 是 Python 编程语言中的一组跨平台模块,这意味着您可以在任何操作系统上安装它,这篇文章告诉您如何在 Windows 10 上安装 PyGame。 如何在 Windows 10 上安装 PyGame? PyGame 依赖于 Python,这意味着您必须在安装 PyGame …

STM32 × CLion 新建项目

STM32 CLion 新建项目 新建和配置一个 STM32 项目 1 创建项目 假如是 ST 官方开发板,比如 NUCLEO 板,选择从 ST 板创建 假如是单芯片或淘宝买的那种 F103 开发板,选择从 MCU 创建 2 STM CubeMX 配置 2.1 Pinout & Configuration 外…

WebSocket 详解:构建一个复杂的实时聊天应用

文章目录 一、前言二、WebSocket 基础2.1 WebSocket 与 HTTP 的区别2.2 WebSocket 的优点 三、搭建 WebSocket 服务端3.1 安装 ws 和 redis 库3.2 创建 WebSocket 服务端3.3 创建用户身份验证 四、前端实现 WebSocket 客户端4.1 创建 Vue 3 项目4.2 实现 WebSocket 连接和用户注…

python爬虫:小程序逆向实战教程

根据我之前发表的文章,我们进行延伸实战https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序,我们进行搜索 2. 找到我们vx小程序的文件地址,我们就可以进行破解 破解步骤强看…

day 8 TIM定时器

一、STM32 定时器概述 1. 定时器的概述定时器的基本功能,但是 STM32 的定时器除了具有定时功能之外,也具有定时器中断功能,还具有输入捕获(检测外部信号)以及输出比较功能(输出不同的脉冲)&…

全星 研发项目管理APQP 软件:驱动汽车及制造业研发升级的数字化引擎

全星 APQP 软件:驱动汽车及制造业研发升级的数字化引擎 在汽车及制造业竞争白热化的当下,如何高效推进研发项目,同时确保严格合规,成为企业亟待解决的难题。 全星研发项目管理 APQP 软件系统,凭借卓越的功能与显著优势…

【VUE】RuoYi-Vue3项目结构的分析

【VUE】RuoYi-Vue3项目结构的分析 1. 项目地址2. RuoYi-Vue3项目结构2.1 整体结构2.2 package.json2.2.1 🧾 基本信息2.2.2 🔧 脚本命令(scripts)2.2.3 🌍 仓库信息2.2.4 📦 项目依赖(dependenc…

智能体和RPA都需要程序思维,如何使用影刀的变量?

欢迎来到涛涛聊AI, 不管AI还是RPA,都需要用到编程思想才能完成批量工作。今天研究了下影刀的变量。 变量类型 根据变量值选择相应的类型,可选择任意一种影刀所支持的数据类型 变量值 指定变量中保存的值,会根据不同的类型设置…

论文笔记(七十五)Auto-Encoding Variational Bayes

Auto-Encoding Variational Bayes 文章概括摘要1 引言2 方法2.1 问题场景2.2 变分下界2.3 SGVB估计器与AEVB算法2.4 重参数化技巧 3 示例:变分自编码器(Variational Auto-Encoder)4 相关工作5 实验6 结论7 未来工作 文章概括 引用&#xff1…

Sentinel[超详细讲解]-7 -之 -熔断降级[异常比例阈值]

📖 主要讲解熔断降级之 --- 异常比例阈值 🚀 1️⃣ 背景 Sentinel 以流量作为切入点,提供了很多的丰富的功能,例如🤗: 流量控制,熔断降级等,它能够有效的适用各个复杂的业务场景&am…

C++11观察者模式示例

该示例代码采用C11标准&#xff0c;解决以下问题&#xff1a; 消除了类继承的强耦合方式&#xff1b;通知接口使用可变参数模板&#xff0c;支持任意参数&#xff1b; 示例代码 .h文件如下&#xff1a; #include <functional> #include <string> #include <…

win10 笔记本电脑安装 pytorch+cuda+gpu 大模型开发环境过程记录

win10 笔记本电脑安装 pytorchcudagpu 大模型开发环境过程记录 文章部分内容参考 deepseek。 以下使用命令行工具 mingw64。 安装 Anaconda 安装位置&#xff1a; /c/DEVPACK/Anaconda3 然后安装 Python 3.10.16 &#xff08;略&#xff09; $ conda create -n pytorch_…

Layout Inspector平替跨平台布局分析器のAppium Inspector

引言 因为我有一个api为26的设备&#xff0c;因为 Layout Inspector 无法在 API 26 以下设备上使用&#xff0c;并且现在AS的 Hierarchy Viewer 和Android Device Monitor 均已经在SDK中剔除&#xff0c;故想再搜一个pc版的布局查看器&#xff0c;发现Appium Inspector学习成本…

常见NLP指标PPL,F1,Rouge-L,Accuracy (CLS),Accuracy (EM)总结

常见NLP指标PPL&#xff0c;F1&#xff0c;Rouge-L总结 1.PPL 2.F1 3.Rouge-L 4.Accuracy (CLS) 5.Accuracy (EM)

Redis数据结构之ZSet

目录 1.概述2.常见操作2.1 ZADD2.2 ZRANGE2.3 ZREVRANGE2.4 ZRANGEBYSCORE2.5 ZSCORE2.6 ZCARD2.6 ZREM2.7 ZINCRBY2.8 ZCOUNT2.9 ZMPOP2.10 ZRANK2.11 ZREVRANK 3.总结 1.概述 ZSet和Set一样也是String类型元素的集合&#xff0c;且不允许重复的成员&#xff0c;不同的是ZSet…

磁盘分析工具合集:告别C盘焦虑!

今天李师傅带大家盘点五款硬盘空间分析利器&#xff0c;帮你精准定位那些"吃空间"的元凶&#xff0c;让C盘告别臃肿烦恼&#xff01; 一、WizTree 这款NTFS磁盘的"透视眼"堪称效率典范。它通过直接读取硬盘主文件表(MFT)实现秒级扫描&#xff0c;1TB机械…

20250405在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统来适配gmac1

【暂时还没有解决让PRO-RK3566的eth0/gmac1开机就启动】 PRO-RK3566作为iperf服务器&#xff1a; rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/# ifconfig -a rootrk3566-buildroot:/# ifconfig eth0 up rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/…

每日一题(小白)模拟娱乐篇14

直接理解题意&#xff0c;一分钟扩散一次&#xff0c;那么2020分钟也就是需要循环2020次&#xff0c;然后加入扩散后的条件&#xff0c;每一个次扩散使方格子的总量1&#xff08;只要有一个点扩散就无需看其他的点&#xff09;&#xff0c;若干次循环过后总数之和即所有黑色格子…

使用 Python 爬取并打印双色球近期 5 场开奖数据

使用 Python 爬取并打印双色球近期 5 场开奖数据 前期准备安装所需库 完整代码代码解析 1. 导入必要的库2. 定义函数 get_recent_five_ssq 3. 设置请求的 URL 和 Headers 4. 发送请求并处理响应5. 解析 HTML 内容6. 提取并打印数据7. 错误处理 首先看下运行的效果图&#xff1a…