人工智能及其应用——第三章学习笔记(上)
所用书籍:《人工智能及其应用(第五版)》蔡自兴等
人工智能及其应用
第三章 确定性推理
第2章研究的知识表示方法是问题求解所必需的。
从问题表示到问题的解决,有个求解的过程,也就是搜索过程。在这一过程中,采用适当的搜索技术,包括各种规则、过程和算法等推理技术,力求找到问题的解答
3.1 图搜索策略
可把图搜索控制策略看成一种在图中寻找路径的方法
初始节点和目标节点分别代表初始数据库和满足终止条件的目标数据库。求得把一个数据库变换为另一个数据库的规则序列问题就等价于求得图中的一条路径问题
在图搜索过程中涉及到的数据结构除了图本身以外,还需要两个辅助的数据结构,即存放已访问但未扩展结点的OPENOPENOPEN表,以及存放已扩展节点的CLOSEDCLOSEDCLOSED表
搜索的过程实际是从隐式的状体空间图中不断生成显示的搜索图和搜索树,最终找到路径的过程
为实现这一过程,图中每个节点除了自身的状态信息外,还需存储诸如父节点是谁,由其父节点是通过什么操作可到达该节点,以及节点位于搜索树的深度、从起始节点到该节点的路径代价等信息
图搜索的一般过程如下:
- 建立一个只含有起始节点SSS的搜索图GGG,把SSS放到一个OPENOPENOPEN表中
- 初始化CLOSEDCLOSEDCLOSED表为空表
- LOOPLOOPLOOP:若OPENOPENOPEN表是空表,则失败退出
- 选择OPENOPENOPEN表上的第一个节点,把它从OPENOPENOPEN表移出并放进CLOSEDCLOSEDCLOSED表中。称此节点为节点nnn
- 若nnn为一目标节点,则有解并成功退出,此解是追踪图GGG中沿着指针从nnn到SSS这条路径而得到的
- 扩展节点nnn,生成后继节点集合MMM
- 对那些未曾在GGG中出现过的MMM成员设置其父节点指针指向nnn并加入OPENOPENOPEN表。对已经在OPENOPENOPEN或CLOSEDCLOSEDCLOSED表中出现过的每一个MMM成员,确定是否需要将其原来的父节点更改为nnn。对已在CLOSEDCLOSEDCLOSED表上的每个MMM成员,若修改了其父节点,则将该节点从CLOSEDCLOSEDCLOSED表中移出,重新加入OPENOPENOPEN表中
- 按某一任意方式或按某个试探值,重排OPENOPENOPEN表
- GO LOOPGO\ LOOPGO LOOP
此过程生成一个显示的图GGG(称为搜索图)和GGG的一个子集TTT(称为搜索树),树TTT上的每个节点也在图GGG中
搜索过程中使用的OPENOPENOPEN表存储的都是当前搜索树的叶子节点,因此也被称为FrongeFrongeFronge表,即前沿表
在失败终止的情况下,从起始节点出发,一定达不到目标节点
GRAPHSEARCHGRAPHSEARCHGRAPHSEARCH算法同时生成一个节点的所有后继节点。为了说明图搜索过程的某些通用性质,将继续使用同时生成所有后继节点的算法,而不采用修正算法。在修正算法中,一次只生成一个后继节点
从图搜索过程可以看出,是否重新安排OPENOPENOPEN表,即是否按照某个试探值重新对未扩展节点进行排序,将决定该图搜索过程是无信息搜索或启发式搜索
3.2 盲目搜索
不需要重新安排OPENOPENOPEN表的搜索叫做无信息搜索或盲目搜索,它包括宽度优先搜索、深度优先搜索和等代价搜索等。
盲目搜索只适用于求解比较简单的问题
3.2.1 宽度优先搜索
如果搜索是以接近起始节点的程度依次扩展节点的,那么这种搜素就叫作宽度优先搜索
宽度优先搜索算法如下:
- 把起始节点放到OPENOPENOPEN表中
- 如果OPENOPENOPEN是个空表,则没有解,失败退出;否则继续
- 把第一个节点从OPENOPENOPEN表移出,并把它放入CLOSEDCLOSEDCLOSED的扩展节点表中
- 扩展节点nnn如果没有后继节点,则转向上述第(2)步
- 把nnn的所有后继节点放到OPENOPENOPEN表的末端,并提供从这些后继节点回到nnn的指针
- 如果nnn的任一个后继节点是个目标节点,则找到一个解答,成功退出;否则转向第(2)步
宽度优先搜索方法在假定每一次操作的代价都相等的情况下,能够保证在搜索树中找到一条通向目标节点的最短途径。在宽度优先搜索中,节点进出OPENOPENOPEN表的顺序是先进先出,因此其OPENOPENOPEN表是一个队列结构
3.2.2 深度优先搜索
在深度优先搜索中,首先扩展最新产生的(即最深的)节点
深度相等的节点可以任意排列。定义节点的深度如下:
- 起始节点(即根节点)的深度为0
- 任何其他节点的深度等于其父节点深度加1
首先,扩展最深的节点的结果使得搜索沿着状态空间某条单一的路径从起始节点向下进行;只有当搜索到达一个没有后裔的状态时,它蔡考虑另一条替代的路径。替代路径与前面已经试过的路径的不同之处仅仅在于改变最后nnn步,而且保持nnn尽可能小
在搜索过程中可能会出现深度无限深,为了避免考虑太长的路径,往往给出一个节点扩展的最大深度——深度界限,任何节点如果达到了深度界限,那么都将它们作为没有后继节点处理。
但即使使用了这样的方法,所求得的路径也不一定就是最短路径
含有深度界限的深度优先搜索算法如下:
- 把起始节点SSS放到未扩展节点OPENOPENOPEN表中。如果此节点为一目标节点,则得到一个解
- 如果OPENOPENOPEN为一空表,则失败退出
- 把第一个节点从OPENOPENOPEN表移到CLOSEDCLOSEDCLOSED表
- 如果节点nnn的深度等于最大深度,则转向(2)
- 扩展节点nnn,产生其全部后裔,并把他们放入OPENOPENOPEN表的前头。如果没有后裔,则转向(2)
- 如果后继节点中有任一个为目标节点,则求得一个解;否则转(2)
显然,深度优先算法中节点进入OPENOPENOPEN表的顺序是后进先出,OPENOPENOPEN表是一个栈
3.2.3 等代价搜索
宽度优先搜索可被推广用来解决这种寻找从起始状态至目标状态的具有最小代价的路径问题,这种推广了的宽度优先搜索算法叫做等代价搜索算法。
如果所有的连接弧线具有相等的代价,那么等代价算法就简化为宽度优先搜索算法。在等代价搜索算法中,不是描述沿着等长度路径断层进行的扩展,而是描述沿着等代价路径断层进行的扩展
在等代价搜索算法中,把从节点iii到它的后继节点jjj的连接弧线代价记为c(i,j)c(i,j)c(i,j),把从起始节点SSS到任一节点iii的路径代价记为g(i)g(i)g(i)。
在搜索树上,假设g(i)g(i)g(i)也是从起始节点SSS到节点iii的最少代价路径上的代价,因为它是唯一的路径。等代价搜索方法以g(i)g(i)g(i)的递增顺序扩展其节点,其算法如下:
- 把起始节点SSS放到未扩展节点表OPENOPENOPEN中。如果此起始节点为一目标节点,则求得一个解,否则令g(S)=0g(S)=0g(S)=0
- 如果OPENOPENOPEN是个空表,则没有解而失败退出
- 从OPENOPENOPEN表中选择一个节点iii,使其g(i)g(i)g(i)为最小。如果有几个节点都合格,那么就要选择一个目标节点作为节点iii;否则,就从中选择一个作为节点iii。把节点iii从OPENOPENOPEN表移至扩展节点表CLOSEDCLOSEDCLOSED中
- 如果节点iii为目标节点,则求得一个解
- 扩展节点iii。如果没有后继节点,则转(2)
- 对于节点iii的每个后继节点jjj,计算g(j)=g(i)+c(i,j)g(j)=g(i)+c(i,j)g(j)=g(i)+c(i,j),并把所有后继节点jjj放进OPENOPENOPEN表。提供回到节点iii的指针
- 转向第(2)步
3.3 启发式搜索
盲目搜索的效率低,耗费过多的计算空间与时间。如果能够找到一种方法用于排列待扩展节点的顺序,即选择最有希望的节点加以扩展,那么搜索效率将会大为提高
3.3.1 启发式搜索策略和估价函数
要在盲目搜索中找到一个解,所需要扩展的节点数目可能是极大的,因为这些节点的扩展次序完全是随意的,且没有利用已解决问题的任何特性。这种结果是组合爆炸的一种表现形式
把进行这种搜索的技术一般需要某些有关具体问题领域的特性的信息,称为启发信息
把利用启发信息的搜索方法叫做启发式搜索方法
利用启发信息来决定哪个是下一步要扩展的节点,总是选择“最有希望”的节点,这种搜索方法叫做有序搜索,也称为最佳优先搜索
用来估算节点“希望”的量度叫做估价函数,估价函数的值越小,意味着该节点位于最优解路径上的“希望”越大,最后找到的最优路径即平均综合指标为最小的路径
估价函数能够提供一个评定候选扩展节点的方法,以确定哪个节点最有可能在通向目标的最佳路径上
启发信息用来排列第8步OPENOPENOPEN表上的节点,使得搜索沿着那些被认为最有希望的区段扩展。
用函数fff(估价函数)来排列第8步OPENOPENOPEN表上的节点。根据习惯,OPENOPENOPEN表上的节点按照它们fff函数值的递增顺序排列。根据推测,某个具有低的估价值的节点较有可能处在最佳路径上
3.3.2 有序搜索
有序搜索又称为最佳优先搜索,它总是选择最有希望的节点作为下一个要扩展的节点
尼尔逊(Nillson)(Nillson)(Nillson)曾提出一个有序搜索的基本算法,该算法的估价函数fff:一个节点的希望程度越大,其fff值就越小。被选为扩展的节点,是估价函数最小的节点
有序状态空间搜索算法如下:
- 把起始节点SSS放到OPENOPENOPEN表中,计算f(S)f(S)f(S)并把其值与节点SSS联系起来
- 如果OPENOPENOPEN是个空表,则失败退出,无解
- 从OPENOPENOPEN表中选择一个fff值最小的节点iii。如果有几个节点合格,当其中有一个为目标节点时,则选择此目标节点,否则就选择其中任一个节点作为节点iii
- 把节点iii从OPENOPENOPEN表中移出,并把它放入CLOSEDCLOSEDCLOSED的扩展节点表中
- 如果iii是一个目标节点,则成功退出,求得一个解
- 扩展节点iii,生成其全部后继节点。对于iii的每一个后继节点jjj:
- 计算f(j)f(j)f(j)
- 如果jjj既不在OPENOPENOPEN表中,又不在CLOSEDCLOSEDCLOSED表中,则用估价函数fff把它添入OPENOPENOPEN表。从jjj加一指向其父节点iii的指针,以便一旦找到目标节点时记住一个解答路径
- 如果jjj已在OPENOPENOPEN表或CLOSEDCLOSEDCLOSED表中,则比较刚刚对jjj计算过的fff值和前面计算过的该节点在表中的fff值。如果新的fff值较小,则:
- 以此新值取代旧值
- 从jjj指向iii,而不是指向它的父节点
- 如果节点jjj在CLOSEDCLOSEDCLOSED表中,则把它移回OPENOPENOPEN表
- 转向(2)
宽度优先搜索、等代价搜索和深度优先搜索都是有序搜索技术的特例。
宽度优先搜索,选择f(i)f(i)f(i)作为节点iii的深度。
对于等代价搜索,f(i)f(i)f(i)是从起始节点至节点iii这段路径的代价
与盲目搜索方法比较,有序搜索的目的在于减少被扩展的节点数
有序搜索的有效性直接取决于fff的选择,这将敏锐地辨别出有希望的节点和没有希望的节点,但是这种辨别不准确,可能会失去一个最好的解甚至全部的解
如果没有适用的、准确的希望量度,那么fff的选择将涉及两方面的内容:一方面是一个时间和空间之间的折中方案;另一方面是保证有一个最优的解或任意解
节点希望量度以及某个具体估价函数的合适程度取决于手头的问题情况。根据所要求的解答类型,可以把问题分为3种情况:
- 假设该状态空间含有几条不同代价的解答路径,其问题是要求得最优解答。这种情况的代表性的例子为算法A∗A^*A∗
- 与上面的情况相似,但有一个附加条件:此类问题是比较难的,如果按第一种情况加以处理,则搜索过程很可能在找到解答之前就超过了时间和空间界限。在这种情况下,关键问题是:①如何通过适当的搜索试验找到好的解答;②如何夏至搜索试验的范围和所产生的解答与最优解答的差异程度
- 不考虑解答的最优化;或者只存在一个解,或者任何一个解与其他的解一样好。这时,问题是如何使搜索试验的次数最少,而不像第二种情况那样试图使某些搜索试验和解答代价的综合指标最小
3.3.3 A∗A^*A∗算法
在讨论A∗A^*A∗算法前,先定义几个有用的记号:
- 令k(ni,nj)k(n_i,n_j)k(ni,nj)表示任意两个相通节点nin_ini和njn_jnj之间最小代价路径的实际代价
- 令h∗(n)h^*(n)h∗(n)表示整个目标节点集合{ti}\left\{t_i \right\}{ti}上所有k(n,ti)k(n,t_i)k(n,ti)中最小的一个,因此h∗(n)h^*(n)h∗(n)就是从nnn到目标节点最小代价路径的代价,而且从nnn到目标节点的代价为h∗(n)h^*(n)h∗(n)的任一路径就是一条从nnn到某个节点的最佳路径
- 引进函数g∗g^*g∗,对所有从SSS开始可达到nnn的路径来说,函数g∗g^*g∗定义为:
- g∗(n)=k(S,n)g^*(n)=k(S,n)g∗(n)=k(S,n)
- 定义函数f∗f^*f∗,使得在任一节点nnn上其函数值f∗(n)f^*(n)f∗(n)就是从节点SSS到节点nnn的一条最佳路径的实际代价,加上从节点nnn到某目标节点的一条最佳路径的代价之和,即
- f∗(n)=g∗(n)+h∗(n)f^*(n)=g^*(n)+h^*(n)f∗(n)=g∗(n)+h∗(n)
- 估价函数fff是f∗f^*f∗的一个估计,此估计可由下式给出:
- f(n)=g(n)+h(n)f(n)=g(n)+h(n)f(n)=g(n)+h(n)
- 其中:ggg是g∗g^*g∗的估计;hhh是h∗h^*h∗的估计;
- h∗(n)h^*(n)h∗(n)的估计h(n)h(n)h(n)依赖于有关问题的领域的启发信息,hhh叫做启发函数
- f(n)=g(n)+h(n)f(n)=g(n)+h(n)f(n)=g(n)+h(n)
A∗A^*A∗算法是一种有序搜索算法,其特点在于对估价函数的定义上
对于一般的有序搜索,总是选择fff值最小的节点作为扩展节点。因此,fff是根据需要找到一条最小代价路径的观点来估算节点的
可考虑每个节点nnn的估价函数值为两个分量:从起始节点到节点nnn的代价以及节点nnn到达目标节点的代价
先有以下定义:
- 在GRAPHSEARCHGRAPHSEARCHGRAPHSEARCH过程中,如果第8步的重排OPENOPENOPEN表是依据f(x)=g(x)+h(x)f(x)=g(x)+h(x)f(x)=g(x)+h(x)进行的,则称该过程为AAA算法
- 在AAA算法中,如果对所有的xxx存在h(x)≤h∗(x)h(x)\le h^*(x)h(x)≤h∗(x),则称h(x)h(x)h(x)为h∗(x)h^*(x)h∗(x)的下界,它表示某种偏于保守的估计
- 采用h∗(x)h^*(x)h∗(x)的下界h(x)h(x)h(x)为启发函数的AAA算法,称为A∗A^*A∗算法。当h=0h=0h=0时,A∗A^*A∗算法就变为等代价搜索算法
A∗A^*A∗算法:
- 把SSS放入OPENOPENOPEN表,记f=hf=hf=h,令CLOSEDCLOSEDCLOSED为空表
- 重复下列过程,直至找到目标节点为止。若OPENOPENOPEN表为空,则失败
- 选取OPENOPENOPEN表中未设置过的具有最小fff值的节点为最佳节点(BESTNODE)(BESTNODE)(BESTNODE),并移入CLOSEDCLOSEDCLOSED表
- 若最佳节点为一目标节点(SUCCESSOR)(SUCCESSOR)(SUCCESSOR),则成功求得一解
- 若最佳节点不是目标节点,则扩展结点,产生后继节点
- 对每个后继节点,进行下列过程:
- 建立从后继节点返回最佳节点的指针
- 计算g(SUC)=g(BES)+g(BES,SUC)g(SUC)=g(BES)+g(BES,SUC)g(SUC)=g(BES)+g(BES,SUC)
- 如果SUCCESSOR∈OPENSUCCESSOR\in OPENSUCCESSOR∈OPEN,则称此节点为OLDOLDOLD,并添加至BESTNODEBESTNODEBESTNODE的后继节点表中
- 比较新旧路径代价。如果g(SUC)<g(OLD)g(SUC)<g(OLD)g(SUC)<g(OLD),则重新确定OLDOLDOLD的父节点为BESTNODEBESTNODEBESTNODE,记下较小代价g(OLD)g(OLD)g(OLD),并修正f(OLD)f(OLD)f(OLD)值
- 若至OLDOLDOLD节点的代价较低或一样,则停止扩展节点
- 若SUCCESSORSUCCESSORSUCCESSOR不在OPENOPENOPEN表中,则看其是否在CLOSEDCLOSEDCLOSED表中
- 若SUCCESSORSUCCESSORSUCCESSOR在CLOSEDCLOSEDCLOSED表中,则比较新旧路径代价。如果g(SUC)<g(OLD)g(SUC)<g(OLD)g(SUC)<g(OLD),则重新确定OLDOLDOLD的父节点BESTNODEBESTNODEBESTNODE,记下较小代价g(OLD)g(OLD)g(OLD),修正f(OLD)f(OLD)f(OLD)值,并将OLDOLDOLD从CLOSEDCLOSEDCLOSED表中移出,移入OPENOPENOPEN表
- 若SUCCESSORSUCCESSORSUCCESSOR既不在OPENOPENOPEN表中,又不在CLOSEDCLOSEDCLOSED表中,则把它放入OPENOPENOPEN表中,并添入BESTNODEBESTNODEBESTNODE后裔表,然后转第7步
- 计算fff值
- GO LOOPGO\ \ LOOPGO LOOP
A∗A^*A∗算法中估价函数的定义是非常重要的,尤其是其中的启发函数h(n)h(n)h(n),由于启发信息在算法中就是通过h(n)h(n)h(n)体现,如果在估价函数的定义中恰好令h(n)=h∗(n)h(n)=h^*(n)h(n)=h∗(n),则可以看到搜索树将只扩展出最佳路径,也就是最理想的情况,但一般情况下必须满足h(n)h(n)h(n)不超过h∗(n)h^*(n)h∗(n)算法才能保证找到最优解,h(n)h(n)h(n)的这种特性称为可纳性,即h(n)h(n)h(n)的定义必须满足可纳性才能保证算法的最优性
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)