首先看看运行效果,分别有三种模式,代码运行前需要通过鼠标点击设置起点和终点。

第一种模式直接输出最短路径

第二种模式输出最短路径的生成过程

第三种模式输出最短路径的生成过程和详细探索的过程


一、A* 算法原理
二、A* 算法实现步骤
三、A* 算法MATLAB代码

某站上我也发了视频,不过之前的版本没有添加鼠标点击功能,这里不能粘贴某站的链接,会被视为打广告,某站搜索“晨少的bili”,即可在主页上看到

一、A* 算法原理

A* 算法是专门用来求解地图中最短路径的算法,同样的算法有很多,但实际中最常用的就是A*算法。

举个例子来说,A*算法通常要将地图网格化,如下图所示:

假设有一只乌龟在追小白兔,乌龟此时的位置是(2,2),小白兔的位置是(6,6),假设小白兔静止不动。
根据A *算法的原理,乌龟只能向左、向右、向上、向下走,那么(1,2)、(2,1)、(3,2)、(2,3)是乌龟下一轮可以到达的点,这些点叫做 待探索的点

步骤一
寻找下一步可以到达的节点,将这些待探索的点加入待探索数组 frontier 中,也叫边界数组。
计算出新加入点的代价,代价 = 当前代价 + 预估代价 , 公式表达为 F= G + H

所谓 当前代价 G 就是从起点到达当前点所经过的路程,例如(1,2)、(2,1)、(3,2)、(2,3)这四个点的当前代价都等于(2,2)点到达其所需的路程,即为 1 。

所谓 预估代价 H 就是从当前点到终点的曼哈顿距离(横纵坐标差值之和,| x1 - x2| + |y1 - y2|)
所以(1,2)、(2,1)、(3,2)、(2,3)四个待探索点的预估代价分别为9、9、7、7 。
当前代价 / 预估代价结果如下图所示:

步骤二
将待探索点按照代价的大小升序排序,则排序后的待探索数组中待探索点的顺序为
(3,2)、(2,3)、(1,2)、(2,1)
接着取出第一个,即代价最小的点作为小乌龟的此轮目标点,即为下一轮的起始点,并把该点从待探索数组 frontier 中删去 ,加入 已探索数组 already_frontier 中,则会得到下面的情况:

此时小乌龟在(3,2)位置,且为了更形象的表达,图中将待探索点标成了蓝色,已探索点标成了绿色(已探索点目前有(2,2)和(3,2),待探索点有(1,2)、(2,1)、(2,3))

步骤三
记录下当前点到起点的路径,可以这么记 [(2,2) , (3,2)],在matlab中可以表现为一个2行2列的矩阵
2 2
3 2
接着判断当前节点是否是终点,如果不是终点则继续步骤一,继续寻找下一步可以探索的点

为了便于大家的理解,再跟着步骤一、二、三进行下一轮


如上图所示,找出小乌龟下一轮可以去到的点,判断周围的点是否在已探索数组 already_frontier 中,如果在则忽略,接着判断这些点是否已经在待探索数组 frontier 中,如果在则比较该点的 当前代价G 与 如果经过小乌龟当前位置而到达该点现在位置所需的 当前代价G2 进行比较,如果G > G2则将该点的上一个节点(可以理解为父节点)改成小乌龟当前所在节点,更新其当前代价为G2。
最后计算出他们的代价,接着对待探索数组升序排序后,选出第一个代价最小的点作为下一轮的起始点。

由于我是以 左下右上 的顺序寻找待探索点的,所以前两次选择到的代价最小是(3,2)和(4,2),如果你按照 上右下左的顺序,则你选择到的代价最小会是(2,3)和(2,4),这个并不会影响到最终的最短路径长度,只是路径不同罢了

根据上面三个步骤一直循环,就可以得到一条最短的路径,下图绿色点表示的即为最短路径


当然也可以是先往上走,再往右走,根据每个人自己选择的待探索点的顺序来确定

二、A* 算法实现步骤

  1. 将起点加入待探索数组 frontier ,代价赋为 0
  2. 找出 frontier 中代价 F 最小的点,移出 frontier ,添加进已探索数组 already_frontier
  3. 判断该点是否是终点,如果不是则继续
  4. 将该节点周围的四个点找出,判断这四个点是否在 already_frontier数组中,如果在则忽略(当然这四个点也不能超出地图范围或者位于障碍物中)。
  5. 判断这些点是否已经在待探索数组 frontier 中,如果在,则将该点的 当前代价G 与 经过当前节点到达该点的 当前代价G2 进行,如果G > G2则将该点的上一个节点(可以理解为父节点)改成当前节点,更新其当前代价为G2,并更新其 代价F。(这一步非常重要,有利于找出更加短的路径)
  6. 将剩下符合要求的点添加进 frontier ,并计算 代价 F,对 frontier 数组按照 代价 F 排序
  7. 同时记录下路径,即每个节点都要记录其上一个节点,方便最后进行路径的回溯找出最短路径
  8. 循环 2 - 7 步骤,直到到达终点终止循环

补充:对于第四步来说,可以将可运动方向改为八个方向,即上、下、左、右、左上、左下、右上、右下,需要注意的是每次运动的步长就不只是 1 了,还有根号 2 ,我写的A*算法仿真(文章开头的那个演示)就是按照八个方向来写的,这样得出的路径会更贴合实际。

三、A* 算法MATLAB代码

代码是2022年除夕前一天完成的,博主写代码不易,还请各位大佬支持一下,哈哈

xian鱼APP里搜索用户 “晨少的咸鱼” ,主页里有你们想要的东西哦

A星(A*、A Star)路径规划算法详解(附MATLAB代码)相关推荐

  1. Dijkstra算法和Floyd算法详解(MATLAB代码)

    一.Dijkstra算法 1.算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式,是目前公认的最好的求解最短路径的方法.算法解决的是有 ...

  2. 数据结构-数组-字符串匹配:Knuth-Morris-Pratt算法(详解附完整代码)

    字符串匹配 字符串抽象数据类型 字符串模式匹配 简单的字符串匹配 Knuth-Morris-Pratt算法 背景分析 失配函数 定义 实现方法 函数分析 KMP函数 实现方法 函数分析 失配信息的另一 ...

  3. lle算法的matlab实现,lle算法详解及matlab代码实现

    LLE算法代码 % LLE ALGORITHM (using K nearest neighbors) % % [Y] = lle(X,K,dmax) % % X = data as D x N ma ...

  4. lle matlab 实例_lle算法详解及matlab代码实现

    LLE 算法代码 % LLE ALGORITHM (using K nearest neighbors) % % [Y] = lle(X,K,dmax) % % X = data as D x N m ...

  5. A星融合DWA的路径规划算法,可实现静态避障碍及动态避障,代码注释详细,matlab源码

    A星融合DWA的路径规划算法,可实现静态避障碍及动态避障,代码注释详细,matlab源码 ID:4525679980340317云的歌儿

  6. kmeans算法详解和python代码实现

    kmeans算法详解和python代码实现 kmeans算法 无监督学习和监督学习 监督学习: 是通过已知类别的样本分类器的参数,来达到所要求性能的过程 简单来说,就是让计算机去学习我们已经创建好了的 ...

  7. AC自动机算法详解以及Java代码实现

    详细介绍了AC自动机算法详解以及Java代码实现. 文章目录 1 概念和原理 2 节点定义 3 构建Trie前缀树 3.1 案例演示 4 构建fail失配指针 4.1 案例演示 5 匹配文本 5.1 ...

  8. ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题

    ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题 原创文章!转载需注明来源:©️ Sylvan Ding's Blog ❤️ 实验目的 了解 ADMM, ISTA, ...

  9. 编辑距离算法详解和python代码

    编辑距离(Levenshtein Distance)算法详解和python代码 最近做NLP用到了编辑距离,网上学习了很多,看到很多博客写的有问题,这里做一个编辑距离的算法介绍,步骤和多种python ...

  10. python直线拟合_RANSAC算法详解(附Python拟合直线模型代码)

    之前只是简单了解RANSAC模型,知道它是干什么的.然后今天有个课程设计的报告,上去讲了一下RANSAC,感觉这个东西也没那么复杂,所以今天就总结一些RASAC并用Python实现一下直线拟合. RA ...

最新文章

  1. 2021下半年,我只想用Python搞钱!
  2. 浅析影响网站空间选择的三大因素
  3. Centos7下python2.x 和python3.x共存
  4. 安卓模拟器获取服务器信息出错,安卓模拟器客户端与服务器不同步
  5. 用200行Go代码写一个自己的区块链!
  6. notepad格式化html代码快捷键,Notepad++中代码格式化插件NppAStyle使用介绍
  7. 过VMP加壳程序的自效验
  8. 后端图形验证码base64编码字符串及前端获取图形验证码base64编码字符串并解码显示图形验证码代码
  9. 蒟蒻的NOIP2017游记
  10. Feign原理:current list of Servers哪里来的
  11. ImgURL一款简单纯粹的图床程序源码
  12. 如何防止你的爬虫被网管一巴掌拍死
  13. Log日志(Linux C)
  14. Ubuntu系统中编写c语言程序教程
  15. 淘宝店铺采集工具如何采集同行店铺信息的?
  16. MYSQL8.0中关于load data infile命令
  17. TI Lab_SRR学习_1 硬件基础 AWR1642和AWR1642EVM
  18. 前排吃瓜!看鹅厂如何花式辞退7年老员工,这次我要站队了!
  19. POST http://127.0.0.1:3000/login net::ERR_CONNECTION_RESE
  20. jlabel html图片,JLabel里如何使用HTML?

热门文章

  1. C# 简单管理系统模板 控制台应用程序
  2. 省市县地区编码五级联东2021年版sql
  3. Java连接SAP ————JCO 3.0技术详解
  4. [转]3D Ripper DX模型截取器
  5. 用AS3+Flash+FlashBuilder开发AIR
  6. win10自带的打印机服务器,win10系统打印服务器安装设置的详细方法
  7. oracle blob 转 varchar2,oracle varchar2与clob、blob互转
  8. win7系统可以禁止的服务器,win7旗舰版怎么禁用不必要的系统服务项
  9. 【软技能】完全写作指南--演讲幻灯片
  10. PBJ | 华南农大联合中科院东北地理所发表植物功能基因与根际微生物互作综述...