当前位置: 首页 > article >正文

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)示例演示 二.希尔排序 &#xff08…...

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 未来工作 文章概括 引用&#xff1…...

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

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

《基于 C++ 的怪物掉落武器功能开发》

一、项目背景 在游戏开发中,怪物掉落武器机制是丰富游戏玩法与提升玩家体验的关键部分。本功能基于 C 语言开发,旨在实现一套逻辑清晰、扩展性强的怪物掉落武器系统,为游戏核心玩法增添策略性与趣味性。 二、功能需求 (一&#…...

C++11观察者模式示例

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

算法设计学习10

实验目的及要求&#xff1a; 本查找实验旨在使学生深入了解不同查找算法的原理、性能特征和适用场景&#xff0c;培养其在实际问题中选择和应用查找算法的能力。通过实验&#xff0c;学生将具体实现多种查找算法&#xff0c;并通过性能测试验证其在不同数据集上的表现&#xff…...

configurable_alternatives 方法与使用技巧

核心功能与应用场景 在开发调试过程中&#xff0c;当需要动态替换链中的完整组件​&#xff08;如大语言模型、提示词模板等&#xff09;并保持对话连续性时&#xff0c;可通过 configurable_alternatives() 实现运行时组件热替换。典型场景包括&#xff1a; 调试时切换不同版…...

Angular 2 模板语法详解

Angular 2 模板语法详解 引言 Angular 2 作为一款强大的前端框架,以其组件化的开发模式和高效的性能被众多开发者所青睐。模板语法是Angular 2中用于定义组件UI的关键部分。本文将详细介绍Angular 2的模板语法,帮助开发者更好地理解和运用这一功能。 模板语法概述 Angula…...

对称加密:原理、算法与应用全解析

对称加密作为密码学领域的核心技术&#xff0c;凭借其高效性与广泛应用&#xff0c;在数据安全领域占据重要地位。本文将从基础概念、历史发展、核心算法到实际应用场景&#xff0c;全方位解析对称加密技术的全貌&#xff0c;并探讨其面临的挑战与未来方向。 一、对称加密的核心…...

多线程编程中的锁策略

目录 1.悲观锁vs乐观锁 关键总结 悲观锁&#xff1a; 乐观锁&#xff1a; 选择建议 用 悲观锁 当&#xff1a; 用 乐观锁 当&#xff1a; 2.重量级锁vs轻量级锁 选择建议 用 轻量级锁&#xff1a; 用 重量级锁&#xff1a; 3.挂起等待锁vs自旋锁 关键细节说明 选择…...

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学习成本…...

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法&#xff1a; TF-IDF&#xff1a;基于词频-逆文档频…...

常见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…...

使用binance-connector库获取Binance全市场的币种价格,然后选择一个币种进行下单

一个完整的示例,展示如何使用 api 获取Binance全市场的币种价格,然后选择一个最便宜的币种进行下单操作 代码经过修改,亲测可用,目前只可用于现货,合约的待开发 获取市场价格:使用client.ticker_price()获取所有交易对的当前价格 账户检查:获取账户余额,确保有足够的资…...

磁盘分析工具合集:告别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:/…...

Spring / Spring Boot 的@MapperScan 和 @Repository

MapperScan 和 Repository 是两个与数据访问层相关的注解&#xff0c;它们在功能上有一定的联系&#xff0c;但也有明显的区别。 一、相同点 1. 都与数据访问层相关 MapperScan&#xff1a;用于扫描 MyBatis 的 Mapper 接口。MyBatis 是一个流行的持久层框架&#xff0c;Mapp…...