初识A*算法 写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里抛砖引玉,希望大家都来热心的参与
还是说正题,我先拿A*算法开刀,是因为A*在游戏中有它很典型的用法,是人工智能在游戏中的代表
A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚A*算法,我看还是先说说何谓启发式算法
一、何谓启发式搜索算法 在说它之前先提提状态空间搜索
状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程
通俗点说,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)
由于求解问题的过程中分枝有很多,主要是求解过程中求解条件的不确定性,不完备性造成的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空间
问题的求解实际上就是在这个图中找到一条路径可以从开始到结果
这个寻找的过程就是状态空间搜索
常用的状态空间搜索有深度优先和广度优先
广度优先是从初始状态一层一层向下找,直到找到目标为止
深度优先是按照一定的顺序前查找完一个分支,再查找另一个分支,以至找到目标为止
这两种算法在数据结构书中都有描述,可以参看这些书得到更详细的解释
前面说的广度和深度优先搜索有一个很大的缺陷就是他们都是在一个给定的状态空间中穷举
这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了
他的效率实在太低,甚至不可完成
在这里就要用到启发式搜索了
启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标
这样可以省略大量无畏的搜索路径,提到了效率
在启发式搜索中,对位置的估价是十分重要的
采用了不同的估价可以有不同的效果
我们先看看估价是如何表示的
启发中的估价是用估价函数表示的,如: f(n