1 / 21
文档名称:

a-star算法.doc

格式:doc   大小:209KB   页数:21页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

a-star算法.doc

上传人:taotao0a 2017/4/13 文件大小:209 KB

下载得到文件列表

a-star算法.doc

相关文档

文档介绍

文档介绍:初识 A* 算法写这篇文章的初衷是应一个网友的要求, 当然我也发现现在有关人工智能的中文站点实在太少,我在这里抛砖引玉,希望大家都来热心的参与。还是说正题,我先拿 A* 算法开刀,是因为 A* 在游戏中有它很典型的用法,是人工智能在游戏中的代表。 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) 的信息性通俗点说其实就是在估计一个节点的值时