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

article/2025/10/2 22:04:19

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

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

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

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

代码获取

gitee链接:https://gitee.com/chenshao777/A_Star_Matlab (麻烦点个Star哦!感谢!)

在这里插入图片描述
一、A* 算法原理
二、A* 算法实现步骤
三、A* 算法MATLAB代码

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

某站A*视频

一、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年除夕前一天完成的,博主肝代码不易,还请各位点赞关注支持一下,哈哈!

gitee链接: https://gitee.com/chenshao777/A_Star_Matlab (麻烦点个Star哦!感谢!)


http://chatgpt.dhexx.cn/article/5KTX1RL9.shtml

相关文章

什么是脏读?不可重复读?幻读?如何解决?

什么是脏读?不可重复读?幻读?如何解决? 朋友最近面试美团,被面试官问到数据库的幻读问题,自己正好最近复习到这,做个笔记整理一下数据库的三大特征以及隔离级别。 一.先来回顾一下什么是事务&…

MySQL理论:脏读、不可重复读、幻读

🏆今日学习目标: 🍀MySQL理论:脏读、不可重复读、幻读 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区&#xf…

数据库事务隔离级别(脏读、幻读、不可重复读)

一、脏读、幻读和不可重复读 一、脏读、不可重复读、幻读 1、脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了…

快速理解脏读,不可重复读,幻读

介绍 要聊事务,不可避免的要提到数据库事务的四大特性:ACID atomicconsistenceisolationdurability 先放一个表格,看看4个隔离级别会出现的各种问题,网上的解释一大堆。看完后还是一脸懵逼,感觉懂了,又好…

MySQL之脏写、脏读、不可重复读、幻读

脏写和脏读都是在多个事务同时修改或读取同一行数据的情况下产生的问题。比如现在有事务1和事务2同时对一行数据进行修改,事务1将值改成1,而事务2将值改成了2,这时的值应该是2,但是就在这时,事务1发生了回滚&#xff0…

数据库必备知识:脏读和幻读的定义及应对策略

随着数据库应用的广泛使用,数据库并发性和一致性的问题成为了引起重视的问题之一。其中,脏读(Dirty Read)和幻读(Phantom Read)是常见的并发访问问题,本文将对脏读、幻读进行详细介绍&#xff0…

Seata AT模式怎样防止脏写和脏读

前言 Seata AT 模式是一种非侵入式的分布式事务解决方案,Seata 在内部做了对数据库操作的代理层,我们使用 Seata AT 模式时,实际上用的是 Seata 自带的数据源代理 DataSourceProxy,Seata 在这层代理中加入了很多逻辑,…

mysql 脏数据是什么_什么是脏读?

什么是脏读? 脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的,值得注意的是&…

[Database] 脏读、幻读这些都是什么?事务隔离级别又是什么?MySQL数据库的事务隔离级别都有哪些?

文章目录 前言事务隔离级别三种数据不一致问题1. 脏读2. 不可重复读3. 幻读不可重复读 vs 幻读 四种事务隔离级别1. READ UNCOMMITTED2. READ COMMITTED3. REPEATABLE READ4. SERIALIZABLE 不同事务隔离级别会面临的问题不同隔离事务级别的使用率排名 实战查看事务隔离级别更改…

Mysql-详解脏读、不可重复读、幻读

Mysql的事务隔离级别 Mysql有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读、不可重复读、幻读的问题。 脏读 大家看一下,我们有两个事务,一个是 Transaction A,一个是 Transaction B…

MySQL的事务,脏读,不可重复读,幻读

一、什么是事务 在MySQL中,事务是一种机制、一个操作序列,是访问和更新数据库的程序执行单元。事务中包含一个或多个数据库操作命令,会把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行&#…

脏读、幻读、不可重复读,傻傻分不清楚

脏读 (针对未提交数据) 脏读又称无效数据读出(读出了脏数据)。一个事务读取另外一个事务还没有提交的数据叫脏读。 例如:事务T1修改了某个表中的一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改…

【MySQL理论】脏读、不可重复读、幻读

文章目录 1. 脏读(dirty read)脏读是指事务读取到其他事务未提交的数据 2. 不可重复读(non-repeatable read)不可重复读是指在同一次事务中前后查询不一致的问题 3. 幻读(phantom read)幻读是一次事务中前后数据量发生变化,用户产生不可预料的问题 4. 不可重复读和幻…

脏读、不可重复读、幻读、丢失更新

根儿上来说,为什么需要事务和锁? 如果所有的操作都是依次进行的,或者说mysql的server是单线程的,就不会有并发问题,也就不需要事务和锁了。然而事实上,是多客户端,多线程的,所有必须…

一文搞懂MySQL脏读,幻读和不可重复读

目录 MySQL 中事务的隔离 1.READ UNCOMMITTED2.READ COMMITTED3.REPEATABLE READ4.SERIALIZABLE前置知识 1.事务相关的常用命令2.MySQL 8 之前查询事务的隔离级别3.MySQL 8 之后查询事务的隔离级别4.查看连接的客户端详情5.查询连接客户端的数量6.设置客户端的事务隔离级别7.新…

脏读、幻读和不可重复读

一、引言 脏读、不可重复读和幻读是数据库中由于并发访问导致的数据读取问题。当多个事务同时进行时可以通过修改数据库事务的隔离级别来处理这三个问题。 二、问题解释 1、脏读(读取未提交的数据) 脏读又称无效数据的读出,是指在数据库访…

一文详解脏读、不可重复读、幻读

MySQL 是支持多事务并发执行的。否则来一个事务处理一个请求,处理一个人请求的时候,其它事务都等着,那估计都没人敢用MySQL作为数据库,因为用户体验太差,估计都要砸键盘了。 既然事务可以并发操作,这里就有一些问题:一…

快速理解脏读、不可重复读和幻读

MySQL的InnoDB引擎是支持事务的,但是并发事务的处理又会带来以下问题: 脏读不可重复读幻读 一、脏读 脏读指事务A读取到了事务B更新了但是未提交的数据,然后事务B由于某种错误发生回滚,那么事务A读取到的就是脏数据。 具体的说…

引用及指针和引用的区别

一.在C语言中,我们要给函数传参,有两种方法。 1.传值 void Swap(int a,int b) {int tmpa;ab;btmp; } int main() {int a10;int b20;Swap(a,b);return 0; }优点:形参不影响实参(保护实参),可读性强。 缺点…

C++ | 指针和引用的区别

01. C——指针和引用的区别 指针是一个存储变量地址的变量,指向内存的一个存储单元。 引用只是一个别名。 int a1; int *p&a;int a1; int &ba;使用sizeof看一个指针的大小是8,而引用则是被引用对象的大小。指针可以被初始化为NULL,…