1.与或图的解图及其费用
在一棵与或树中,加到一个节点上的"与"或者"或"标记取决于该节点与其父辈节点的关系。一种情况是由总数据库标记的一个父辈节点拥有一组与后继节点,每一个后继节点都用一个分量数据库来标记。另一种情况是由分量数据库标记的一个父辈节点拥有一组或后继节点,每个后继节点都用对该分量数据库应用一条选出的规则而得到的新数据库来标记。
我们所要讨论的一般是与或图,而不是与或树这种特殊情况,因为应用不同序列的规则可能生成相同的数据库。例如,用来标记某一节点的某一分量数据库,既可以从已分解的一个复合节点得到,也可以使用某一条规则从另一个节点得到。在这种情况下,对于其中一个父辈节点来说它可以叫做或节点,而对另一个父辈节点它又可以叫做与节点。因此,我们一般不把一个与或图的节点叫做与节点或者或节点,而是引入某个适合于图的更一般的标记。不过,我们仍然把这些结构叫做与或图,并在讨论与或树时继续采用与节点和或节点等术语。
这里我们把与或图定义为超图,并且不用弧线来连接节点对,而用几条超弧线来连接一个父辈节点和它的一组后继节点。这些超弧线又叫做连接符。每个k—连接符是从一个父辈节点指向一个含有k个后继节点的集合(如果所有连接符都是单一连接符,那么我们使得到一个普通图的特例)。图3.13给出一个与或图的例子。
图中,节点n。有二个1—连接符指向其后继节点n1,还有一个2—连接符指向其后继节点集合{n4,n5}。在我们所用的各个图例中,对于k>1的k-连接符,我们都用一般圆弧连接从父辈节点到其后继节点集合各元之间的所有弧线来表示(如果采用原先的术语,相对于它们共同的父辈节点n。,节点n4和n5可以称为一组与节点,而n1可称为或节点。而关于节点n8,它既居于其父辈节点n5的一个与节点集合,又是其父辈节点n4的一个或节点)。

图 3.13 与或图举例
在与或树中,每个节点最多只有一个父辈节点。在与或树和与或图中,我们把没有任何父辈节点的节点叫做根节点。在与或图中,我们把没有后继节点的节点叫作叶节点(对于与或树则叫做端节点)。
一个可分解的产生式系统规定了一个隐含的与或图。初始数据库对应于图中一个特别的节点,叫做起始节点。起始节点有一个外向连接符连到它的一组后继节点,这些后继节点对应于初始数据库的分量(假如初始数据库可以加以分解的话)。每条产生式规则在隐含图中都对应于一个连接符。这种连接符指向的那些节点对应于应用规则和分解数据库后得到的分量数据库。在隐含图中,与满足产生式系统终止条件的数据库相对应的是一个终节点集合。
产生式系统的任务可以看做是寻找从起始节点到终节点的某个解图。粗略地说,从一个与或图的节点n到节点集合N的一个解图类似于一个普通图中的一条路径。这个解图的求法如下:从节点n开始,正确地选择一条外向连接符,从该连接符所指向的后继节点出发,我们可以继续选用一个外向连接符,依此类推下去,直到最后由此产生的每个后继节点都是集合N中的一个元为止。图3.14中给出了图3.13中从节点n。到{n7,n8}的两个不同的解图。

图 3.14 两个不同的解图
假设我们的与或图中不包含环,即在与或图中不存在这样的节点,它的后继节点同时又是它的祖先。因而节点存在一种局部的顺序,它能保证我们所采用的递归过程的终止。今后,我们就一直使用这种无环性假定。
现在让我们来为解图下个精确的递归定义。
设某个与或图G中,从节点n到一节点集合N的一个解图记作G'。G'是G的子图。若n是N的一个元,则G'是由单一节点n组成的;若有一个指向节点{n1,n2,......,nk}的外向连接符K,使得从每个ni到N有一个解图,其中i=1,2,……,k,则G'由节点n、连接符K,节点{n1,…,nk}以及从{n1,…,nk}中的每个节点到N的解图所组成,否则从n到N不存在解图。
象在普通图中采用的弧线费用叶一样,在与或图中给连接符指定一定的费用往往是很有用的(这些费用模拟规则应用的代价。我们仍然需要假设每个费用都大于某个小的正数e)。然后,连接符的费用便可用来计算一个解图的费用。设从任意节点n到节点集合N的一个解图费用记为k(n,N),则值k(n,N)可以递归计算如下:
若n为N的一个元,则k(n,N)=0,否则,n有一个通到解图中后继节点集{n1,…,ni}的外向连接符。令该连接符的费用为Cn,于是我们可得
k(n,N)=Cn+k(n1,N)+…+k(ni,N)
从上式可以看出,从节点n到N的一个解图G'的费用等于离开n的外向连接符(在G'中)的费用加上从n的各后继节点(在G’中)到N的每个解图费用的总和。由于我们有了无环的假设,所以该递归定义是满足的。
在一个解图费用的定义中,我们可能要不止—次地计算解图中某些连接符的值。一般地说,离开某节点m的一个外向连接符的费用被算进从n到N的一个解图费用中去的次数,恰好等于在解图中从n到m的路径数。因此,在图3.14中,如果每个k—连接符的费用为k,两个解图的费用分别为8和7。
除了寻找从起始节点到一组终节点的任意解图之外,我们还可能想找出具有最小费用的一个解图来。我们称这样的一个解图为最佳解图。我们把从n到一组终节点的最佳解图的费用记作函数h*(n)。
2.AO*算法
让我们来描述一种具有启发成分的估价函数的搜索过程,它可以被设计来用于与或图。h(n)是h*(n)的一个估计,h*(n)则是从节点n到一个终节点集合的一个最佳解图的费用。正如图搜索一样,如果h满足一定的限制,则搜索过程语句是可能得到简化的。
在我们的讨论中,对h加以单调限制,即对隐含图中从节点n指向其后继节点n1,…,nk的每个连接符施加限制。我们假设
h(n)≤c+h(n1)+…,+h(nk)
其中,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*算法在一些特殊场合可以简化,可以进行改进,提高算法的性能,限于篇幅,暂时不对这些展开讨论。
[http://jxzy.lzptc.edu.cn/ziyuan/20/!rgzn/rengongzhineng/kejian/AI/Ai/chapter3/325.htm]