`
hw999
  • 浏览: 49170 次
文章分类
社区版块
存档分类
最新评论

A*寻路算法与它的速度

 
阅读更多

如果你是一个游戏开发者,或者开发过一些关于人工智能的游戏,你一定知道A*算法,如果没有接触过此类的东东,那么看了这一篇文章,你会对A*算法从不知道变得了解,从了解变得理解。
我不是一个纯粹的游戏开发者,我只是因为喜欢而研究,因为兴趣而开发,从一些很小的游戏开始,直到接触到了寻路等人工智能,才开始查找一些关于寻路方面的文章,从而知道了A*算法,因为对于初期了解的我这个算法比较复杂,开始只是copy而已,现在我们一起来精密的研究一下A*算法,以及提高它的速度的方法。

一,A*算法原理

我看过Panic翻译的国外高手Patrick Lester的一篇关于A*算法初探的文章,现在我就根据回忆,来慢慢认识A*算法的原理。
我们先来看一张图

aa

图中从起点到终点,需要绕过一些遮挡,也许我们看的比较简单,但是实际上,交给电脑来实现却要经过一番周折,电脑如何知道哪里有遮挡物,又是如何找到从起点到终点的最短路径的呢?
了解这些,我们首先要知道一个公式:
F = G + H
其中,F 是从起点经过该点到终点的总路程,G 为起点到该点的“已走路程”,H 为该点到终点的“预计路程”。
A*算法,要从起点开始,按照它的算法,逐步查找,直到找到终点。
初期,地图上的节点都是未开启也未关闭的初始状态,我们每检测一个节点,就要开启一些节点,检测完之后,要把检测完的节点,就要把它关闭。
我们需要一个开启列表和关闭列表,用来储存已经被开启的节点和被关闭的节点。
这些就让我们在实际过程中来深入了解吧。
看下面的图

aa

首先,我们来从起点出发,开启它周围的所有点,因为遮挡是无法通过的,我们不去管它,这样,被我们开启的节点,就是图中的三个节点,它们的父节点就是起点,所以图中的箭头指向起点,计算相应的FGH值,如图所视,检测完毕,将起点放入关闭列表。
这个时候,我们从被开启的所有节点中查找F值最小的节点,做为下一次检测的节点,然后开启它周围的点。
这时候起点左方和下方的F值都是70,我们根据自己的喜好选择任意一个,这里先选择下方的节点进行检测。
如下图

aa

首先把未被开启的剩下的节点的父节点指向检测点。
已经开启的点,我们不去开启第二遍,但是我们计算一下从检测点到达它们的新的G值是否更小,如果更小则代表目前的路径是最优的路径,那么把这个节点的父节点改为目前的检测点,并重新计算这个点的FGH的值,全部检测完毕之后,关闭检测点,然后开始寻找下一个节点,如此循环,直到找到终点。
然后从终点开始,按照每个节点的父节点,倒着画出路径,如下图

1

这个就是A*算法的原理,说难倒是不难,但是对于初步接触的人来说有点费劲而已。

二,A*算法的速度

前面,我们了解了A*算法的原理,发现,在每次查找最小节点的时候,我们需要在开启列表中查找F值最小的节点,研究A*的速度,这里就是关键,如何更快的找出这个最小节点呢?

1,普通查找算法

我们先来看看,最简单的做法,就是每次都把开启列表中所有节点检测一遍,从而找到最小节点

这里我用了一张很简单的地图来验证此方法
运行结果如图

aa

我们看到,耗时38毫秒,其实这个数字是不准确的,我们权且当作参考

2,排序查找算法

顾名思义,这个算法就是,始终维持开启列表的排序,从小到大,或者从大到小,这样当我们查找最小值时,只需要把第一个节点取出来就行了
维持列表的排序,方法是在太多了,我的方法也许很笨,勉强参考一下吧,我们每次排序的同时,顺便计算列表中的平均值,这样插入新节点的时候,根据这个平均值来判断从前面开始判断还是从后面开始判断

运行结果如图

aa

我们看到,耗时25毫秒,这个数字虽然不准确的,但是与普通查找算法相比较,速度确实是提高了

3,二叉树查找算法
(参考了火夜风舞的C++新霖花园中的文章)
这个算法可以说是A*算法的黄金搭档,也是被称为苛求速度的binary heap”的方法
就是根据二叉树原理,来维持开启列表的“排序”,这里说的排序只是遵循二叉树的原理的排序而已,即父节点永远比子节点小,就像下面这样
1
| |
5 9
| | |
7 12 10
二叉树每个节点的父节点下标 = n / 2;(小数去掉)
二叉树每个节点的左子节点下标 = n * 2;右子节点下标 = n * 2 +1
注意,这里的下标和它的值是两个概念

运行结果如图

aa

我们看到,耗时15毫秒,速度是这三个方法里最快的,但是因为这个数字是不够准确的,实际上,用二叉树查找法,会让A*算法的速度提高几倍到10几倍,在一些足够复杂的地图里,这个速度是成指数成长的。

4,总结
得出结论,用了A*算法,就要配套的用它的黄金搭档,二叉树,它可以让你的游戏由完美走向更完美。

分享到:
评论

相关推荐

    a*寻路算法,c++类

    纯C++算法类,头文件有注释,调用简单,速度极快

    基于A*寻路算法的AI贪吃蛇的贪心与哈密尔顿实现(python)

    在setting.py文件中可修改蛇的初始速度,蛇的速度单位,地图的长宽等 在run.py文件中可选择hamilton或者greedy两种解决方法之一来运行贪吃蛇ai 在游戏开始后按上和下来调整蛇的速度大小 用python实现贪吃蛇ai。游戏...

    人工智能寻路算法在电子游戏中的研究和应用.pdf

    在当今游戏工业界,A*算法是被大家最广泛使用的人工智能寻路算法,也是最有效的最短路径搜索算法。A*算法实际上是一种基于广度优先搜索基础上的启发式搜索算法,通常采用估价函数:f(n)=g(n)+h(n)对当前的搜索位置...

    Unity3d A star寻路算法

    基于Unity3d的A star寻路算法 ,完整demo 基于unity5.6 ,可以设置地图宽高,物体运行速度,是否可以穿过斜对角障碍。

    A*算法求解迷宫寻路问题实验

    实验四 人工智能 matlab A*算法求解迷宫寻路问题实验 寻路问题常见于各类游戏中角色寻路、三维虚拟场景中运动目标的路径规划、机器人寻路等多个应用领域。迷宫寻路问题是在以方格表示的地图场景中,对于给定的起点、...

    A*算法WinForm实现

    A*算法,A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题...算法中的距离估算值与实际值越接近,最终搜索速度越快。该资源是用WinForm实现的,可以更直接明了的查看到寻路路径

    A星寻路算法c++语言实现

    A*算法,A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。c++语言实现

    jpsplus+goalbounding寻路算法

    据说被A*快100倍的寻路算法,2015年提出。jps plus是在jps算法基础上对地图做了预处理,记录了一些跳点信息,加快寻找下一个跳点的速度;goalbinding做了另一些预处理,记录一些方向信息,避免往错误方向上寻找跳点...

    高效易用的A*寻路算法源代码

    该算法速度快(地图越大越复杂速度优势越明显),内部使用内存池和STL模板,使用方便简洁,源代码公开,就一个字:值...。 为了提高大家游戏研发质量,特公开源代码,与大家共勉。

    spacepath:应用于牛顿物理学的 A* 寻路演示

    使用的寻路算法是标准A *。 所有关于牛顿物理学的领域信息都完全包含在newt启发式函数中。 这表明A *可以有效地执行牛顿寻路。 对于代表性模拟, newt启发式搜索仅搜索广度优先搜索将探索的空间的 0.1%。 实施细则 ...

    a_game_road_find.rar_mapx_动态寻路_寻路算法_游戏寻_移动节点距离

    A*算法是一个求最短路径的函数,为许多即时战略游戏所用刀(或许人家大型的即时战略游戏笔者算法更好,不管它)。它由两个函数组成,一个是评估函数,也就是确定人物移动的下一个位置必须离目标位置最近,评估函数...

    矿用机器人局部路径优化算法研究

    为了使机器人要顺利避开巷道内障碍物达到目的地展开工作,提出了一种基于JPS(jump point search)—A*的算法,在保证选出最优路径的同时,大大减少了传统A*算法在寻路过程中扩展的节点。实验室仿真结果表明运用改进后...

    Unity插件 A Pathfinding Project寻路脚本

    Unity插件 A Pathfinding Project寻路脚本采用A*(A-Star)算法。 A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索...

    基于Matlab实现A星算法源码+项目说明+超详细注释.zip

    - Dijkstra算法建立在较为**抽象的图论层面**,A*算法可以更轻松地用在诸如游戏地图寻路中。 - Dijkstra算法的实质是**广度优先搜索**(因为在搜索到目标点之前,搜索了所有可能的点),是一种发散式的搜索,所以空间...

    pyastar:可从Python调用的C ++中非常简单的A *实现,用于在二维网格上进行寻路

    这是A *算法的非常简单的C ++实现,用于在二维网格上进行寻路。 求解器本身是用C ++实现的,但可以从Python调用。 这将C ++的速度与Python的便利性结合在一起。 我还没有进行任何正式的基准测试,但是当我在九岁的...

    Pathfinding-Visualizer:用于各种寻路算法的可视化工具

    我之所以建立这个应用程序,是因为我对寻路算法着迷,并且想将它们可视化。 我希望您喜欢玩这个可视化工具,就像我喜欢玩它一样。 您可以在这里访问它(使用Google Chrome!): : 符合算法 此应用程序支持以下...

    Pathfinding-Visualiser:直观地演示各种寻路算法的Javascript应用

    我之所以建立这个应用程序,是因为我对寻路算法着迷,并且想将它们可视化。 我希望您喜欢玩这个可视化工具,就像我喜欢玩它一样。 您可以在这里访问它(使用Google Chrome!):WIP符合算法此应用程序支持以下算法...

    Unity2D怪物AI-快速启发式寻路算法-多目标-多怪物大小-攻击范围

    使用BFS启发式算法,通过减支,排序提高搜索速度,减少不必要的搜索。 多目标同时进行搜索,找到最近目标,多种怪物大小寻路(1x1,2x2,... 介绍:https://blog.csdn.net/qq_41709801/article/details/127689213

    精华游戏算法整理(经典)

    在A*寻路算法中,我们通过从点A开始,检查相邻方格的方式,向外扩展直到找到目标。 我们做如下操作开始搜索: 1,从点A开始,并且把它作为待处理点存入一个“开启列表”。开启列表就像一张购物清单。尽管现在...

Global site tag (gtag.js) - Google Analytics