AO*算法

转载:http://ist.csu.edu.cn/ai/Ai/chapter3/3251.htm

让我们来描述一种具有启发成分的估价函数的搜索过程,它可以被设计来用于与或图。h(n)是h*(n)的一个估计,h*(n)则是从节点n到一个终节点集合的一个最佳解图的费用。正如图搜索一样,如果h满足一定的限制,则搜索过程语句是可能得到简化的。
  在我们的讨论中,对h加以单调限制,即对隐含图中从节点n指向其后继节点n1,…,nk的每个连接符施加限制。我们假设

h(n)≤c+h(n 1)+…,+h(n k)
其中,c为连接符的费用。这一限制类似普通图中对启发函数的单调限制。对于n在终节点集合中的情况,若有h(n)=0,则单调限制意味着h是h*的一个下界,即对于所有的节点n,有h(n)≤h*(n)。 
  现在,我们可以把与或图启发式搜索过程陈述如下:
AO*过程 
  (1) 建立一个搜索图G,使其仅仅包含起始节点S,对应于节点S的费用为q(s)=h(s)。如果S为终节点,则标记S为SOLVED。 
  (2) unit1 S已经标记SOLVED,do: 
  (3) begin 
  (4) 通过跟踪G中从S出发的有标记的连接符(G的连接符将在以后的步骤中标记),计算G中的一个局部解图G'。 
  (5) select G' 的任意一个非终叶节点n(将在以后说明如何选择)。 
  (6) 扩展节点n,生成它的全部后继节点,并把它们作为n的后继节点设置在G中。于未曾在G中出现过的每一个后继节点nj,相应的费用q(nj)
= h(nj)。对这些后继节点中属于终节点者,标记SOLVED,并赋其值为0。
  (7) 建立一个正好包含节点n的单一节点集合S。
  (8) until S为空,do: 
  (9) begin 
  (10) 从S中移出这样的节点m,这个m在G中的后裔不出现在S中。
  (11) 根据以下步骤修改m的费用q(m):对于从m指向节点集{n1i,…,nki}的每个连接符,计算
qi(m) = Ci+q(n1i)+…+q(nki)
式中,q(nji)(其中j=1,2,…,k)或者通过这一内循环在上述某道运算中刚刚计算过,或者,这是第一道运算,那么它们已在第6步中计算过。令q(m)为全部外向连接符qi(m)中的最小值,并对这个具有最小值的连接符加以标记,如果以前的标记情况与此不同,则抹掉以前的标记,如果通过这个连接符的全部后继节点都已标记SOLVED,则标记此节点m为SOLVED。 
  (12) 如果m已标记为SOLVED,或者m的修正费用不同于它的前一道费用,则把m的所有那样的父辈节点都添加到S中去,这些父辈节点的通过某个有标记连接符的后继节点之一就是节点m。
  (13) end 
  (14) end 

  AO*算法可以理解为下列两个主要运算的反复。首先,一个自上而下的图生长运算(第4至第6步),通过跟踪有标记的连接符寻找最好的局部解图。这些以前计算过的标记指明在搜索图中离开每个节点的当前的最好局部解图(在该算法终止之前,最好的局部解图尚未产生它的全部终叶节点,所以称它为局部的)。对这个最好的局部解图的非终叶节点之一进行扩展,并把某个费用赋给它的后继节点。 
  AO*算法中的第二个主要运算是一个自下而上的费用修正、连接符标记和SOLVED标记的过程(第7-12步)。从刚被扩展的节点开始,此过程修正其费用值(利用其后继节点最新计算的费用),并把外向连接符标记到被估计为达到终节点的最好路径上。图中,这个修正值的估计是向上传送的(图的无环性保证这种向上传送过程不会遭到循环)。修正费用q(n)是从n到一组终节点的一个最佳解图费用的一个修正估计。仅仅那些经过费用修正的节点,其祖先才有可能拥有它们的修正值,因而只需要考虑这些祖先。由于我们曾经假设h是单调限制的,费用的修正只可能是费用的增大。因此,并非所有的祖先都需要进行费用修正,只有那些具有最好的局部解图而且含有修正费用的后裔之祖先才需要进行费用修正(所以有第12步)。
  AO*算法在一些特殊场合可以简化,可以进行改进,提高算法的性能,限于篇幅,暂时不对这些展开讨论。 

你可能感兴趣的:(Artificial,Intelligence)