最适合入门者的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.算法笔记(三)算法学习技巧从开始学习算法已经有两三个多月的时间了,从简单到深入层次展开,层层优化,对算法的理解也在逐渐加深,不在那么片面,虽然现在还是片面一些,对它的了解也仅仅知道冰山一角,还有很多的内容需要我们去学习去挖掘。 思路 在学习前我们要尽可能快速阅读一遍要学习的书籍,这样不仅仅让我们知道了有哪些内容需要学习,同时也在https://www.code456.com/article/3598351.html
2.大一计算机专业学生,该如何自学数据结构和算法?不要一来就拿着《算法导论》开始啃,初学就去啃这些书肯定会很费劲。你一旦啃不下来,挫败感就会很强。 然后就放弃学算法了。 所以,入门的同学,我建议你找一些比较容易看的书来看,比如《大话数据结构》和《算法图解》。 不要太在意书写得深浅,重要的是能不能坚持看完。 《大话数据结构》 这本书最大的特点是,https://www.zhihu.com/question/454132632/answer/2341756722
3.算法的初学者教程算法入门算法的初学者教程 本文介绍了算法的基本概念,包括时间复杂度和空间复杂度,并详细讲解了数组、链表、栈、队列、哈希表和树等常见数据结构。接着,讨论了排序算法如冒泡排序、选择排序、插入排序和快速排序,以及查找算法中的顺序查找和二分查找。最后,概述了动态规划、贪心算法和回溯算法的应用,如最长公共子序列问题、https://blog.csdn.net/qq_35522002/article/details/130116043
4.初学者必学的算法基础教程初学者必学的算法基础教程 标签: 算法 算法与数据结构 收藏 概述 本文介绍了算法的基本概念和重要性,涵盖了算法的组成部分和不同类型,如搜索算法、排序算法和图算法。文章还解释了算法的时间复杂度和空间复杂度,并提供了示例代码和学习资源,帮助读者更好地理解和应用算法。 算法基础知识简介 什么是算法 算法是一https://www.imooc.com/article/362340
5.初学者应当掌握的算法LightAc7.LIS LCS 数字三角形 01背包 8.状压DP 和 树形DP 9.单调栈 单调队列 优化DP 10.树状数组 二维树状数组 11.素数筛 拓展欧几里得 中国剩余 12.线段树 初学者应当掌握的算法 算法内容 回到顶部 1.二分 + 二分答案 + 快速幂 回到顶部 2.C 到 C艹 各类容器及其原理(堆和set) https://www.cnblogs.com/lightac/p/10534745.html
6.算法详解(卷1)——算法基础(豆瓣)一整本书在讲分治算法,很细致,挺好的,也不厚 1 有用 三七李 2021-12-06 23:57:06 轻松愉快,适合复习(总算看懂主定理的证明了 3 有用 Echo毓歌 2021-05-28 02:54:29 感觉是对算法初学者最友好的书了 > 更多短评 14 条 我要写书评 算法详解(卷1)——算法基础的书评 ··· ( 全部1 条https://book.douban.com/subject/30424415/
7.helloalgo,一个免费的算法学习开源项目若您是算法初学者,从未接触过算法,或者已经有一些刷题经验,对数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么这本书正是为您量身定制!如果您已经积累一定刷题量,熟悉大部分题型,那么本书可助您回顾与梳理算法知识体系,仓库源代码可以 被当作“刷题工具库”或“算法字典”来使用。 https://developer.aliyun.com/article/1437987
8.AtCoder算法竞技平台简介腾讯云开发者社区ABC是给算法初学者参加的,ARC是给有一定算法基础的人参加的。 ABC和ARC都是四道题。ABC的C、D题和ARC的A、B题完全一样。 ARC对标Codeforces Div2,也就是说AtCoder的题目难度低于Codeforces。 与Codeforces不同的是,AtCoder没有Final System Test,参赛者提交程序后即可知道自己的程序是否正确。 https://cloud.tencent.com/developer/article/1164720
9.如何入门学算法?其实不然,万丈高楼平地起,任何高深的算法都要从基础算法学起,不可能一口吃个胖子,所以入门算法还是要从基础开始: 首先学习一门语言,例如C/C++或者Java,初学者学C++比较普遍。 学一本数据结构,数据结构书有很多,具体看什么书最好,因人而异,尽管很多人觉得严的书难以理解,但是无法否认,严的书是权威,所以仍然推荐https://www.jianshu.com/p/6b9f1be558c6
10.从零开始学算法(基于Python)最新章节李峰著主要的原因是初学者没有找到学习算法的门路,算法是计算机行业的前辈们智慧的精华,本身固然存在一定的复杂性,但是学习起来困难的主要原因还是讲解者讲得不到位。学习算法就好像我们上学的时候学习数学,虽然数学的复杂公式与逻辑对于学习者确实存在一定的难度,但是解题思路还是有规律可循的,通过对具体的题型分类,辅以大量的https://m.zhangyue.com/readbook/12675722/17.html
11.算法竞赛入门经典PDF扫描版电子书下载4.2.4 初学者易犯的错误 4.3 递归 4.3.1 递归定义 4.3.2 递归函数 4.3.3 C语言对递归的支持 4.3.4 段错误与栈溢出 4.4 本章小结 4.4.1 小问题集锦 4.4.2 小结 第2部分 算法篇 第5章 基础题目选解 5.1 字符串 5.1.1 WERTYU 5.1.2 TeX括号 https://www.jb51.net/books/155734.html
12.清华大学出版社图书详情本书是算法竞赛的入门和进阶教材,包括算法思路、模板代码、知识体系、赛事相关等内容。本书把竞赛常用的知识点和竞赛题结合起来,讲解清晰、透彻,帮助初学者建立自信心,快速从实际问题入手,模仿经典代码解决问题,进入中级学习阶段。全书分为12章,覆盖了目前算法竞赛中的主要内容,包括算法竞赛概述、算法复杂度、STL和基本http://www.tup.tsinghua.edu.cn/booksCenter/book_08163901.html
13.科学网—[转载]最实用的机器学习算法优缺点分析,没有比这篇说得更K 均值是基于样本点间的几何距离来度量聚类的通用目的算法。由于集群围绕在聚类中心,结果会接近于球状并具有相似的大小。 我们之所以推荐该算法给初学者,是因为它不仅足够简单,而且足够灵活,对于大多数问题都能给出合理的结果。 优点:K 均值是最为流行的聚类算法,因为它足够快速、足够简单,如果你的预处理数据和特征工https://blog.sciencenet.cn/blog-1396960-1170780.html
14.C语言入门的基本学习方法我个人认为在求解与实现一个小问题的时候,我们可以写出一个通用的模块处理不同的Data.当然比如某些经常用到的,基于数据结构的一些常用算法我们可以写出来在开发的时候我们可以直接把预先编写的模块插入到我们的程序中去,这不也是大大低了开发周期吗?初学者完全可以根据自己的需求来编写一个自定义库.好了,说了这些,有https://mip.oh100.com/kaoshi/c/560623.html
15.新手必看的Top10个机器学习算法学会了你就是老手当面对各种各样的机器学习算法时,初学者通常会问这样一个问题:”我应该使用哪种算法?“这个问题的答案取决于许多因素,包括:(1)数据的规模、质量和性质;(2)可用计算时间;(三)任务的紧迫性;以及(4)如何处理数据。 在尝试不同的算法之前,即使是经验丰富的数据科学家也无法判断哪种算法会表现最好。虽然还有许多其他https://www.51cto.com/article/600359.html
16.GitHubkrahets/hello“一本通俗易懂的数据结构与算法入门书,引导读者手脑并用地学习,强烈推荐算法初学者阅读。” —— 邓俊辉,清华大学计算机系教授 “如果我当年学数据结构与算法的时候有《Hello 算法》,学起来应该会简单 10 倍!” —— 李沐,亚马逊资深首席科学家 贡献 https://github.com/krahets/hello-algo
17.趣学算法(第2版)本书既适合那些对算法有强烈兴趣的初学者,也适合觉得算法晦涩难懂、无所适从的人,还适合作为高等院校计算机及相关专业的算法教材。读者阅读本书,不仅能够理解经典的算法设计,而且能获得足够多的实用技巧,以便更好地分析和解决问题,为学习更高深的算法奠定基础。 https://www.epubit.com/bookDetails?id=UB7d85fa69dcbd8
18.支持C++,Java,Python,Go,JavaScript等多语言版本,从此算法学习但我能设身处地的感受到:即使有这样一个整体规划,对于一位初学者甚至算法老手寻找合适自己的题目也是很困难,时间成本很高,而且题目还不一定就是经典题目。 对于刷题,我们都是想用最短的时间按照循序渐进的难度顺序把经典题目都做一遍,这样效率才是最高的! 所以我整理了leetcode刷题攻略:一个超级详细的刷题顺序,https://gitee.com/yuandreams/leetcode-master