`

A*寻路算法 教程(一) (转)

阅读更多

虽然A*(读作A星)算法对初学者来说是比较深奥难懂,但是一旦你找到门路了,它又会变得非常简单。网上有很多解释A*算法的文章,但是大多数是写给那些有一定基础的人看的,而您看到的这一篇呢,是真正写给菜鸟的。

本篇文章并不想给这个算法题目作一些权威性论断,而是阐述它的基本原理,并为你理解更多相关资料与讨论打下基础。文章末尾给出了一些比较好的链接,放在“进阶阅读”一节之后。


最后,本文不是编程规范,你将可能使这里讲述的东西编写成任何计算机语言。在本文的末尾我还给出了一个例子程序包的下载链接,也许正合你意。在这个包中有C++和Blitz Basic两个版本的程序代码,如果你只是想看看A*算法是如何运作的,该包中也有可直接执行的文件供你研究。

我们还是要超越自己的(把算法弄懂),所以,让我们从头开始吧!
 
初步:搜索区域

我们假设某个人要从A点到达B点,而一堵墙把这两个点隔开了,如下图所示,绿色部分代表起点A,红色部分代表终点B,蓝色方块部分代表之间的墙。



[图一]
你首先会注意到我们把这一块搜索区域分成了一个一个的方格,如此这般,使搜索区域简单化,正是寻找路径的第一步。这种方法将我们的搜索区域简化成了一个普通的二维数组。数组中的每一个元素表示对应的一个方格,该方格的状态被标记为可通过的和不可通过的。通过找出从A点到B点所经过的方格,就能得到AB之间的路径。当路径找出来以后,这个人就可以从一个格子中央移动到另一个格子中央,直到抵达目的地。
这些格子的中点叫做节点。当你在其他地方看到有关寻找路径的东西时,你会经常发现人们在讨论节点。为什么不直接把它们称作方格呢?因为你不一定要把你的搜索区域分隔成方块,矩形、六边形或者其他任何形状都可以。况且节点还有可能位于这些形状内的任何一处呢?在中间、靠着边,或者什么的。我们就用这种设定,因为毕竟这是最简单的情况。

开始搜索

当我们把搜索区域简化成一些很容易操作的节点后,下一步就要构造一个搜索来寻找最短路径。在A*算法中,我们从A点开始,依次检查它的相邻节点,然后照此继续并向外扩展直到找到目的地。
我们通过以下方法来开始搜索:
1.
从A点开始,将A点加入一个专门存放待检验的方格的“开放列表”中。这个开放列表有点像一张购物清单。当前这个列表中只有一个元素,但一会儿将会有更多。列表中包含的方格可能会是你要途经的方格,也可能不是。总之,这是一个包含待检验方格的列表。

2.
检查起点A相邻的所有可达的或者可通过的方格,不用管墙啊,水啊,或者其他什么无效地形,把它们也都加到开放列表中。对于每一个相邻方格,将点A保存为它们的“父方格”。当我们要回溯路径的时候,父方格是一个很重要的元素。稍后我们将详细解释它。

3.
从开放列表中去掉方格A,并把A加入到一个“封闭列表”中。封闭列表存放的是你现在不用再去考虑的方格。

此时你将得到如下图所示的样子。在这张图中,中间深绿色的方格是你的起始方格,所有相邻方格目前都在开放列表中,并且以亮绿色描边。每个相邻方格有一个灰色的指针指向它们的父方格,即起始方格。


[图二]
 

接下来,我们在开放列表中选一个相邻方格并再重复几次如前所述的过程。但是我们该选哪一个方格呢?具有最小F值的那个。

路径排序

决定哪些方格会形成路径的关键是下面这个等式:
F = G + H
这里


  • G=从起点A沿着已生成的路径到一个给定方格的移动开销。

  • H=从给定方格到目的方格的估计移动开销。这种方式常叫做试探,有点困惑人吧。其实之所以叫做试探法是因为这只是一个猜测。在找到路径之前我们实际上并不知道实际的距离,因为任何东西都有可能出现在半路上(墙啊,水啊什么的)。本文中给出了一种计算H值的方法,网上还有很多其他文章介绍的不同方法。

我们要的路径是通过反复遍历开放列表并选择具有最小F值的方格来生成的。本文稍后将详细讨论这个过程。我们先进一步看看如何计算那个等式。

如前所述,G是从起点A沿着已生成的路径到一个给定方格的移动开销,在本例中,我们指定每一个水平或者垂直移动的开销为10,对角线移动的开销为14。因为对角线的实际距离是2的平方根(别吓到啦),或者说水平及垂直移动开销的1.414倍。为了简单起见我们用了10和14这两个值。比例大概对就好,我们还因此避免了平方根和小数的计算。这倒不是因为我们笨或者说不喜欢数学,而是因为对电脑来说,计算这样的数字也要快很多。不然的话你会发现寻找路径会非常慢。

我们要沿特定路径计算给定方格的G值,办法就是找出该方格的父方格的G值,并根据与父方格的相对位置(斜角或非斜角方向)来给这个G值加上14或者10。在本例中这个方法将随着离起点方格越来越远计算的方格越来越多而用得越来越多。

有很多方法可以用来估计H值。我们用的这个叫做曼哈顿(Manhattan)方法,即计算通过水平和垂直方向的平移到达目的地所经过的方格数乘以10来得到H值。之所以叫Manhattan方法是因为这就像计算从一个地方移动到另一个地方所经过的城市街区数一样,而通常你是不能斜着穿过街区的。重要的是,在计算H值时并不考虑任何障碍物。因为这是对剩余距离的估计值而不是实际值(通常是要保证估计值不大于实际值――译者注)。这就是为什么这个方式被叫做试探法的原因了。想要了解更多些吗?这里还有更多式子和关于试探法的额外说明。

G和H相加就得到了F。第一步搜索所得到的结果如下图所示。每个方格里都标出了F、G和H值。如起点方格右侧的方格标出的,左上角显示的是F值,左下角是G值,右下角是H值。


[图三]
 

我们来看看这些方格吧。在有字母的方格中,G=10,这是因为它在水平方向上离起点只有一个方格远。起点紧挨着的上下左右都具有相同的G值10。对角线方向的方块G值都是14。

H值通过估算到红色目标方格的曼哈顿距离而得出。用这种方法得出的起点右侧方格到红色方格有3个方格远,则该方格H值就是30。上面那个方格有4个方格远(注意只能水平和垂直移动),H就是40。你可以大概看看其他方格的H值是怎么计算出来的。

每一个方格的F值,当然就不过是G和H值之和了。

 

源码例子 下载

 

分享到:
评论

相关推荐

    unityAStar寻路 A星 A*寻路算法Demo

    本教程将详细介绍如何在Unity5.4.4版本中实现A*寻路算法,并提供一个完整的Demo示例。 首先,A*算法的核心在于评估每个节点的F值,该值由G值(从起始节点到当前节点的实际成本)和H值(从当前节点到目标节点的预计...

    a* 寻路算法

    在提供的压缩包文件"seekroad"中,可能包含了一系列关于A*寻路算法的实例代码、教程文档或者演示程序,帮助学习者更好地理解和应用这个算法。通过深入学习和实践,你将能够熟练运用A*解决实际问题,提升你的编程能力...

    Unity 3D 虚拟现实及游戏 A*寻路算法

    这个教程“蛮牛教育 网上Unity 3D 教程 A星寻路算法”旨在帮助开发者深入理解和应用A*算法,以便在游戏中实现高效、智能的路径寻找。 A* 寻路算法是一种基于图的最短路径搜索算法,它结合了Dijkstra算法的全局最优...

    A星搜索算法教程确定目标最短路径的A*搜索算法教程

    A星(A*)搜索算法是一种广泛应用在图形搜索、游戏开发、路径规划等领域的高效寻路算法。它是Dijkstra算法的一种扩展,引入了启发式信息来提高搜索效率,同时保证找到的路径是最优的。本教程将深入讲解A*算法的核心...

    A* Pathfinding Project Pro(最新版) unity A*寻路算法插件

    A* Pathfinding Project 是一个功能强大并且易于使用的 Unity 寻路系统。通过快速的路径寻找,您的 AI 将立即在复杂的迷宫中找到玩家。非常适合 TD、FPS、RTS 游戏。 支持导航网格,支持3D、2D寻路。

    A* 寻路 pro版本 4.2.17

    A*寻路算法是游戏开发和路径规划领域中广泛应用的一种高效搜索算法,尤其在Unity引擎中,它被广泛用于创建智能角色的导航系统。A*算法结合了Dijkstra算法的全面性和最佳优先搜索的效率,通过引入启发式信息来指导...

    A Pathfinding Project Pro.rar a*寻路 4.1.16

    A*(读作"A-star")算法是一种广泛应用的寻路算法,因其高效性和准确性而备受青睐。在Unity引擎中,有专门的插件支持A*寻路,如"A Pathfinding Project Pro",其版本为4.1.16,为我们提供了强大的寻路功能。 A*算法...

    A*自动寻路算法demo

    A*自动寻路算法是一种广泛应用在游戏开发、地图导航等领域中的高效路径搜索算法。它结合了Dijkstra算法的最短路径特性与BFS(广度优先搜索)的效率,通过评估函数来指导搜索,以找到从起点到终点的最优路径。在给定...

    易语言A星算法 游戏自动寻路源码

    A星(A*)算法是一种在图形搜索中广泛使用的路径规划算法,特别是在游戏开发中用于实现角色或物体的自动寻路功能。它结合了最佳优先搜索(BFS)的全局最优性和Dijkstra算法的效率,通过引入启发式函数来估计从起点到...

    易语言A星寻路算法

    在易语言中实现A星寻路算法,是为了解决游戏、地图导航等领域中的路径规划问题。A星(A*)算法是一种高效的启发式搜索算法,它结合了Dijkstra算法和最佳优先搜索,能够找到从起点到终点的最短路径。 A星算法的核心...

    20210812-A星寻路算法.rar

    本资源"20210812-A星寻路算法.rar"包含了一次深入的二叉树与A*算法的实践教程,结合视频教学、源代码和笔记,旨在帮助学习者深入理解并掌握这两种关键技术。 一、二叉树基础知识 二叉树是由n个节点组成的数据结构...

    C++版寻路算法,做游戏基础算法

    寻路算法是一种用于解决网络中节点间最短路径问题的方法,如Dijkstra算法、A*算法等。在游戏场景中,通常使用图论来表示游戏地图,节点代表地图上的位置,边则代表两个位置之间的连接。 1. **Dijkstra算法**:这是...

    RGP游戏人物45度地图+A星寻路算法 v1.1.10.rar

    而A*寻路算法(A-Star Pathfinding Algorithm),是游戏开发中常用的一种路径规划算法,尤其适用于实时环境下的寻路需求。其主要特点包括: 1. **启发式搜索**:A*算法结合了Dijkstra算法的最短路径特性与Greedy ...

    A星寻路实例

    A星(A* Search Algorithm)是一种在图形中寻找从起点到终点最短路径的搜索算法,广泛应用于游戏开发、路径规划、网络爬虫等领域。它的核心思想是结合了Dijkstra算法的全局最优性和最佳优先搜索的效率,通过评估函数来...

    unity下A*算法实现包含word和package包

    标题中的“Unity下A*算法实现”指的是在Unity游戏引擎中使用A*寻路算法来解决游戏中的路径规划问题。A*算法是一种启发式搜索算法,广泛应用于游戏开发、地图导航等领域,它通过评估节点的代价估计来智能地选择路径,...

    A星寻路,寻路系统

    综上所述,A星寻路算法在Unity中的实现不仅涉及到算法原理,还包括了与Unity引擎的整合、障碍物处理、启发式函数的选择以及性能优化等多个方面。通过这个项目,开发者可以构建出复杂而高效的寻路系统,为游戏中的AI...

    用VB写的简单自动寻路基于A星算法.rar

    A星(A*)算法是一种在图形搜索中非常有效的路径查找算法,尤其适用于游戏开发中的自动寻路系统。VB(Visual Basic)是一种由微软公司推出的事件驱动编程语言,它以其易学性和直观性受到许多程序员的喜爱。将A星算法与...

    COCOS2D -HTML5 JS A*算法

    A*(A-star)算法是一种用于路径查找的图搜索算法,广泛应用于游戏开发中的角色寻路、地图导航等问题。它通过结合最佳优先搜索(BFS)和Dijkstra算法的优点,既能保证找到最短路径,又能有效减少搜索空间,提高效率...

    Orge手册,以及A*算法原理

    Orge(Object-Oriented Graphics Rendering Engine)是一款强大的3D图形渲染引擎,而A*(A-star)算法则是游戏中的寻路算法首选,尤其在实时策略或角色扮演游戏中,它确保了角色能够快速准确地找到目的地。...

Global site tag (gtag.js) - Google Analytics