A*算法详解(新手入门)——图文并茂,学习笔记分享
前言
本文是博主在学习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
相关文章:
A*算法详解(新手入门)——图文并茂,学习笔记分享
前言 本文是博主在学习A*算法时做的一个小案例,有不懂的地方可以私信博主一起讨论学习,由于博主水平有限,可能存在部分知识点遗漏或书写不够严谨,欢迎各位志同道合的朋友批评指教,博主定当虚心学习,感谢各…...
初学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 连接和用户注…...
详解七大排序
目录 一.直接插入排序 (1)基本思想 (2)算法步骤 (3)代码实现 (4)算法特性 (5)算法优化 (6)示例演示 二.希尔排序 (…...
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,都需要用到编程思想才能完成批量工作。今天研究了下影刀的变量。 变量类型 根据变量值选择相应的类型,可选择任意一种影刀所支持的数据类型 变量值 指定变量中保存的值,会根据不同的类型设置…...
详解 MySQL 三层 B+ 树能存多少数据的计算方法
MySQL三层B树能存多少数据 1. 内部节点(非叶子节点)的容量计算2. 叶子节点的数据记录容量3. 三层 B 树的存储能力计算4. 总结 1. 内部节点(非叶子节点)的容量计算 设定参数如下: P:每个节点页的大小&…...
论文笔记(七十五)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 未来工作 文章概括 引用࿱…...
Sentinel[超详细讲解]-7 -之 -熔断降级[异常比例阈值]
📖 主要讲解熔断降级之 --- 异常比例阈值 🚀 1️⃣ 背景 Sentinel 以流量作为切入点,提供了很多的丰富的功能,例如🤗: 流量控制,熔断降级等,它能够有效的适用各个复杂的业务场景&am…...
《基于 C++ 的怪物掉落武器功能开发》
一、项目背景 在游戏开发中,怪物掉落武器机制是丰富游戏玩法与提升玩家体验的关键部分。本功能基于 C 语言开发,旨在实现一套逻辑清晰、扩展性强的怪物掉落武器系统,为游戏核心玩法增添策略性与趣味性。 二、功能需求 (一&#…...
C++11观察者模式示例
该示例代码采用C11标准,解决以下问题: 消除了类继承的强耦合方式;通知接口使用可变参数模板,支持任意参数; 示例代码 .h文件如下: #include <functional> #include <string> #include <…...
算法设计学习10
实验目的及要求: 本查找实验旨在使学生深入了解不同查找算法的原理、性能特征和适用场景,培养其在实际问题中选择和应用查找算法的能力。通过实验,学生将具体实现多种查找算法,并通过性能测试验证其在不同数据集上的表现ÿ…...
configurable_alternatives 方法与使用技巧
核心功能与应用场景 在开发调试过程中,当需要动态替换链中的完整组件(如大语言模型、提示词模板等)并保持对话连续性时,可通过 configurable_alternatives() 实现运行时组件热替换。典型场景包括: 调试时切换不同版…...
Angular 2 模板语法详解
Angular 2 模板语法详解 引言 Angular 2 作为一款强大的前端框架,以其组件化的开发模式和高效的性能被众多开发者所青睐。模板语法是Angular 2中用于定义组件UI的关键部分。本文将详细介绍Angular 2的模板语法,帮助开发者更好地理解和运用这一功能。 模板语法概述 Angula…...
对称加密:原理、算法与应用全解析
对称加密作为密码学领域的核心技术,凭借其高效性与广泛应用,在数据安全领域占据重要地位。本文将从基础概念、历史发展、核心算法到实际应用场景,全方位解析对称加密技术的全貌,并探讨其面临的挑战与未来方向。 一、对称加密的核心…...
多线程编程中的锁策略
目录 1.悲观锁vs乐观锁 关键总结 悲观锁: 乐观锁: 选择建议 用 悲观锁 当: 用 乐观锁 当: 2.重量级锁vs轻量级锁 选择建议 用 轻量级锁: 用 重量级锁: 3.挂起等待锁vs自旋锁 关键细节说明 选择…...
win10 笔记本电脑安装 pytorch+cuda+gpu 大模型开发环境过程记录
win10 笔记本电脑安装 pytorchcudagpu 大模型开发环境过程记录 文章部分内容参考 deepseek。 以下使用命令行工具 mingw64。 安装 Anaconda 安装位置: /c/DEVPACK/Anaconda3 然后安装 Python 3.10.16 (略) $ conda create -n pytorch_…...
Layout Inspector平替跨平台布局分析器のAppium Inspector
引言 因为我有一个api为26的设备,因为 Layout Inspector 无法在 API 26 以下设备上使用,并且现在AS的 Hierarchy Viewer 和Android Device Monitor 均已经在SDK中剔除,故想再搜一个pc版的布局查看器,发现Appium Inspector学习成本…...
基于sklearn实现文本摘要思考
和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是: 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法: TF-IDF:基于词频-逆文档频…...
常见NLP指标PPL,F1,Rouge-L,Accuracy (CLS),Accuracy (EM)总结
常见NLP指标PPL,F1,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类型元素的集合,且不允许重复的成员,不同的是ZSet…...
使用binance-connector库获取Binance全市场的币种价格,然后选择一个币种进行下单
一个完整的示例,展示如何使用 api 获取Binance全市场的币种价格,然后选择一个最便宜的币种进行下单操作 代码经过修改,亲测可用,目前只可用于现货,合约的待开发 获取市场价格:使用client.ticker_price()获取所有交易对的当前价格 账户检查:获取账户余额,确保有足够的资…...
磁盘分析工具合集:告别C盘焦虑!
今天李师傅带大家盘点五款硬盘空间分析利器,帮你精准定位那些"吃空间"的元凶,让C盘告别臃肿烦恼! 一、WizTree 这款NTFS磁盘的"透视眼"堪称效率典范。它通过直接读取硬盘主文件表(MFT)实现秒级扫描,1TB机械…...
20250405在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统来适配gmac1
【暂时还没有解决让PRO-RK3566的eth0/gmac1开机就启动】 PRO-RK3566作为iperf服务器: rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/# ifconfig -a rootrk3566-buildroot:/# ifconfig eth0 up rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/…...
Spring / Spring Boot 的@MapperScan 和 @Repository
MapperScan 和 Repository 是两个与数据访问层相关的注解,它们在功能上有一定的联系,但也有明显的区别。 一、相同点 1. 都与数据访问层相关 MapperScan:用于扫描 MyBatis 的 Mapper 接口。MyBatis 是一个流行的持久层框架,Mapp…...
