最适合入门者的A*(A星)算法详解

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2021.08.11

A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。

1

Dijkstra算法

Dijkstra算法的原理不难理解,但是假如用文字表达会增大初学者的理解难度,所以树根直接上图:

其中箭头边的数值代表两点之间的距离。

我们假设从点1出发,计算出点1到点8的最短路径。我们可以看一下Dijkstra算法是怎么求出点1到点8的最短距离的(其中S表示已求出最短路径的点的集合):

(1)点1直接到点4的距离最短,所以点1到点4的距离P4=1,同时点4加入S集合:

(2)显而易见,点1直接到点2的距离是最短的,为2,因此距离P2=2,点2加入集合S中:

(3)同理,点1直接到点6的距离是最短的,P6=3,点6加入S:

(4)点1到点7的最短路径为:1->4->7,距离P7=1+2=3,点7加入S:

同理遍历所有节点:

这样我们就可以得到点到所有节点的最短路径,可以得到点1到点8的最短路径为:1->4->7->5->8,P8=10

因此,计算任意两点的最短距离时,Dijkstra算法每一步会选择离初始点最近的结点。

还有没有其他的方法呢?

2

最佳优先搜索(BFS)

A-StarAlgorithm

最佳优先搜索(BFS)算法按照类似的流程运行,不同的是它能够评估(称为启发式)任意结点到目标点的代价。

与选择离初始结点最近的结点不同的是,BFS选择离目标点最近的结点。

BFS不能保证找到一条最短路径。然而,它比Dijkstra算法快的多,因为它用了一个启发式函数(heuristicfunction)快速地导向目标结点。例如,如果目标位于出发点的南方,BFS将趋向于导向南方的路径。

在下面的图中,颜色越浅的结点代表越高的启发式值(移动到目标的代价高),而越黑的结点代表越低的启发式值(移动到目标的代价低)。这表明了与Dijkstra算法相比,BFS运行得更快,但是在存在障碍物的情况下,它找到的路径可能不是一条好的路径:

问题在于,BFS是基于贪心策略的,它试图向目标点移动,尽管这不是正确的路径。由于它仅仅考虑到达目标的代价,而忽略了当前已花费的代价,于是尽管路径变得很长,它仍然继续走下去。

假如能结合两者的优点不是更好吗?

3

A*(A星)算法

让我们想象一下,有一款游戏,游戏中一只猫想要找到获取骨头的最短路线:

一、简化搜索区域

寻路的第一步是简化成容易控制的搜索区域。

作为代替,我们使用方块(一个正方形)作为寻路算法的单元。其他的形状类型也是可能的(比如三角形或者六边形),但是正方形是最简单并且最适合我们需求的。

现在让我们基于目前的区域,把区域划分成多个方块来代表搜索空间(在这个简单的例子中,7*6个方块=42个方块):

我们的猫没有好的记忆力,所以它需要两个列表:

一个记录下所有被考虑来寻找最短路径的方块的列表(称为open列表)

一个记录下不会再被考虑的方块的列表(称为closed列表)

猫首先在closed列表中添加当前位置(我们把这个开始点称为点“A”)。然后,把所有与它当前位置相邻的可通行小方块添加到open列表中。

下图是猫在某一位置时的情景(绿色代表open列表):

我们将会给每个方块一个和值:

F=G+H

G:从开始点A到当前方块的移动量(可以与Dijkstra算法联系起来理解)。所以从开始点A到相邻小方块的移动量为1,该值会随着离开始点越来越远而增大。

H:从当前方块到目标点(可以与BFS算法联系起来理解)的移动量估算值。这个常被称为探视,因为存在障碍物,我们不确定实际的移动量是多少,仅仅是一个估算值。

你也许会对“移动量”感兴趣。在游戏中,这个概念很简单–仅仅是方块的数量。

然而,在游戏中你可以对这个值做调整。例如:

·如果你允许对角线移动,你可以针对对角线移动把移动量调得大一点(因为存在根号会增大计算量)。

·如果你有不同的地形,你可以将相应的移动量调整得大一点。

关于G值:

G是从开始点A到达当前方块的移动量(在本游戏中是指方块的数目)。

为了计算出G的值,我们需要从它的上一个方块获取,然后加1。所以,每个方块的G值代表了从初始点A到该方块所形成路径的总移动量。

例如,下图展示了两条到达不同骨头的路径,每个方块都标有它的G值(我们现在只允许前后左右移动,不允许对角线移动):

关于H值:

H值是从当前方块到终点的移动量估算值(在本游戏中是指方块的数目)。移动量估算值离真实值越接近,最终的路径会更加精确。

为了让它更简单,我们将使用“曼哈顿距离方法”,它只是计算出距离目标点B剩下的水平和垂直的方块数量,同时略去了障碍物或者不同陆地类型的数量(我们在估算距离的时候往往不确定前方会有怎么样的障碍物)。

例如,下图展示了使用“曼哈顿距离”,从不同的开始点到终点,去估算H的值(黑色数字表示H值):

在下图中,和大家说一下每个方块图例的意思:

F(方块的和值):左上角的数字

G(从A点到方块的移动量):左下角的数字

H(从方块到B点的估算移动量):右下角的数字

箭头指示了到达相应方块的移动方向。

红色方块表示closed列表,绿色方块表示open列表。

好的,我们开始吧!

第二步:

注意被添加到open列表的两个新方块,相对于现在选中的方块来说,他们的G值都只是增加了1:

第三步:

再次,我们选择了相对于初始点A有最小F值(5)的方块,继续重复之前的步骤。现在,只有一个可能的方块被添加到open列表中了,因为已经有一个相邻的方块在close列表中,其他两个是墙壁方块:

现在我们遇到了一个有趣的情况。正如你看到的,相对于初始点A,有4个方块的F值都为7,我们要怎么做呢?!

对于四个方块的F值都是7的情况,有几种解决方法可以使用,但是最简单(快速)的方法是一直跟着最近被添加到open列表中的方块。现在继续沿着最近被添加的方块前进:

这次有两个可通过的相邻方块了,我们还是像之前那样计算他们的和值F。

第五步:

接着我们选择了最小和值(7)的方块,继续重复之前的步骤:

在我们的例子中,有两条最短路径:

1->2->3->4->5->6

1->2->3->4->5->7

选择哪一条其实没关系,然后,算法要做的所有事情就是返回,计算出最终的路径!

现在到了真正用代码实现的时候了。超级鸡冻的有木有~

4

算法实现

Python版:

运行后的结果为:

MATLAB版:

代码很长,树根就不放出来了。链接可以后台问树根拿,回复关键词:“matlab_A-Star”即可

运行后会形成UI界面,并且起始点,目标点和障碍物的位置可自己调节:

THE END
1.A星算法详解(个人认为最详细,最通俗易懂的一个版本)虽然掌握了 A*算法的人认为它容易,但是对于初学者来说, A* 算法还是很复杂的。 搜索区域(The Search Area) 我们假设某人要从 A 点移动到 B 点,但是这两点之间被一堵墙隔开。如图 1 ,绿色是 A ,红色是 B ,中间蓝色是墙。 图1 你应该注意到了,我们把要搜寻的区域划分成了正方形的格子。这是寻路的第一https://blog.csdn.net/hitwhylz/article/details/23089415
2.A算法详细介绍.pptA*算法 尚福华 A算法 在图搜索算法中,如果能在搜索的每一步都利用估价函数f(n)=g(n)+h(n)对Open表中的节点进行排序,则该搜索算法为A算法。由于估价函数中带有问题自身的启发性信息,因此,A算法又称为启发式搜索算法。 对启发式搜索算法,又可根据搜索过程中选择扩展节点的范围,将其分为全局择优搜索算法和https://max.book118.com/html/2020/0212/5302011221002221.shtm
3.排列组合a的计算方法排列组合中的排列a,其计算公式是高中数学中的一个重要内容。排列数A(n,m)表示从n个不同元素中取出m个元素的所有排列的个数。 排列a的计算公式有两种形式: 直接相乘形式:A(n,m) = n × (n-1) × × (n-m+1) 这个公式表示,从n个元素中选择第一个元素有n种方法,选择第二个元素时剩下n-1种https://agents.baidu.com/content/question/f6702df348a15f3173183c28
4.排列组合a怎么算排列组合A(n,m)=n×(n-1),(n-m+1)=n!/(n-m)!。n为下标,m为上标。排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。 排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数https://edu.iask.sina.com.cn/bdjx/6dwQYamJ1ks.html
5.A*算法图文详解A*算法最早于1964年在IEEE Transactions on Systems Science and Cybernetics中的论文《A Formal Basis for the Heuristic Determination of Minimum Cost Paths》中首次提出。 其属于一种经典的启发式搜索方法,所谓启发式搜索,就在于当前搜索结点往下选择下一步结点时,可以通过一个启发函数https://mp.weixin.qq.com/s?__biz=MzU0NjgzMDIxMQ==&mid=2247613871&idx=4&sn=566d8caed79774e4ae02ebd027d25a50&chksm=fb54df43cc235655297bc278ee29f68750adc5cdf3a68512e9597f7e88fd1aefc1f1a0cd87ed&scene=27
6.人工智能A*算法原理A算法是启发式算法重要的一种,主要是用于在两点之间选择一个最优路径,而A的实现也是通过一个估值函数 F=G+H G表示该点到起始点位所需要的代价 H表示该点到终点的曼哈顿距离。 F就是G和H的总和,而最优路径也就是选择最小的F值,进行下一步移动(后边会做详细介绍) https://www.jianshu.com/p/274bbb6598df
7.自动驾驶路径规划:A*(Astar)算法3D视觉工坊最佳优先搜索(BFS),又称A算法,是一种启发式搜索算法(Heuristic Algorithm)。[不是广度优先搜索算法( Breadth First Search , BFS )] BFS算法在广度优先搜索的基础上,用启发估价函数对将要被遍历到的点进行估价,然后选择代价小的进行遍历,直到找到目标节点或者遍历完所有点,算法结束。 https://www.shangyexinzhi.com/article/7063887.html
8.图解A*算法相比于传统的深度搜索和广度搜索的递归回溯算法,A*算法启发式的提供代价估算能力来评估到达目标结点的最短路径所需的代价,即到达终点最省体力的方式。这在我们日常地图导航需求中得到了广泛的应用。本小节我们将以图解的方式向大伙儿揭示A星(这里姑且用星来代指*)算法的奥秘。 https://www.nowcoder.com/discuss/512892732843503616
9.自动驾驶路径规划:A*(Astar)算法最佳优先搜索(BFS),又称A算法,是一种启发式搜索算法(Heuristic Algorithm)。[不是广度优先搜索算法( Breadth First Search , BFS )]BFS算法在广度优先搜索的基础上,用启发估价函数对将要被遍历到的点进行估价,然后选择代价小的进行遍历,直到找到目标节点或者遍历完所有点,算法结束。要实现最佳优先搜索我们必须使用一https://www.elecfans.com/d/2042130.html
10.数据挖掘之Apriori算法详解和Python实现代码分享python这篇文章主要介绍了数据挖掘之Apriori算法详解和Python实现代码分享,本文先是对Apriori算法做了详细介绍,然后给出了Python版实现代码,需要的朋友可以参考下 关联规则挖掘(Association rule mining)是数据挖掘中最活跃的研究方法之一,可以用来发现事情之间的联系,最早是为了发现超市交易数据库中不同的商品之间的关系。(啤酒https://www.jb51.net/article/57209.htm
11.基于A*的双向预处理改进搜索算法摘要:本文针对传统A*算法存在冗余路径点较多与单向搜索耗时较长的缺点, 提出了一种改进A*算法. 该算法采用双向预处理结构减少冗余节点数, 并通过归一化处理和增加节点标记信息进一步优化估价函数提高遍历速度. 利用仿真软件对改进A*算法进行实验, 并与其它经典路径规划算法进行比较. 仿真结果表明, 改进后的A*算法较于https://c-s-a.org.cn/html/2019/5/6923.html
12.基于A*与DWA算法的混合路径规划算法研究为使移动机器人能在各种环境中高效工作, 需要根据实际的地形选择合适的路径规划算法。 为此, 使用A* 与 DWA(Dynamic Window Approach)算法结合的混合路径规划算法, 在仿真环境下搭建 U 型、 S 型、 L 型、狭窄通道型 4 种典型地形进行寻路实验, 同时改进了建图的权重递归公式消除对前一时刻数据依赖, 提高了算http://xuebao.jlu.edu.cn/xxb/CN/abstract/abstract1452.shtml
13.A*算法是怎么做到避开障碍物的?A*算法的理论公式可表示为:f?(n)=g?(n)+h?(n)其中:f?(n)是从初始状态经由状态n到https://www.zhihu.com/question/51626331/answer/2456365853