人工智能搜索策略:A*算法 目录
A算法 在图搜索算法中,如果能在搜索的每一步都利用估价函数f(n)=g(n)+h(n)对Open表中的节点进行排序,则该搜索算法为A算法。由于估价函数中带有问题自身的启发性信息,因此,A算法又称为启发式搜索算法。 在全局择优搜索中,每当需要扩展节点时,总是从Open表的所有节点中选择一个估价函数值最小的节点进行扩展。其搜索过程可能描述如下: (1)把初始节点S0放入Open表中,f(S0)=g(S0)+h(S0); 由于上述算法的第(7)步要对Open表中的全部节点按其估价函数值从小到大重新进行排序,这样在算法第(3)步取出的节点就一定是Open表的所有节点中估价函数值最小的一个节点。因此,它是一种全局择优的搜索方式。 例 1: 八数码难题。 设问题的初始状态S0和目标状态Sg如图所示,估价函数与请用全局择优搜索解决该题。 解:这个问题的全局择优搜索树如图1所示。在图1中,每个节点旁边的数字是该节点的估价函数值。例如,对节点S2,其估价函数的计算为 图1 八数码难题的全局择优搜索树 在局部择优搜索中,每当需要扩展节点时,总是从刚生成的子节点中选择一个估价函数值最小的节点进行扩展。其搜索过程可描述如下: (1)把初始节点S0放入Open表中,f(S0)=g(S0)+h(S0); 由于这一算法的第六步仅仅是把刚生成的子节点按其估价函数值从小到大放入Open表中,这样在算法第(3)步取出的节点仅是刚生成的子节点中估价函数值最小的一个节点。因此,它是一种局部择优的搜索方式。 上一节讨论的启发式搜索算法,都没有对估价函数f(n)做任何限制。实际上,估价函数对搜索过程是十分重要的,如果选择不当,则有可能找不到问题的解,或者找到的不是问题的最优解。为此,需要对估价函数进行某些限制。A*算法就是对估价函数加上一些限制后得到的一种启发式搜索算法。 一部分是从初始节点S0到节点n的最小代价,记为g*(n); 另一部分是从节点n到目标节点的最小代价,记为h*(n),当问题有多个目标节点时,应选取其中代价最小的一个。 因此有 f*(n)=g*(n) +h*(n) g(n)是对g*(n)的一个估计 h(n)是对h*(n)的一个估计。 在这两个估计中,尽管g(n)的值容易计算,但它不一定就是从初始节点S0到节点n的真正最小代价,很有可能从初始节点S0到节点n的真正最小代价还没有找到,故有 有了g*(n) 和h*(n)的定义,如果我们对A算法(全局择优的启发式搜索算法)中的g(n)和h(n)分别提出如下限制: • g(n)是对g*(n)的估计,且g(n)>0; • h(n)是对h*(n)的下界,即对任意节点n均有 则称得到的算法为A*算法。 1. A*算法的可纳性 一般来说,对任意一个状态空间图,当从初始节点到目标节点有路径存在时,如果搜索算法能在有限步内找到一条从初始节点到目标节点的最佳路径,并在此路径上结束,则称该搜索算法是可纳的。A*算法是可采纳的。下面我们分三步来证明这一结论。 定理1 对有限图,如果从初始节点S0到目标节点Sg有路径存在,则算法A*一定成功结束。 引理0 在最佳路径上的所有节点n的f值都应相等,即f(n)=f*(S0) 引理1 对无限图,如果从初始节点S0到目标节点Sg有路径存在,且A*算法不终止的话,则从Open表中选出的节点必将具有任意大的f值。 因为是最佳路径的代价,故有 又因为h(n)>=0 ,故有 如果A算法不终止的话,从Open表中选出的节点必将具有任意大的d*(n)值,因此,也将具有任意大的f值。 引理2 在A*算法终止前的任何时刻,Open表中总存在节点n’,它是从初始节点S0到目标节点的最佳路径上的一个节点,且满足。 引理2 证明: 设从初始节点S0到目标节点t的最佳路径序列为 S0= n0,n1 ,…,nk =Sg 算法开始时,节点S0在Open表中,当节点S0离开Open进入Closed表时,节点n1进入Open表。因此,A没有结束以前,在Open表中必存在最佳路径上的节点。设这些节点排在最前面的节点为n’,则有 由于n’在最佳路径上,故有 从而 又由于A算法满足 故有 因为在最佳路径上的所有节点的f*值都应相等,因此有 定理2 对无限图,若从初始节点S0到目标节点t有路径存在,则A*算法必然会结束。 推论1 Open表中任一具有 定理3 A算法是可采纳的,即若存在从初始节点S0到目标节点Sg的路径,则A算法必能结束在最佳路径上。 但由引理2可知,在A算法结束前,必有最佳路径上的一个节点n’在Open表中,且有 这时,A算法一定会选择n’来扩展,而不可能选择t,从而也不会去测试目标节点t,这就与假设A算法终止在目标节点t相矛盾。因此,A*算法只能终止在最佳路径上。 在A*算法中,对任何被扩展的任一节点n,都有 证明:令n是由A*选作扩展的任一节点,因此n不会是目标节点,且搜索没有结束。由引理2可知,在Open表中有满足 的节点n’。若n=n’,则有 否则,算法既然选择n扩展,那就必有 ,所以有 A算法的搜索效率很大程度上取决于估价函数 h(n)。一般说来,在满足**h(n)≤h(n)**的前提下,h(n)的值越大越好。h(n)的值越大,说明它携带的启发性信息越多,A算法搜索时扩展的节点就越少,搜索的效率就越高? 定理4 设有两个A算法A1和A2*,它们有 在A*算法中,每当扩展一个节点n时,都需要检查其子节点是否已在Open表或Closed表中。对于那些已在Open表中的子节点,需要决定是否调整指向其父节点的指针;对于那些已在Closed表中的子节点,除了需要决定是否调整其指向父节点的指针外,还需要决定是否调整其子节点的后继节点的父指针。这就增加了搜索的代价。如果我们能够保证,每当扩展一个节点时就已经找到了通往这个节点的最佳路径,就没有必要再去检查其后继节点是否已在Closed表中,原因是Closed表中的节点都已经找到了通往该节点的最佳路径。为满足这一要求,我们需要=启发函数h(n)增加单调性限制。 定义1 如果启发函数满足以下两个条件: 其中c (ni,nj)是节点ni到其子节点nj的边代价,则称h(n)满足单调限制。 上式也可以写成 它说明从节点ni到目标节点最小代价的估值不会超过从节点ni到其子节点nj的边代价加上从nj到目标节点的最小代价估值。 定理5 如果h满足单调条件,则当A*算法扩展节点n时,该节点就找到了通往它的最佳路径,即 定理5 证明: 设A正要扩展节点n,而当节点序列 S0= n0,n1 ,…,nk =Sg 是由初始节点S0到节点n的最佳路径。其中,ni是这个序列中最后一个位于Closed表中的节点,则上述节点序列中的ni+1节点必定在Open表中,则 因为 有 由于节点ni和ni+1都在最佳路径上, 所以 一直推导下去可得 由于节点在最佳路径上,故有 因为这时A扩展节点n而不扩展节点ni+1,则有 即 所以有 例 2 A*算法解决八数码难题 在例1中,我们取h(n)=W(n)。尽管我们对h*(n)不能确切知道,但采用单位代价时,通过对“不在位”数码个数的估计,可以得出至少要移动W(n).因为,例1所定义的和h(n)满足A算法的限制条件。 例3 修道士和野人问题 对A算法,首先需要确定评估函数。设g(n)=d(n),h(n)=m+c-2b,则有 A算法在搜索过程中open表和close表中实际上是存储一棵树,但这棵树的树干会经常变动,许多节点常会改变父子关系。见下图 • 启发函数h(n)是很难得到的有时不得不放宽一点要求。----B算法 • A算法是一种理想的算法,实际应用中有时是做不到的 • F=g时:只低头拉车不抬头看路 • F=h时:“纯冒险家” ,从不总结走过的路 • F=g+h时:完美的,理智的,经典的 • 结合人的思维方式—有时会有些灵感 熟练掌握A*算法的性质 • 最佳路径上的所有节点的f值都应相等 在A*算法终止前的任何时刻,Open表中总存在节点n’,它是从初始节点S0到目标节点的最佳路径上的一个节点,且满足 • Open表中任一具有 • 在A算法中,对任何被扩展的任一节点n,都有 设有两个A算法A1和A2*,它们有 • 如果启发函数满足以下两个条件: 其中c (ni,nj)是节点ni到其子节点nj的边代价,则称h(n)满足单调限制 • 如果h满足单调条件,则当A*算法扩展节点n时,该节点就找到了通往它的最佳路径,即 |