人工智能第三章 搜索原理.docx
- 文档编号:29283954
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:36
- 大小:267.29KB
人工智能第三章 搜索原理.docx
《人工智能第三章 搜索原理.docx》由会员分享,可在线阅读,更多相关《人工智能第三章 搜索原理.docx(36页珍藏版)》请在冰豆网上搜索。
人工智能第三章搜索原理
第三章搜索原理
上一章中我们研究了知识表示方法,为人工智能问题的求解打下了基础。
从问题表示到问题的解决,有一个求解的过程。
接下来要研究的是实现求解的过程,采用的基本方法包括搜索和推理。
本章先介绍搜索技术,将要讨论问题求解的搜索原理,包括一些早期的搜索技术或用于解决比较简单问题的搜索原理和一些比较新的能够求解比较复杂问题的搜索原理,包括
算法、遗传算法和模拟退火算法等。
3.1盲目搜索
盲目搜索又叫做无信息搜索,一般只适用于求解比较简单的问题。
我们将学习的宽度优先搜索和深度优先搜索,属于盲目搜索方法。
3.1.1图搜索策略
可把图搜索策略看成一种在图中寻找路径的方法。
我们已经介绍过有关图的表示方法。
图中的节点对应于状态,而连线对应于操作符。
图搜索(GRAPHSEARCH)的一般过程如下:
(1)建立一个只含有起始节点S的搜索图G,把S放到一个叫做OPEN的未扩展节点表中(简称OPEN表)。
(2)建立一个叫做CLOSED的已扩展节点表(简称CLOSED表),其初始为空表。
(3)LOOP:
若OPEN表是空表,则失败退出。
(4)选择OPEN表上的第一个节点,把它从OPEN表移出并放进CLOSED表中。
称此节点为节点n,它是CLOSED表中节点的编号。
(5)若n为一目标节点,则有解并成功退出,此解是追踪图G中沿着指针从n到S这条路径而得到的(指针将在第7步中设置)。
(6)扩展节点n,同时生成不是n的祖先的那些后继节点的集合M。
把M的这些成员作为n的后继节点添入图G中。
(7)对那些未曾在G中出现过的(既未曾在OPEN表上或CLOSED表上出现过的)M成员设置一个通向n的指针。
把M的这些成员加进OPEN表。
对已经在OPEN或CLOSED表上的每一个M成员,确定是否需要更改通到n的指针方向。
对已在CLOSED表上的每个M成员,确定是否需要更改图G中通向它的每个后裔节点的指针方向。
(8)按某一任意方式或按某个探试值,重排OPEN表。
(9)GOLOOP。
图搜索算法中的几个重要名词
1.OPEN表
2.CLOSED表
节点
父节点
编号
节点
父节点
3.搜索图与搜索树
此过程生成一个明确的图G(称为搜索图)和一个G的子集T(称为搜索树),树T上的每个节点也在图G中。
搜索树是由第7步中设置的指针来确定的。
G中的每个节点(除S外)都有一个只指向G中一个父辈节点的指针,该父辈节点就定为树中那个节点的唯一父辈节点。
一般搜索过程框图
图搜索方法的几点分析:
图搜索过程的第8步对OPEN表上的节点进行排序,以便能够从中选出一个“最好”的节点作为第4步扩展用。
这种排序可以是任意的即盲目的(属于盲目搜索),也可以用以后要讨论的各种启发思想或其它准则为依据(属于启发式搜索)。
每当被选作扩展的节点为目标节点时,这一过程就宣告成功结束。
这时,能够重现从起始节点到目标节点的这条成功路径,其办法是从目标节点按指针向S返回追溯。
当搜索树不再剩有未被扩展的端节点时,过程就以失败告终(某些节点最终可能没有后继节点,所以OPEN表可能最后变成空表)。
在失败终止的情况下,从起始节点出发,一定达不到目标节点。
3.1.2宽度优先搜索
回顾上一节的寻找寿命为X的人的例子,如果搜索时,从节点A开始,对他的三个儿子按从左至右搜索,然后对他的所有孙子按从左至右搜索,依此下去。
这种搜索方式就是宽度优先搜索。
宽度优先搜索(breadth-firstsearch)的定义:
如果搜索是以接近起始节点的程度依次扩展节点的,那么这种搜索就叫做宽度优先搜索(breadth-firstsearch),如图3.3
所示。
从图可见,这种搜索是逐层进行的;在对下一层的任一节点进行搜索之前,必须搜索完本层的所有节点。
宽度优先搜索算法如下:
(1)把起始节点放到OPEN表中(如果该起始节点为一目标节点,则求得一个解答)。
(2)如果OPEN是个空表,则没有解,失败退出;否则继续。
(3)把第一个节点(节点n)从OPEN表移出,并把它放入CLOSED扩展节点表中。
(4)扩展节点n。
如果没有后继节点,则转向上述第
(2)步。
(5)把n的所有后继节点放到OPEN表的末端,并提供从这些后继节点回到n的指针。
(6)如果n的任一个后继节点是个目标节点,则找到一个解答,成功退出;否则转向第
(2)步。
算法动态演示图:
宽度优先搜索方法分析:
宽度优先搜索是图搜索一般过程的特殊情况,将图搜索一般过程中的第8步具体化为本算法中的第6步,这实际是将OPEN表作为“先进先出”的队列进行操作。
宽度优先搜索方法能够保证在搜索树中找到一条通向目标节点的最短途径;这棵搜索树提供了所有存在的路径(如果没有路径存在,那么对有限图来说,我们就说该法失败退出;对于无限图来说,则永远不会终止)。
例:
把宽度优先搜索应用于八数码难题时所生成的搜索树,这个问题就是要把初始棋局变为如下目标棋局的问题:
宽度优先搜索方法能够保证在搜索树中找到一条通向目标节点的最短途径;这棵搜索树提供了所有存在的路径(如果没有路径存在,那么对有限图来说,我们就说该法失败退出;对于无限图来说,则永远不会终止)。
例:
把宽度优先搜索应用于八数码难题时所生成的搜索树,这个问题就是要把初始棋局变为如右图所示的目标棋局问题:
图3.5对应动态演示图:
图3.5八数码难题的宽度优先搜索树
搜索树上的所有节点都标记它们所对应的状态描述,每个节点旁边的数字表示节点扩展的顺序(按顺时针方向移动空格)。
图中最后一个节点是目标节点。
3.1.3深度优先搜索
另一种盲目(无信息)搜索叫做深度优先搜索(depth-firstsearch)。
图3.6
是一个深度优先搜索示意图。
分析深度优先搜索示意图可看出,在深度优先搜索中,我们首先扩展最新产生的(即最深的)节点。
深度相等的节点可以任意排列。
我们定义节点的深度如下:
(1)起始节点(即根节点)的深度为0。
(2)任何其它节点的深度等于其父辈节点深度加上1。
首先,扩展最深的节点的结果使得搜索沿着状态空间某条单一的路径从起始节点向下进行下去;只有当搜索到达一个没有后裔的状态时,它才考虑另一条替代的路径。
替代路径与前面已经试过的路径不同之处仅仅在于改变最后n步,而且保持n尽可能小。
对于许多问题,其状态空间搜索树的深度可能为无限深,或者可能至少要比某个可接受的解答序列的已知深度上限还要深。
为了避免考虑太长的路径(防止搜索过程沿着无益的路径扩展下去),往往给出一个节点扩展的最大深度——深度界限。
任何节点如果达到了深度界限,那么都将把它们作为没有后继节点处理。
值得说明的是,即使应用了深度界限的规定,所求得的解答路径并不一定就是最短的路径。
含有深度界限的深度优先搜索算法如下:
(1)把起始节点S放到未扩展节点OPEN表中。
如果此节点为一目标节点,则得到一个解。
(2)如果OPEN为一空表,则失败退出。
(3)把第一个节点(节点n)从OPEN表移到CLOSED表。
(4)如果节点n的深度等于最大深度,则转向
(2)。
(5)扩展节点n,产生其全部后裔,并把它们放入OPEN表的前头。
如果没有后裔,则转向
(2)。
(6)如果后继节点中有任一个为目标节点,则求得一个解,成功退出;否则,转向
(2)。
算法动态演示图:
例:
按深度优先搜索生成的八数码难题搜索树,我们设置深度界限为5。
图3.8绘出了搜索树,粗线条的路径表明含有5条应用规则的一个解。
从图可见,深度优先搜索过程是沿着一条路径进行下去,直到深度界限为止,然后再考虑只有最后一步有差别的相同深度或较浅深度可供选择的路径,接着再考虑最后两步有差别的那些路径,等等。
图3.8八数码难题的深度优先搜索树
3.1.4等代价搜索
有些问题并不要求有应用算符序列为最少的解,而是要求具有某些特性的解。
搜索树中每条连接弧线上的有关代价以及随之而求得的具有最小代价的解答路径,与许多这样的广义准则相符合。
宽度优先搜索可被推广用来解决这种寻找从起始状态至目标状态的具有最小代价的路径问题,这种推广了的宽度优先搜索算法叫做等代价搜索算法。
有如下一些记号:
起始节点记为S;
从节点i到它的后继节点j的连接弧线代价记为c(i,j);
从起始节点S到任一节点i的路径代价记为g(i)。
在搜索树上,我们假设g(i)也是从起始节点S到节点i的最少代价路径上的代价,因为它是唯一的路径;
等代价搜索算法:
等代价搜索方法以g(i)的递增顺序扩展其节点,其算法如下:
(1)把起始节点S放到未扩展节点表OPEN中。
如果此起始节点为一目标节点,则求得一个解;否则令g(S)=0。
(2)如果OPEN是个空表,则没有解而失败退出。
(3)从OPEN表中选择一个节点i,使其g(i)为最小。
如果有几个节点都合格,那么就要选择一个目标节点作为节点i(要是有目标节点的话);否则,就从中选一个作为节点i。
把节点i从OPEN表移至扩展节点表CLOSED中。
(4)如果节点i为目标节点,则求得一个解。
(5)扩展节点i。
如果没有后继节点,则转向第
(2)步。
(6)对于节点i的每个后继节点j,计算g(j)=g(i)+c(i,j),并把所有后继节点j放进OPEN表。
提供回到节点i的指针。
(7)转向第
(2)步。
对应动态演示图:
图3.9等代价搜索算法框图
3.2启发式搜索
盲目搜索的不足:
效率低,耗费过多的计算空间与时间。
分析前面介绍的宽度优先、深度优先搜索,或等代价搜索算法,其主要的差别是OPEN表中待扩展节点的顺序问题。
人们就试图找到一种方法用于排列待扩展节点的顺序,即选择最有希望的节点加以扩展,那么,搜索效率将会大为提高。
启发信息:
进行搜索技术一般需要某些有关具体问题领域的特性的信息,把此种信息叫做启发信息。
把利用启发信息的搜索方法叫做启发性搜索方法。
3.2.1启发式搜索策略
假设初始状态、算符和目标状态的定义都是完全确定的,然后决定一个搜索空间。
因此,问题就在于如何有效地搜索这个给定空间。
启发信息按其用途可分为下列3种:
(1)用于决定要扩展的下一个节点,以免像在宽度优先或深度优先搜索中那样盲目地扩展。
(2)在扩展一个节点的过程中,用于决定要生成哪一个或哪几个后继节点,以免盲目地同时生成所有可能的节点。
(3)用于决定某些应该从搜索树中抛弃或修剪的节点。
在本节中,我们只讨论利用上述第一种启发信息的状态空间搜索算法,即决定哪个是下一步要扩展的节点。
这种搜索总是选择“最有希望”的节点作为下一个被扩展的节点。
这种搜索叫做有序搜索(orderedsearch)。
3.2.2估价函数
用来估算节点希望程度的量度,叫做估价函数(evaluationfunction)。
一个节点的"希望"(promise)有几种不同的定义方法。
在状态空间问题中,一种方法是估算目标节点到此节点的距离;另一种方法认为,解答路径包括被估价过的节点,并计算全条路径的长度或难度。
每个不同的衡量标准只能考虑该问题中这个节点的某些决定性特性,或者对给定节点与目标节点进行比较,以决定相关特性。
我们用符号f来标记估价函数,用f(n)表示节点n的估价函数值。
暂时令f为任意函数,以后我们将会提出f是从起始节点约束地通过节点n而到达目标节点的最小代价路径上的一个估算代价。
3.2.3有序搜索
我们用估价函数f来排列GRAPHSEARCH第8步中OPEN表上的节点。
根据习惯,OPEN表上的节点按照它们f函数值的递增顺序排列。
根据推测,某个具有低的估价值的节点较有可能处在最佳路径上。
应用某个算法(例如等代价算法)选择OPEN表上具有最小f值的节点作为下一个要扩展的节点。
这种搜索方法叫做有序搜索或最佳优先搜索,而其算法就叫做有序搜索算法或最佳优先算法。
可见它总是选择最有希望的节点作为下一个要扩展的节点。
有序搜索(orderedsearch)又称为最好优先搜索(best-firstsearch)。
…>
有序状态空间搜索算法如下:
(1)把起始节点S放到OPEN表中,计算f(S)并把其值与节点S联系起来。
(2)如果OPEN是个空表,则失败退出,无解。
(3)从OPEN表中选择一个f值最小的节点i。
结果有几个节点合格,当其中有一个为目标节点时,则选择此目标节点,否则就选择其中任一个节点作为节点i。
(4)把节点i从OPEN表中移出,并把它放入CLOSED的扩展节点表中。
(5)如果i是个目标节点,则成功退出,求得一个解。
(6)扩展节点i,生成其全部后继节点。
对于i的每一个后继节点j:
(a)
计算f(j)。
(b)
如果j既不在OPEN表中,又不在CLOSED表中,则用估价函数f把它添入OPEN表。
从j加一指向其父辈节点i的指针,以便一旦找到目标节点时记住一个解答路径。
(c)
果j已在OPEN表上或CLOSED表上,则比较刚刚对j计算过的f值和前面计算过的该节点在表中的f值。
如果新的f值较小,则
(i)
以此新值取代旧值。
(ii)
从j指向i,而不是指向它的父辈节点。
(iii)
如果节点j在CLOSED表中,则把它移回OPEN表
(7)转向
(2),即GOTO
(2)。
…>
有序搜索算法框图示于图3.10
。
宽度优先搜索、等代价搜索和深度优先搜索统统是有序搜索技术的特例。
对于宽度优先搜索,我们选择f(i)作为节点i的深度。
对于等代价搜索,f(i)是从起始节点至节点i这段路径的代价。
有序搜索的有效性直接取决于f的选择,如果选择的f不合适,有序搜索就可能失去一个最好的解甚至全部的解。
如果没有适用的准确的希望量度,那么f的选择将涉及两个方面的内容:
一方面是一个时间和空间之间的折衷方案;另一方面是保证有一个最优的解或任意解。
3.2.4A*算法
A*算法的估价函数:
让我们描述一个特别的估价函数,这个估价函数f使得在任意节点上其函数值f(n)能估算出从节点S到节点n的最小代价路径的代价与从节点n到某一目标节点的最小代价路径的代价之总和,也就是说f(n)是约束通过节点n的一条最小代价路径的代价的一个估计。
因此,OPEN表上具有最小f值的那个节点就是所估计的加有最少严格约束条件的节点,而且下一步要扩展这个节点是合适的。
在正式讨论A*算法之前,我们先介绍几个有用的记号。
令k(ni,nj)表示任意两个节点ni和nj之间最小代价路径的实际代价(对于两节点间没有通路的节点,函数k没有定义)。
于是,从节点n到某个具体的目标节点ti,某一条最小代价路径的代价可由k(n,ti)给出。
我们令h*(n)表示整个目标节点集合{ti}上所有k(n,ti)中最小的一个,因此,h*(n)就是从n到目标节点最小代价路径的代价,而且从n到目标节点能够获得h*(n)的任一路径就是一条从n到某个目标节点的最佳路径(对于任何不能到达目标节点的节点n,函数h*没有定义)。
通常我们感兴趣的是想知道从已知起始节点S到任意节点n的一条最佳路径的代价k(S,n)。
为此,引进一个新函数g*,这将使我们的记号得到某些简化。
对所有从S开始可达到n的路径来说,函数g*定义为
g*(n)=k(S,n)
其次,我们定义函数f*,使得在任一节点n上其函数值f*(n)就是从节点S到节点n的一条最佳路径的实际代价加上从节点n到某目标节点的一条最佳路径的代价之和,即f*(n)=g*(n)+h*(n)
因而f*(n)值就是从S开始约束通过节点n的一条最佳路径的代价,而f*(S)=h*(S)是一条从S到某个目标节点中间无约束的一条最佳路径的代价。
我们希望估价函数f是f*的一个估计,此估计可由下式给出:
f(n)=g(n)+h(n)
其中:
g是g*的估计;h是h*的估计。
对于g(n)来说,一个明显的选择就是搜索树中从S到n这段路径的代价,这一代价可以由从n到S寻找指针时,把所遇到的各段弧线的代价加起来给出(这条路径就是到目前为止用搜索算法找到的从S到n的最小代价路径)。
这个定义包含了g(n)≥g*(n)。
对于h*(n)的估计h(n),它依赖于有关问题的领域的启发信息。
这种信息可能与八数码难题中的函数W(n)所用的那种信息相似。
我们把h叫做启发函数。
A算法和A*算法的定义
定义1在GRAPHSEARCH过程中,如果第8步的重排OPEN表是依据f(x)=g(x)+h(x)进行的,则称该过程为A算法。
定义2在A算法中,如果对所有的x,h(x)≤h*(x)成立,则称h(x)为h*(x)的下界,它表示某种偏于保守的估计。
定义3采用h*(x)的下界h(x)为启发函数的A算法,称为A*算法。
当h=0时,A*算法就变为有序搜索算法。
A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。
对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。
因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:
从起始节点到节点n的代价以及从节点n到达目标节点的代价。
A*算法
(1)把S放入OPEN表,记f=h,令CLOSED为空表。
(2)重复下列过程,直至找到目标节点止。
若OPEN为空表,则宣告失败。
(3)选取OPEN表中未设置过的具有最小f值的节点为最佳节点BESTNODE,并把它放入CLOSED表。
(4)若BESTNODE为一目标节点,则成功求得一解。
(5)若BESTNODE不是目标节点,则扩展之,产生后继节点SUCCSSOR。
(6)对每个SUCCSSOR进行下列过程:
(a)建立从SUCCSSOR返回BESTNODE的指针。
(b)计算g(SUC)=g(BES)+g(BES,SUC)。
(c)如果SUCCSSOR∈OPEN,则称此节点为OLD,并把它添至BESTNODE的后继节点表中。
(d)比较新旧路径代价。
如果g(SUC)<g(OLD),则重新确定OLD的父辈节点为BESTNODE,记下较小代价g(OLD),并修正f(OLD)值。
(e)若至OLD节点的代价较低或一样,则停止扩展节点。
(f)若SUCCSSOR不在CLOSE表中,则看其是否在CLOSED表中。
(g)若SUCCSSOR在CLOSE表中,则转向c。
(h)若SUCCSSOR既不在OPEN表中,又不在CLOSED表中,则把它放入OPEN表中,并添入BESTNODE后裔表,然后转向(7)
(i)计算f值。
(7)GOLOOP
根据所描述的算法可画出如下的A*算法框图:
<按A*算法编程求N数码难题的演示...
3.2.5AO*算法
1.与或图的解图及其费用
在一棵与或树中,加到一个节点上的"与"或者"或"标记取决于该节点与其父辈节点的关系。
一种情况是由总数据库标记的一个父辈节点拥有一组与后继节点,每一个后继节点都用一个分量数据库来标记。
另一种情况是由分量数据库标记的一个父辈节点拥有一组或后继节点,每个后继节点都用对该分量数据库应用一条选出的规则而得到的新数据库来标记。
我们所要讨论的一般是与或图,而不是与或树这种特殊情况,因为应用不同序列的规则可能生成相同的数据库。
例如,用来标记某一节点的某一分量数据库,既可以从已分解的一个复合节点得到,也可以使用某一条规则从另一个节点得到。
在这种情况下,对于其中一个父辈节点来说它可以叫做或节点,而对另一个父辈节点它又可以叫做与节点。
因此,我们一般不把一个与或图的节点叫做与节点或者或节点,而是引入某个适合于图的更一般的标记。
不过,我们仍然把这些结构叫做与或图,并在讨论与或树时继续采用与节点和或节点等术语。
这里我们把与或图定义为超图,并且不用弧线来连接节点对,而用几条超弧线来连接一个父辈节点和它的一组后继节点。
这些超弧线又叫做连接符。
每个k—连接符是从一个父辈节点指向一个含有k个后继节点的集合(如果所有连接符都是单一连接符,那么我们使得到一个普通图的特例)。
在与或树中,每个节点最多只有一个父辈节点。
在与或树和与或图中,我们把没有任何父辈节点的节点叫做根节点。
在与或图中,我们把没有后继节点的节点叫作叶节点(对于与或树则叫做端节点)。
一个可分解的产生式系统规定了一个隐含的与或图。
初始数据库对应于图中一个特别的节点,叫做起始节点。
起始节点有一个外向连接符连到它的一组后继节点,这些后继节点对应于初始数据库的分量(假如初始数据库可以加以分解的话)。
每条产生式规则在隐含图中都对应于一个连接符。
这种连接符指向的那些节点对应于应用规则和分解数据库后得到的分量数据库。
在隐含图中,与满足产生式系统终止条件的数据库相对应的是一个终节点集合。
产生式系统的任务可以看做是寻找从起始节点到终节点的某个解图。
粗略地说,从一个与或图的节点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的每个解图费用的总和。
由于我们有了无环的假设,所以该递归定义是满足的。
在一个解图费用的定义中,我们可能要不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能第三章 搜索原理 人工智能 第三 搜索 原理