继续搜索
为了继续搜索,我们简单的从开放列表中选择具有最小F值的方格,然后对选中的方格进行如下操作:
4.
将其从开放列表中移除,并加到封闭列表中。
5.
检验所有的相邻方格,忽略那些不可通过的或者已经在封闭列表里的方格。如果这个相邻方格不在开放列表中,就把它添加进去。并将当前选定方格设为新添方格的父方格。
6.
如果某个相邻方格已经在开放列表中了(意味着已经探测过,而且已经设置过父方格――译者),就看看有没有到达那个方格的更好的路径。也就是说,如果从当前选中方格到那个方格,会不会使那个方格的G值更小。如果不能,就不进行任何操作。
相反的,如果新路径的G值更小,就将该相邻方格的父方格重设为当前选中方格。(在上图中是改变其指针的方向为指向选中方格。最后,重新计算那个相邻方格的F和G值。如果你看糊涂了,下面会有图解说明。
好啦,咱们来看看具体点的例子。在初始时的9个方块中,当开始方格被加到封闭列表后,开放列表里还剩8个方格。在这八个方格当中,位于起点方格右边的那个方格具有最小的F值40。所以我们选择这个方格作为下一个中心方格。下图中它以高亮的蓝色表示。
[图四]
首先,我们将选中的方格从开放列表中移除,并加入到封闭列表中(所以用亮蓝色标记)。然后再检验它的相邻节点。那么在它紧邻的右边的方格都是墙,所以不管它们。左边挨着的是起始方格,而起始方格已经在封闭列表中了,所以我们也不管它。
其他四个方格已经在开放列表中,那么我们就要检验一下如果路径经由当前选中方格到那些方格的话会不会更好,当然,是用G值作为参考。来看看选中方格右上角的那一个方格,它当前的G值是14,如果我们经由当前节点再到达那个方格的话,G值会是20(到当前方格的G值是10,然后向上移动一格就再加上10)。为20的G值比14大,因此这样的路径不会更好。你看看图就会容易理解些。显然从起始点沿斜角方向移动到那个方格比先水平移动一格再垂直移动一格更直接。
当我们按如上过程依次检验开放列表中的所有四个方格后,会发现经由当前方格的话不会形成更好的路径,那我们就保持目前的状况不变。现在我们已经处理了所有相邻方格,准备到下一个方格吧。
我们再遍历一下开放列表,目前只有7个方格了。我们挑个F值最小的吧。有趣的是,目前这种情况下,有两个F值为54的方格。那我们怎么选择呢?其实选哪个都没关系,要考虑到速度的话,选你最近加到开放列表中的那一个会更快些。当离目的地越来越近的时候越偏向于选最后发现的方格。实际上这个真的没关系(对待这个的不同造成了两个版本的A*算法得到等长的不同路径)。
那我们选下面的那个好了,就是起始方格右边的,下图所示的那个。
[图五]
这一次,在我们检验相邻方格的时候发现右边紧挨的那个是墙,就不管它了。上面挨着的那个也同样忽略。还有右边墙下面那个方格我们也不管。为什么呢?因为你不可能切穿墙角直接到达那个格子。实际上你得先向下走然后再通过那个方格。这个过程中是绕着墙角走。(注意:穿过墙角的这个规则是可选的,取决于你的节点是如何放置的。)
那么还剩下其他五个相邻方格。当前方格的下面那两个还不在开放列表中,那我们把它们加进去并且把当前方格作为它们的父方格。其他三个中有两个已经在封闭列表中了(两个已经在图中用亮蓝色标记了,起始方格,上面的方格),所以就不用管了。最后那个,当前方格左边挨着的,要检查一下经由当前节点到那里会不会降低它的G值。结果不行,所以我们又处理完毕了,然后去检验开放列表中的下一个格子。
重复这个过程直到我们把目的方格加入到开放列表中了,那时候看起来会像下图这个样子。
[图六]
注意到没?起始方格下两格的位置,那里的格子已经和前一张图不一样了。之前它的G值是28并且指向右上方的那个方格。现在它的G值变成了20并且指向了正上方的方格。这个改变是在搜索过程中,它的G值被核查时发现在某个新路径下可以变得更小时发生的。然后它的父方格也被重设并且重新计算了G值和F值。在本例中这个改变看起来好像不是很重要,但是在很多种情况下这种改变会使到达目标的最佳路径变得非常不同。
那么我们怎样来自动得出实际路径的呢?很简单,只要从红色目标方格开始沿着每一个方格的指针方向移动,依次到达它们的父方格,最终肯定会到达起始方格。那就是你的路径!如下图所示。从A方格到B方格的移动就差不多是沿着这个路径从每个方格中心(节点)移动到另一个方格中心,直到抵达终点。简单吧!
[图七]
A*算法总结
1.
将开始节点放入开放列表(开始节点的F和G值都视为0);
2.
重复一下步骤:
i.
在开放列表中查找具有最小F值的节点,并把查找到的节点作为当前节点;
ii.
把当前节点从开放列表删除, 加入到封闭列表;
iii.
对当前节点相邻的每一个节点依次执行以下步骤:
1.
如果该相邻节点不可通行或者该相邻节点已经在封闭列表中,则什么操作也不执行,继续检验下一个节点;
2.
如果该相邻节点不在开放列表中,则将该节点添加到开放列表中, 并将该相邻节点的父节点设为当前节点,同时保存该相邻节点的G和F值;
3.
如果该相邻节点在开放列表中, 则判断若经由当前节点到达该相邻节点的G值是否小于原来保存的G值,若小于,则将该相邻节点的父节点设为当前节点,并重新设置该相邻节点的G和F值.
iv.
循环结束条件:
当终点节点被加入到开放列表作为待检验节点时, 表示路径被找到,此时应终止循环;
或者当开放列表为空,表明已无可以添加的新节点,而已检验的节点中没有终点节点则意味着路径无法被找到,此时也结束循环;
3.
从终点节点开始沿父节点遍历, 并保存整个遍历到的节点坐标,遍历所得的节点就是最后得到的路径;
分享到:
相关推荐
A*寻路算法(A* Pathfinding Algorithm)是游戏开发、地图导航、图形处理等领域中广泛使用的一种高效路径搜索算法。它的核心思想是在宽度优先搜索(BFS)和Dijkstra算法的基础上,通过引入启发式函数来优化搜索效率,尽...
本教程将详细介绍如何在Unity5.4.4版本中实现A*寻路算法,并提供一个完整的Demo示例。 首先,A*算法的核心在于评估每个节点的F值,该值由G值(从起始节点到当前节点的实际成本)和H值(从当前节点到目标节点的预计...
在提供的压缩包文件"seekroad"中,可能包含了一系列关于A*寻路算法的实例代码、教程文档或者演示程序,帮助学习者更好地理解和应用这个算法。通过深入学习和实践,你将能够熟练运用A*解决实际问题,提升你的编程能力...
这个教程“蛮牛教育 网上Unity 3D 教程 A星寻路算法”旨在帮助开发者深入理解和应用A*算法,以便在游戏中实现高效、智能的路径寻找。 A* 寻路算法是一种基于图的最短路径搜索算法,它结合了Dijkstra算法的全局最优...
A星(A*)搜索算法是一种广泛应用在图形搜索、游戏开发、路径规划等领域的高效寻路算法。它是Dijkstra算法的一种扩展,引入了启发式信息来提高搜索效率,同时保证找到的路径是最优的。本教程将深入讲解A*算法的核心...
A* Pathfinding Project 是一个功能强大并且易于使用的 Unity 寻路系统。通过快速的路径寻找,您的 AI 将立即在复杂的迷宫中找到玩家。非常适合 TD、FPS、RTS 游戏。 支持导航网格,支持3D、2D寻路。
A*(读作"A-star")算法是一种广泛应用的寻路算法,因其高效性和准确性而备受青睐。在Unity引擎中,有专门的插件支持A*寻路,如"A Pathfinding Project Pro",其版本为4.1.16,为我们提供了强大的寻路功能。 A*算法...
A*寻路算法是游戏开发和路径规划领域中广泛应用的一种高效搜索算法,尤其在Unity引擎中,它被广泛用于创建智能角色的导航系统。A*算法结合了Dijkstra算法的全面性和最佳优先搜索的效率,通过引入启发式信息来指导...
A*自动寻路算法是一种广泛应用在游戏开发、地图导航等领域中的高效路径搜索算法。它结合了Dijkstra算法的最短路径特性与BFS(广度优先搜索)的效率,通过评估函数来指导搜索,以找到从起点到终点的最优路径。在给定...
A星(A*)算法是一种在图形搜索中广泛使用的路径规划算法,特别是在游戏开发中用于实现角色或物体的自动寻路功能。它结合了最佳优先搜索(BFS)的全局最优性和Dijkstra算法的效率,通过引入启发式函数来估计从起点到...
本资源"20210812-A星寻路算法.rar"包含了一次深入的二叉树与A*算法的实践教程,结合视频教学、源代码和笔记,旨在帮助学习者深入理解并掌握这两种关键技术。 一、二叉树基础知识 二叉树是由n个节点组成的数据结构...
在易语言中实现A星寻路算法,是为了解决游戏、地图导航等领域中的路径规划问题。A星(A*)算法是一种高效的启发式搜索算法,它结合了Dijkstra算法和最佳优先搜索,能够找到从起点到终点的最短路径。 A星算法的核心...
《RPG游戏45度视角地图与A*寻路算法详解》 在计算机游戏开发领域,尤其是角色扮演游戏(Role-Playing Game,简称RPG)中,45度角地图渲染和寻路算法是两个至关重要的技术。本资源“RGP游戏人物45度地图+A星寻路算法...
本教程将深入探讨C++实现的寻路算法,这对于游戏开发者来说是必备的基础知识。 首先,我们要了解寻路算法的基本概念。寻路算法是一种用于解决网络中节点间最短路径问题的方法,如Dijkstra算法、A*算法等。在游戏...
压缩包中的`A星.e`可能是A星算法的基本实现文件,`A星三维算法.e`可能扩展到了三维空间的应用,而`A星寻路`可能是相关辅助文件或测试用例。在E易语言中,你需要理解这些源码文件中的数据结构、函数调用和逻辑流程,...
标题中的“Unity下A*算法实现”指的是在Unity游戏引擎中使用A*寻路算法来解决游戏中的路径规划问题。A*算法是一种启发式搜索算法,广泛应用于游戏开发、地图导航等领域,它通过评估节点的代价估计来智能地选择路径,...
综上所述,A星寻路算法在Unity中的实现不仅涉及到算法原理,还包括了与Unity引擎的整合、障碍物处理、启发式函数的选择以及性能优化等多个方面。通过这个项目,开发者可以构建出复杂而高效的寻路系统,为游戏中的AI...
A星(A*)算法是一种在图形搜索中非常有效的路径查找算法,尤其适用于游戏开发中的自动寻路系统。VB(Visual Basic)是一种由微软公司推出的事件驱动编程语言,它以其易学性和直观性受到许多程序员的喜爱。将A星算法与...
A*(A-star)算法是一种用于路径查找的图搜索算法,广泛应用于游戏开发中的角色寻路、地图导航等问题。它通过结合最佳优先搜索(BFS)和Dijkstra算法的优点,既能保证找到最短路径,又能有效减少搜索空间,提高效率...
Orge(Object-Oriented Graphics Rendering Engine)是一款强大的3D图形渲染引擎,而A*(A-star)算法则是游戏中的寻路算法首选,尤其在实时策略或角色扮演游戏中,它确保了角色能够快速准确地找到目的地。...