A*算法之祥解
在介绍 A* 算法前,先提一下广度优先搜索,广度优先搜索就是每次将当前状态可能发展的策略逐层展开,比如一个地图中,对象允许向四个方向移动,那么,就将地点处,对象向上下左右各移动一步,将四个状态都保存在内存中,然后再从这四个出发点向各自的四个方向再移动一步... (当然这里可以剔除不合理的移动方法,比如不准向回移动)实际上,整个搜索好似一个圆形向外展开,直到到达目的地。很明显这样求解一定能找到最优解,但节点展开的数量是和距离成级数增加的,真的用在游戏中,玩家会抱怨内存128M也不够用了^_^ 而且伴随待处理节点数的增加,处理速度也会迅速减慢... 可以说这个算法并不实用。
而 A* 算法实际是一种启发式搜索,所谓启发式搜索,就是利用一个估价函数评估每次的的决策的价值,决定先尝试哪一种方案,这样可以极大的优化普通的广度优先搜索。一般来说,从出发点(A)到目的地(B)的最短距离是固定的,我们可以写一个函数 judge() 估计 A 到 B 的最短距离,如果程序已经尝试着从出发点 A 沿着某条路线移动到了 C 点, 那么我们认为这个方案的 A B 间的估计距离为 A 到 C 实际已经行走了的距离 H 加上用 judge() 估计出的 C 到 B 的距离。
如此,无论我们的程序搜索展开到哪一步,都会算出一个评估值,每一次决策后,将评估值和等待处理的方案一起排序,然后挑出待处理的各个方案中最有可能是最短路线的一部分的方案展开到下一步,一直循环到对象移动到目的地,或所有方案都尝试过却没有找到一条通向目的地的路径则结束。(通常在游戏里还要设置超时控制的代码,当内存消耗过大或用时过久就退出搜索)
怎么写这个算法中的估价函数非常的重要,如何保证一定能找到最短路径呢?充要条件是,你的估价函数算出的两点间的距离必须小于等于实际距离。这个可以从数学上严格证明,有兴趣可以自己去查阅相关资料。如果你的估价函数不满足这点,就只能叫做 A 算法,并不能保证最后的结果是最优的,但它可能速度非常的快。而游戏中我们也不一定非要得到最优解的,但无疑,满足那个条件的 A* 算法中,估计值越接近真实值的估价函数就做的越好。
何谓启发式搜索算法
在说它之前先提提状态空间搜索。状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。通俗点说,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有很多,主要是求解过程中求解条件的不确定性,不完备性造成的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空间。问题的求解实际上就是在这个图中找到一条路径可以从开始到结果。这个寻找的过程就是状态空间搜索。
常用的状态空间搜索有深度优先和广度优先。广度优先是从初始状态一层一层向下找,直到找到目标为止。深度优先是按照一定的顺序前查找完一个分支,再查找另一个分支,以至找到目标为止。这两种算法在数据结构书中都有描述,可以参看这些书得到更详细的解释。
前面说的广度和深度优先搜索有一个很大的缺陷就是他们都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效率实在太低,甚至不可完成。在这里就要用到启发式搜索了。
启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。我们先看看估价是如何表示的。
启发中的估价是用估价函数表示的,如:
f(n) = g(n) + h(n)
其中f(n)是节点n的估价函数,g(n)实在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。如果说详细点,g(n)代表了搜索的广度的优先趋势。但是当h(n)>>g(n)时,可以省略g(n),而提高效率。这些就深了,不懂也不影响啦!我们继续看看何谓A*算法。
初识A*算法
启发式搜索其实有很多的算法,比如:局部择优搜索法、最好优先搜索法等等。当然A*也是。这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的策略不同。象局部择优搜索法,就是在搜索的过程中选取“最佳节点”后舍弃其他的兄弟节点,父亲节点,而一直得搜索下去。这种搜索的结果很明显,由于舍弃了其他的节点,可能也把最好的节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局的最佳。最好优先就聪明多了,他在搜索时,便没有舍弃节点(除非该节点是死节点),在每一步的估价中都把当前的节点和以前的节点的估价值比较得到一个“最佳的节点”。这样可以有效的防止“最佳节点”的丢失。
那么A*算法又是一种什么样的算法呢?其实A*算法也是一种最好优先的算法。只不过要加上一些约束条件罢了。由于在一些问题求解时,我们希望能够求解出状态空间搜索的最短路径,也就是用最快的方法求解问题,A*就是干这种事情的!我们先下个定义,如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:
f'(n) = g'(n) + h'(n)
这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值,h'(n)是n到目标的最断路经的启发值。由于这个f'(n)其实是无法预先知道的,所以我们用前面的估价函数f(n)做近似。g(n)代替g'(n),但g(n)>=g'(n)才可(大多数情况下都是满足的,可以不用考虑),h(n)代替h'(n),但h(n)<=h'(n)才可(这一点特别的重要)。可以证明应用这样的估价函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是A*算法。哈!你懂了吗?肯定没懂!接着看!
举一个例子,其实广度优先算法就是A*算法的特例。其中g(n)是节点所在的层数,h(n)=0,这种h(n)肯定小于h'(n),所以由前述可知广度优先算法是一种可采纳的。实际也是。当然它是一种最臭的A*算法。
再说一个问题,就是有关h(n)启发函数的信息性。h(n)的信息性通俗点说其实就是在估计一个节点的值时的约束条件,如果信息越多或约束条件越多则排除的节点就越多,估价函数越好或说这个算法越好。这就是为什么广度优先算法的那么臭的原因了,谁叫它的h(n)=0,一点启发信息都没有。但在游戏开发中由于实时性的问题,h(n)的信息越多,它的计算量就越大,耗费的时间就越多。就应该适当的减小h(n)的信息,即减小约束条件。但算法的准确性就差了,这里就有一个平衡的问题。可难了,这就看你的了!
分享到:
相关推荐
**A*算法详解** A*算法是Dijkstra算法的一种扩展,它引入了启发式函数来指导搜索过程,从而提高了效率。算法的核心在于评估每个节点的f值,其中f(n) = g(n) + h(n),g(n)是从初始节点到当前节点的实际代价,h(n)是...
【A*算法详解】 A*算法是人工智能领域中用于寻找最短路径的一种高效搜索策略,尤其在路径规划问题中有着广泛的应用。它结合了Dijkstra算法的无偏搜索特性和Greedy最佳优先搜索的启发式特性,以更快的速度找到从起点...
A* 算法是一种在图形搜索中广泛使用的启发式搜索策略,它的主要目标是找到从起点到终点的最短路径。在这个特定的上下文中,我们讨论的是在Matlab环境中实现A*算法来解决路径规划问题。A*算法结合了Dijkstra算法的最...
A*算法(A-Star)是一种广泛应用的启发式搜索算法,它结合了Dijkstra算法的最优化路径寻找与启发式信息的高效性。而基于MATLAB实现的双向A*算法,则是A*算法的一种优化形式,旨在进一步提升路径规划的效率。 首先,...
《人工智能:滑动积木块与A*算法详解》 在人工智能领域,寻路算法是解决智能体在复杂环境中寻找最优路径的关键技术。其中,A*(A-Star)算法因其高效性和准确性,被广泛应用于游戏开发、地图导航、机器人路径规划等...
A*算法是一种广泛应用的启发式搜索算法,它结合了Dijkstra算法的全局最优性和 Greedy最佳优先搜索算法的效率。 A*算法的核心在于使用了启发式函数(h(n)),它估算从当前节点到目标节点的直线距离或曼哈顿距离,...
A*算法,动态路径规划算法的一种,程序直接放到matlab即可运行。
A*算法是一种高效的启发式搜索算法,广泛用于解决此类问题。本篇将详细介绍A*算法的原理以及其在Python中的实现,并结合附件中的代码和测试样例进行解析。 A*算法的核心思想是通过评估节点的启发式分数(f(n))来...
a*算法流程图(只是流程图)A*算法是一种在静态路网中求解最短路径最有效的直接搜索方法,也是解决许多其他搜索问题的有效算法。算法中的距离估算值与实际值越接近,扩展的节点数越少, 搜索速度越快。
A*(发音为“A-star”)算法是一种广泛应用的路径搜索算法,它在计算机科学和机器人领域中被广泛用于解决寻路问题。ROS(Robot Operating System)是机器人领域的一个开源操作系统,提供了一整套工具和服务,使得...
A*(A-star)算法是一种广泛应用的路径搜索算法,它在自动寻路系统中起着核心作用。易语言是一种中国本土开发的、面向对象的编程语言,它以其简单易学的特点受到很多程序员的喜爱。这个“A*走路 自动寻路A*算法 ...
A*算法是一种在图形搜索中用于寻找从起点到终点最短路径的有效算法,它结合了Dijkstra算法的全局最优性和Greedy最佳优先搜索算法的效率。A*算法的核心在于引入了启发式函数,使得搜索更加高效,能够在大量可能的路径...
《八数码问题与A*算法实现详解》 八数码问题,又称滑动拼图或15拼图,是一个经典的计算机科学问题,属于图灵完全问题的范畴。它涉及到在一个3x3的网格上,通过空格与其他数字进行交换,使得初始布局最终转变为预设...
A*算法 A star 算法(matlab)版本,可以直接使用,包含路径优化。直接下载即可运行。A*算法 A star 算法(matlab)版本,可以直接使用,包含路径优化。直接下载即可运行。
### A*游戏算法详解 #### 一、引言 A*(读作A星)算法是一种广泛应用于游戏开发中的路径寻找算法,它不仅能够高效地解决路径规划问题,还能够确保寻找到最优路径。尽管A*算法对于初学者来说可能显得有些复杂,但...
**A*算法详解** A*算法是一种启发式搜索算法,广泛应用于路径规划、游戏AI、图形处理等领域。它结合了Dijkstra算法的最优性保证和Greedy算法的搜索效率,通过一个评估函数来指导搜索方向,减少无效的探索。评估函数...
A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 本实例主要针对自动驾驶技术当中A*算法的应用现象,...
本实验重点探讨了如何用C语言实现A*算法来解决八数码问题。 A*算法是一种启发式搜索算法,由人工智能先驱Peter Hart、Nils Nilsson和Bertram Raphael于1968年提出。它的核心思想是结合了最佳优先搜索(如广度优先...
用A*算法求解重排九宫问题,将九宫格以3*3矩阵形式设计为动态对象数组类的对象,形式比较新颖。希望对大家了解A*算法,重排九宫,以及c++的动态对象数组类有所帮助。文档包含一个动态对象数组类头文件和一个源文件。