1、第 3 章 图搜索与问题求解 第 3 章 图搜索与问题求解 3.1 状态图搜索状态图搜索 3.2 状态图搜索问题求解状态图搜索问题求解 3.3 与或图搜索与或图搜索 3.4 与或图搜索问题求解与或图搜索问题求解 3.5 博弈树搜索博弈树搜索 习题三习题三 1谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.1 状状 态态 图图 搜搜 索索 3.1.1 3.1.1 状态图状态图例例3.13.1 走迷宫是人们熟悉的一种游戏,如图31就是一个迷宫。如果我们把该迷宫的每一个格子以及入口和出口都作为节点,把通道作为边,则该迷宫可以由一个有向图表示(如图3-2所示)。那么,走迷宫其实就是从该有向
2、图的初始节点(入口)出发,寻找目标节点(出口)的问题,或者是寻找通向目标节点(出口)的路径的问题。2谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-1 迷宫图 3谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-2 迷宫的有向图表示 4谢谢观赏2019-8-26第 3 章 图搜索与问题求解 例例 3.23.2 在一个33的方格棋盘上放置着1,2,3,4,5,6,7,8八个数码,每个数码占一格,且有一个空格。这些数码可在棋盘上移动,其移动规则是:与空格相邻的数码方可移入空格。现在的问题是:对于指定的初始棋局和目标棋局(如图3-3所示),给出数码的移动序列。该问题称为
3、八数码难题或重排九宫问题。可以看出,图中的一条边(即相邻两个节点的连线)就对应一次数码移动,反之,一次数码移动也就对应着图中的一条边。而数码移动是按数码的移动规则进行的。所以,图中的一条边也就代表一个移动规则或者移动规则的一次执行。于是,这个八数码问题也就是要在该有向图中寻找目标节点,或找一条从初始节点到目标节点的路径问题。5谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-3 八数码问题示例 6谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.1.2 3.1.2 状态图搜索状态图搜索1.1.搜索方式搜索方式用计算机来实现状态图的搜索,有两种最基本的方式:树式搜索和线式
4、搜索。所谓树式搜索,形象地讲就是以“画树”的方式进行搜索。即从树根(初始节点)出发,一笔一笔地描出一棵树来。准确地讲,树式搜索就是在搜索过程中记录所经过的所有节点和边。所以,树式搜索所记录的轨迹始终是一棵“树”,这棵树也就是搜索过程中所产生的搜索树。7谢谢观赏2019-8-26第 3 章 图搜索与问题求解 所谓线式搜索,形象地讲就是以“画线”的方式进行搜索。准确地讲,线式搜索在搜索过程中只记录那些当前认为是处在所找路径上的节点和边。所以,线式搜索所记录的轨迹始终是一条“线”(折线)。8谢谢观赏2019-8-26第 3 章 图搜索与问题求解 线式搜索的基本方式又可分为不回溯的和可回溯的两种。不回
5、溯的线式搜索就是每到一个“叉路口”仅沿一条路继续前进,即对每一个节点始终都仅生成一个子节点(如果有子节点的话)。生成一个节点的子节点也称对该节点进行扩展。这样,如果扩展到某一个节点,该节点恰好就是目标节点,则搜索成功;如果直到不能再扩展时,还未找到目标节点,则搜索失败。可回溯的线式搜索也是对每一个节点都仅扩展一条边,但当不能再扩展时,则退回一个节点,然后再扩展另一条边(如果有的话)。这样,要么最终找到了目标节点,搜索成功;要么一直回溯到初始节点也未找到目标节点,则搜索失败。9谢谢观赏2019-8-26第 3 章 图搜索与问题求解 由上所述可以看出,树式搜索成功后,还需再从搜索树中找出所求路径,
6、而线式搜索只要搜索成功,则“搜索线”就是所找的路径,即问题的解。那么,又怎样从搜索树中找出所求路径呢?这只需在扩展节点时记住节点间的父子关系即可。这样,当搜索成功时,从目标节点反向沿搜索树按所作标记追溯回去一直到初始节点,便得到一条从初始节点到目标节点的路径,即问题的一个解。10谢谢观赏2019-8-26第 3 章 图搜索与问题求解 2.2.搜索策略搜索策略由于搜索具有探索性,所以要提高搜索效率(尽快地找到目标节点),或要找最佳路径(最佳解)就必须注意搜索策略。对于状态图搜索,已经提出了许多策略,它们大体可分为盲目搜索和启发式(heuristic)搜索两大类。通俗地讲,盲目搜索就是无“向导”的
7、搜索,启发式搜索就是有“向导”的搜索。那么,树式盲目搜索就是穷举式搜索,即从初始节点出发,沿连接边逐一考察各个节点(看是否为目标节点),或者反向进行;而线式盲目搜索,对于不回溯的就是随机碰撞式搜索,对于回溯的则也是穷举式的搜索。11谢谢观赏2019-8-26第 3 章 图搜索与问题求解 启发式搜索则是利用“启发性信息”引导的搜索。所谓“启发性信息”就是与问题有关的有利于尽快找到问题解的信息或知识。例如:“欲速则不达”、“知已知彼,百战不殆”、“学如逆水行舟不进则退”等格言,就是指导人们行为的启发性信息。常识告诉我们,如果有向导引路,则就会少走弯路而事半功倍。所以,启发式搜索往往会提高搜索效率,
8、而且可能找到问题的最优解。根据启发性信息的内容和使用方式的不同,启发式搜索又可分为许多不同的策略,如全局择优、局部择优、最佳图搜索等等。按搜索范围的扩展顺序的不同,搜索又可分为广度优先和深度优先两种类型。对于树式搜索,既可深度优先进行,也可广度优先进行。对于线式搜索则总是深度优先进行。12谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.3.搜索算法搜索算法由于搜索的目的是为了寻找初始节点到目标节点的路径,所以在搜索过程中就得随时记录搜索轨迹。为此,我们用一个称为CLOSED表的动态数据结构来专门记录考查过的节点。显然,对于树式搜索来说,CLOSED表中存储的正是一棵不断成长的搜索树
9、;而对于线式搜索来说,CLOSED表中存储的是一条不断伸长的折线,它可能本身就是所求的路径(如果能找到目标节点的话)。另一方面,对于树式搜索来说,还得不断地把待考查的节点组织在一起,并做某种排列,以便控制搜索的方向和顺序。为此,我们采用一个称为OPEN表的动态数据结构,来专门登记当前待考查的节点。13谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-4 OPEN表与CLOSED表示例 14谢谢观赏2019-8-26第 3 章 图搜索与问题求解 树式搜索算法:树式搜索算法:步1 把初始节点So放入OPEN表中。步2 若OPEN表为空,则搜索失败,退出。步3 移出OPEN表中第一个节
10、点N放入CLOSED表中,并冠以顺序编号n。步4 若目标节点Sg=N,则搜索成功,结束。步5 若N不可扩展,则转步2。15谢谢观赏2019-8-26第 3 章 图搜索与问题求解 步6扩展N,生成一组子节点,对这组子节点做如下处理:(1)删除N的先辈节点(如果有的话)。(2)对已存在于OPEN表的节点(如果有的话)也删除之;但删除之前要比较其返回初始节点的新路径与原路径,如果新路径“短”,则修改这些节点在OPEN表中的原返回指针,使其沿新路返回(如图3-5所示)。(3)对已存在于CLOSED表的节点(如果有的话),做与(2)同样的处理,并且再将其移出CLOSED表,放入OPEN表重新扩展(为了重
11、新计算代价)。(4)对其余子节点配上指向N的返回指针后放入OPEN表中某处,或对OPEN表进行重新排序,转步2。16谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-5 修改返回指针示例 17谢谢观赏2019-8-26第 3 章 图搜索与问题求解 说明:(1)这里的返回指针也就是父节点在CLOSED表中的编号。(2)步6中修改返回指针的原因是,因为这些节点又被第二次生成,所以它们返回初始节点的路径已有两条,但这两条路径的“长度”可能不同。那么,当新路短时自然要走新路。(3)这里对路径的长短是按路径上的节点数来衡量的,后面我们将会看到路径的长短也可以其“代价”(如距离、费用、时间等
12、)衡量。若按其代价衡量,则在需修改返回指针的同时还要修改相应的代价值,或者不修改返回指针也要修改代价值(为了实现代价小者优先扩展)。18谢谢观赏2019-8-26第 3 章 图搜索与问题求解 线式搜索算法:不回溯的线式搜索不回溯的线式搜索 步1 把初始节点So放入CLOSED表中。步2 令NSo。步3 若N是目标节点,则搜索成功,结束。步4 若N不可扩展,则搜索失败,退出。步5 扩展N,选取其一个未在CLOSED表中出现过的子节点N1放入CLOSED表中,令NN1,转步3。19谢谢观赏2019-8-26第 3 章 图搜索与问题求解 可回溯的线式搜索步1 把初始节点So放入CLOSED表中。步2
13、令NSo。步3若N是目标节点,则搜索成功,结束。步4 若N不可扩展,则移出CLOSED表的末端节点Ne,若NeSo,则搜索失败,退出。否则,以CLOSED表新的末端节点Ne作为N,即令NNe,转步4。步5扩展N,选取其一个未在CLOSED表用出现过的子节点N1放入CLOSED表中,令NN1,转步3。20谢谢观赏2019-8-26第 3 章 图搜索与问题求解 需说明的是,上述算法仅是搜索目标节点的算法,当搜索成功后,如果需要路径,则还须由CLOSED表再找出路径。找路径的方法是:对于树式搜索,从CLOSED表中序号最大的节点起,根据返回指针追溯至初始节点So,所得的节点序列或边序列即为所找路径;
14、对于线式搜索,CLOSED表即是所找路径。21谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.1.3 3.1.3 穷举式搜索穷举式搜索1.1.广度优先搜索广度优先搜索广度优先搜索就是始终先在同一级节点中考查,只有当同一级节点考查完之后,才考查下一级节点。或者说,是以初始节点为根节点,向下逐级扩展搜索树。所以,广度优先策略的搜索树是自顶向下一层一层逐渐生成的。22谢谢观赏2019-8-26第 3 章 图搜索与问题求解 例例 3.3 用广度优先搜索策略解八数码难题。由于把一个与空格相邻的数码移入空格,等价于把空格向数码方向移动一位。所以,该题中给出的数码走步规则也可以简化为:对空格可施
15、行左移、移、上移和下移等四种操作。设初始节点So和目标节点Sg分别如图3-3的初始棋局和目标棋局所示,我们用广度优先搜索策略,则可得到如图3-6所示的搜索树。23谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-6 八数码问题的广度优先搜索24谢谢观赏2019-8-26第 3 章 图搜索与问题求解 广度优先搜索算法:步1 把初始节点So放入OPEN表中。步2 若OPEN表为空,则搜索失败,退出。步3 取OPEN表中前面第一个节点N放在CLOSED表中,并冠以顺序编号n。步4 若目标节点Sg=N,则搜索成功,结束。步5 若N不可扩展,则转步2。步6 扩展N,将其所有子节点配上指向N
16、的指针依次放入OPEN表尾部,转步2。25谢谢观赏2019-8-26第 3 章 图搜索与问题求解 其中OPEN表是一个队列,CLOSED表是一个顺序表,表中各节点按顺序编号,正被考察的节点在表中编号最大。如果问题有解,OPEN表中必出现目标节点Sg,那么,当搜索到目标节点Sg时,算法结束,然后根据返回指针在CLOSED表中往回追溯,直至初始节点,所得的路径即为问题的解。广度优先搜索亦称为宽度优先或横向搜索。这种策略是完备的,即如果问题的解存在,用它则一定能找到解,且找到的解还是最优解(即最短的路径)。这是广度优先搜索的优点。但它的缺点是搜索效率低。26谢谢观赏2019-8-26第 3 章 图搜
17、索与问题求解 2.2.深度优先搜索深度优先搜索深度优先搜索就是在搜索树的每一层始终先只扩展一个子节点,不断地向纵深前进,直到不能再前进(到达叶子节点或受到深度限制)时,才从当前节点返回到上一级节点,沿另一方向又继续前进。这种方法的搜索树是从树根开始一枝一枝逐渐形成的。27谢谢观赏2019-8-26第 3 章 图搜索与问题求解 深度优先搜索算法:步1 把初始节点So放入OPEN表中。步2 若OPEN表为空,则搜索失败,退出。步3 取OPEN表中前面第一个节点N放入CLOSED表中,并冠以顺序编号n。步4 若目标节点Sg=N,则搜索成功,结束。步5 若N不可扩展,则转步2。步6扩展N,将其所有子节
18、点配上指向N的返回指针依次放入OPEN表的首部,转步2。28谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-7 八数码问题的深度优先搜索 例例3.43.4对于八数码问题,应用深度优先搜索策略,可得如图3-7所示的搜索树。29谢谢观赏2019-8-26第 3 章 图搜索与问题求解 深度优先搜索亦称为纵向搜索。由于一个有解的问题树可能含有无穷分枝,深度优先搜索如果误入无穷分枝(即深度无限),则不可能找到目标节点。所以,深度优先搜索策略是不完备的。另外,应用此策略得到的解不一定是最佳解(最短路径)。30谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.有界深度优先搜索有界深
19、度优先搜索广度优先和深度优先是两种最基本的穷举搜索方法,在此基础上,根据需要再加上一定的限制条件,便可派生出许多特殊的搜索方法。例如有界深度优先搜索。有界深度优先搜索就是给出了搜索树深度限制,当从初始节点出发沿某一分枝扩展到一限定深度时,就不能再继续向下扩展,而只能改变方向继续搜索。节点x的深度(即其位于搜索树的层数)通常用d(x)表示,则有界深度优先搜索算法如下:31谢谢观赏2019-8-26第 3 章 图搜索与问题求解 步1 把So放入OPEN表中,置So的深度d(So)=0。步2 若OPEN表为空,则失败,退出。步3 取OPEN表中前面第一个节点N,放入CLOSED表中,并冠以顺序编号n
20、。步4 若目标节点Sg=N,则成功,结束。步5 若N的深度d(N)=dm(深度限制值),或者若N无子节点,则转步2。步6 扩展N,将其所有子节点Ni配上指向N的返回指针后依次放入OPEN表中前部,置d(Ni)=d(N)+1,转步2。32谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.1.4 3.1.4 启发式搜索启发式搜索1.1.问题的提出问题的提出从理论上讲,似乎可以解决任何状态空间的搜索问题,但实践表明,穷举搜索只能解决一些状态空间很小的简单问题,而对于那些大状态空间问题,穷举搜索就不能胜任了。因为大空间问题往往会导致“组合爆炸”。例如梵塔问题,当阶数较小(如小于6)时,在计算
21、机上求解并不难,但当阶数再增加时,其时空要求将会急剧地增加。33谢谢观赏2019-8-26第 3 章 图搜索与问题求解 例如当取64时,则其状态空间中就有364=0.94*10个节点,最短的路径长度(节点数)=264-121019,这是现有的任何计算机都存放不下,也计算不了的。又如博弈问题,计算机为了取胜,它可以将所有算法都试一下,然后选择最佳走步。找到这样算法并不难,但计算时的时空消耗却大得惊人。例如:就可能有的棋局数讲,一字棋是9!3.6105,西洋棋是1078,国际象棋是10120,围棋是10761。假设每步可以选择一种棋局,用极限并行速度(10-104秒/步)计算,国际象棋的算法也得1
22、016年,即1亿亿年才可以算完。34谢谢观赏2019-8-26第 3 章 图搜索与问题求解 2.2.启发性信息启发性信息启发式搜索就是利用启发性信息进行制导的搜索。启发性信息就是有利于尽快找到问题之解的信息。按其用途划分,启发性信息一般可分为以下三类:(1)用于扩展节点的选择,即用于决定应先扩展哪一个节点,以免盲目扩展。(2)用于生成节点的选择,即用于决定应生成哪些后续节点,以免盲目地生成过多无用节点。(3)用于删除节点的选择,即用于决定应删除哪些无用节点,以免造成进一步的时空浪费。35谢谢观赏2019-8-26第 3 章 图搜索与问题求解 例如,由八数码问题的部分状态图可以看出,从初始节点开
23、始,在通向目标节点的路径上,各节点的数码格局同目标节点相比较,其数码不同的位置个数在逐渐减少,最后为零。所以,这个数码不同的位置个数便是标志一个节点到目标节点距离远近的一个启发性信息,利用这个信息就可以指导搜索。可以看出,这种启发性信息属于上面的第一种类型。需指出的是,不存在能适合所有问题的万能启发性信息,或者说,不同的问题有不同的启发性信息。36谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.启发函数启发函数在启发式搜索中,通常用所谓启发函数来表示启发性信息。启发函数是用来估计搜索树上节点x与目标节点Sg接近程度的一种函数,通常记为h(x)。如何定义一个启发函数呢?启发函数并无固
24、定的模式,需要具体问题具体分析。通常可以参考的思路有:一个节点到目标节点的某种距离或差异的度量;一个节点处在最佳路径上的概率;或者根据经验的主观打分,等等。例如,对于八数码难题,用h(x)就可表示节点x的数码格局同目标节点相比数码不同的位置个数。37谢谢观赏2019-8-26第 3 章 图搜索与问题求解 4.启发式搜索算法启发式搜索算法1)全局择优搜索全局择优搜索就是利用启发函数制导的一种启发式搜索方法。该方法亦称为最好优先搜索法,它的基本思想是:在OPEN表中保留所有已生成而未考察的节点,并用启发函数h(x)对它们全部进行估价,从中选出最优节点进行扩展,而不管这个节点出现在搜索树的什么地方。
25、38谢谢观赏2019-8-26第 3 章 图搜索与问题求解 全局择优搜索算法如下:步1 把初始节点So放入OPEN表中,计算h(So)。步2 若OPEN表为空,则搜索失败,退出。步3 移出OPEN表中第一个节点N放入CLOSED表中,并冠以序号n。步4 若目标节点Sg=N,则搜索成功,结束。步5 若N不可扩展,则转步2。步6 扩展N,计算每个子节点x的函数值h(x),并将所有子节点配以指向N的返回指针后放入OPEN表中,再对OPEN表中的所有子节点按其函数值大小以升序排序,转步2。39谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-8 八数码问题的全局择优搜索 40谢谢观赏20
26、19-8-26第 3 章 图搜索与问题求解 例例 3.5 用全局择优搜索法解八数码难题。初始棋局和目标棋局同例3。解解设启发函数h(x)为节点x的格局与目标格局相比数码不同的位置个数。以这个函数制导的搜索树如图3-8所示。图中节点旁的数字就是该节点的估价值。由图可见此八数问题的解为:So,S1,S2,S3,Sg。41谢谢观赏2019-8-26第 3 章 图搜索与问题求解 2)局部择优搜索局部择优搜索与全局择优搜索的区别是,扩展节点N后仅对N的子节点按启发函数值大小以升序排序,再将它们依次放入OPEN表的首部。故算法从略。42谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.1.5 加
27、权状态图搜索加权状态图搜索1.加权状态图与代价树加权状态图与代价树例例 3.6 图3-9(a)是一个交通图,设A城是出发地,E城是目的地,边上的数字代表两城之间的交通费。试求从A到E最小费用的旅行路线。43谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-9 交通图及其代价树 44谢谢观赏2019-8-26第 3 章 图搜索与问题求解 可以看出,这个图与前面的状态图不同的地方是边上附有数值。它表示边的一种度量(此例中是交通费,当然也可以是距离)。一般地,称这种数值为权值,而把边上附有数值的状态图称之为加权状态图图或赋权状态图赋权状态图。显然,加权状态图的搜索与权值有关,并且要用权
28、值来导航。具体来讲,加权状态图的搜索算法,要在一般状态图搜索算法基础上再增加权值的计算与传播过程,并且要由权值来确定节点的扩展顺序。45谢谢观赏2019-8-26第 3 章 图搜索与问题求解 同样,为简单起见,我们先考虑树型的加权状态图代价树的搜索。所谓代价,可以是两点之间的距离、交通费用或所需时间等等。通常用g(x)表示从初始节点So到节点x的代价,用c(xi,xj)表示父节点xi到子节点xj的代价,即边(xi,xj)的代价。从而有 g(xj)g(xi)c(xi,xj)而 g(So)0 46谢谢观赏2019-8-26第 3 章 图搜索与问题求解 2.分支界限法分支界限法(最小代价优先法最小代
29、价优先法)其基本思想是:每次从OPEN表中选出g(x)值最小的节点进行考察,而不管这个节点在搜索树的什么位置上。可以看出,这种搜索法与前面的最好优先法(即全局择优法)的区别仅是选取扩展节点的标准不同,一个是代价值g(x)(最小),一个是启发函数值h(x)(最小)。这就是说,把最好优先法算法中的h(x)换成g(x)即得分支界限法的算法。所以,从算法角度考虑,这两种搜索法实际是一样的。但二者在计算节点的代价值与启发函数值的方法是有差别的。47谢谢观赏2019-8-26第 3 章 图搜索与问题求解 事实上,一个节点x的代价值g(x)是从初始节点So方向计算而来的,其计算方法为 g(So)0g(xj)
30、g(xi)c(xi,xj)(xj是xi的子节点)而启发函数值h(x)则是朝目标节点方向计算的;g(x)与x的父节点代价有关,与子节点代价无关,而h(x)与x的父、子节点的启发值均无关。48谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.最近择优法最近择优法(瞎子爬山法瞎子爬山法)同上面的情形一样,这种方法实际同局部择优法类似,区别也仅是选取扩展节点的标准不同,一个是代价值g(x)(最小),一个是启发函数值h(x)(最小)。这就是说,把局部择优法算法中的h(x)换成g(x)就可得最近择优法的算法。现在我们用代价树搜索求解例3.6中给出的问题。我们用分支界限法得到的路径为ACDE这是一
31、条最小费用路径(费用为8)。49谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.1.6 A算法和算法和A*算法算法1.估价函数估价函数利用启发函数h(x)制导的启发式搜索,实际是一种深度优先的搜索策略。虽然它是很高效的,但也可能误入歧途。所以,为了更稳妥一些,人们把启发函数扩充为估价函数。估价函数的一般形式为 f(x)g(x)h(x)其中g(x)为从初始节点So到节点x已经付出的代价,h(x)是启发函数。即估价函数f(x)是从初始节点So到达节点x处已付出的代价与节点x到达目标节点Sg的接近程度估计值之总和。50谢谢观赏2019-8-26第 3 章 图搜索与问题求解 有时估价函数还
32、可以表示为 f(x)d(x)h(x)其中d(x)表示节点x的深度。可以看出,(x)中的g(x)或d(x)有利于搜索的横向发展(因为g(x)或d(x)越小,则说明节点x越靠近初始节点So),因而可提高搜索的完备性,但影响搜索效率;h(x)则有利于搜索的纵向发展(因为h(x)越小,则说明节点x越接近目标节点Sg),因而可提高搜索的效率,但影响完备性。所以,f(x)恰好是二者的一个折中。但在确定f(x)时,要权衡利弊,使g(x)(或d(x)与h(x)的比重适当。这样,才能取得理想的效果。例如,我们只关心到达目标节点的路径,并希望有较高的搜索效率,则g(x)可以忽略。当然,这样会影响搜索的完备性。51
33、谢谢观赏2019-8-26第 3 章 图搜索与问题求解 2.2.A A算法算法 A算法是基于估价函数f(x)的一种加权状态图启发式搜索算法。其具体步骤如下:步1 把附有f(So)的初始节点So放入OPEN表。步2 若OPEN表为空,则搜索失败,退出。步3 移出OPEN表中第一个节点N放入CLOSED表中,并冠以顺序编号n。步4 若目标节点Sg=N,则搜索成功,结束。步5 若N不可扩展,则转步2。52谢谢观赏2019-8-26第 3 章 图搜索与问题求解 步6 扩展N,生成一组附有f(x)的子节点,对这组子节点做如下处理:(1)考察是否有已在OPEN表或CLOSED表中存在的节点;若有则再考察其
34、中有无N的先辈节点,若有则删除之;对于其余节点,也删除之,但由于它们又被第二次生成,因而需考虑是否修改已经存在于OPEN表或CLOSED表中的这些节点及其后裔的返回指针和f(x)值,修改原则是“抄f(x)值小的路走”。(2)对其余子节点配上指向N的返回指针后放入OPEN表中,并对OPEN表按f(x)值以升序排序,转步2。53谢谢观赏2019-8-26第 3 章 图搜索与问题求解 算法中节点x的估价函数f(x)的计算方法是 f(xj)g(xj)h(xj)g(xi)c(xi,xj)h(xj)(xj是xi的子节点)至于h(x)的计算公式则需由具体问题而定。可以看出,A算法其实就是对于本节开始给出的图
35、搜索一般算法中的树式搜索算法,再增加了估价函数f(x)的一种启发式搜索算法。54谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.3.A A*算法算法 如果对上述A算法再限制其估价函数中的启发函数h(x)满足:对所有的节点x均有 h(x)h*(x)其中h*(x)是从节点x到目标节点的最小代价,即最佳路径上的实际代价(若有多个目标节点则为其中最小的一个),则它就称为A*算法。55谢谢观赏2019-8-26第 3 章 图搜索与问题求解 A*算法中,限制h(x)h*(x)的原因是为了保证取得最优解。理论分析证明,如果问题存在最优解,则这样的限制就可保证能找到最优解。虽然,这个限制可能产生无
36、用搜索。实际上,不难想像,当某一节点x的h(x)h*(x),则该节点就可能失去优先扩展的机会,因而导致得不到最优解。A*算法也称为最佳图搜索算法。它是著名的人工智能学者Nilsson提出的。56谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.1.7 状态图搜索策略小结状态图搜索策略小结 57谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.2 状态图搜索问题求解状态图搜索问题求解 3.2.1 3.2.1 问题的状态图表示问题的状态图表示1.1.状态状态状态就是问题在任一确定时刻的状况,它表征了问题特征和结构等。状态在状态图中表示为节点。状态一般用一组数据表示。在程序中用字
37、符、数字、记录、数组、结构、对象等表示。58谢谢观赏2019-8-26第 3 章 图搜索与问题求解 2.2.状态转换规则状态转换规则状态转换规则就是能使问题状态改变的某种操作、规则、行为、变换、关系、函数、算子、过程等等。状态转换规则也称为操作,问题的状态也只能经定义在其上的这种操作而改变。状态转换规则在状态图中表示为边。在程序中状态转换规则可用数据对、条件语句、规则、函数、过程等表示。59谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.3.状态图表示状态图表示一个问题的状态图是一个三元组(S,F,G)其中S是问题的初始状态集合,F是问题的状态转换规则集合,G是问题的目标状态集合。
38、一个问题的全体状态及其关系就构成一个空间,称为状态空间。所以,状态图也称为状态空间图。60谢谢观赏2019-8-26第 3 章 图搜索与问题求解 例例 3.73.7 迷宫问题的状态图表示。我们仍以例3.1中的迷宫为例。我们以每个格子作为一个状态,并用其标识符作为其表示。那么,两个标识符组成的序对就是一个状态转换规则。于是,该迷宫的状态图表示为 S:SoF:(So,S4),(S4,So),(S4,S1),(S1,S4),(S1,S2),(S2,S1),(S2,S3),(S3,S2),(S4,S7),(S7,S4),(S4,S5),(S5,S4),(S5,S6),(S6,S5),(S5,S8),(
39、S8,S5),(S8,S9),(S9,S8),(S9,Sg)G:Sg 61谢谢观赏2019-8-26第 3 章 图搜索与问题求解 X1X2X3XX0X4X7X6X5例例 3.83.8八数码难题的状态图表示。我们将棋局 用向量 A(X0,X1,X2,X3,X4,X5,X6,X7,X8)表示,Xi为变量,Xi的值就是方格Xi内的数字。于是,向量A就是该问题的状态表达式。62谢谢观赏2019-8-26第 3 章 图搜索与问题求解 设初始状态和目标状态分别为 So(0,2,8,3,4,5,6,7,1)Sg(0,1,2,3,4,5,6,7,8)易见,数码的移动规则就是该问题的状态变换规则,即操作。经分析
40、,该问题共有24条移码规则,可分为9组。63谢谢观赏2019-8-26第 3 章 图搜索与问题求解 0组规则:;0)()0(;0)()0(;0)()0(;0)()0(80804606034040220201XnXnXXrXnXnXXrXnXnXXrXnXnXXr 1组规则:;0)()0(;0)()0(8181621215XnXnXXrXnXnXXr64谢谢观赏2019-8-26第 3 章 图搜索与问题求解 2组规则组规则:;0)()0(;0)()0(;0)()0(020293232812127XnXnXXrXnXnXXrXnXnXXr8组规则:;0)()0(;0)()0(;0)()0(7878
41、24080823181822XnXnXXrXnXnXXrXnXnXXr 于是,八数码问题的状态图可表示为(So,r1,r2,r24,Sg)65谢谢观赏2019-8-26第 3 章 图搜索与问题求解 当然,上述24条规则也可以简化为4条:即空格上移、下移、左移、右移。不过,这时状态(即棋局)就需要用矩阵来表示。可以看出,这个状态图中仅给出了初始节点和目标节点,并未给出其余节点。而其余节点需用状态转换规则来产生。类似于这样表示的状态图称为隐式状态图,或者说状态图的隐式表示。66谢谢观赏2019-8-26第 3 章 图搜索与问题求解 例例 3.93.9 梵塔问题。传说在印度的贝那勒斯的圣庙中,主神梵
42、天做了一个由64个大小不同的金盘组成的“梵塔”,并把它穿在一个宝石杆上。另外,旁边再插上两个宝石杆。然后,他要求僧侣们把穿在第一个宝石杆上的64个金盘全部搬到第三个宝石杆上。搬动金盘的规则是:一次只能搬一个;不允许将较大的盘子放在较小的盘子上。于是,梵天预言:一旦64个盘子都搬到了3号杆上,世界将在一声霹雳中毁灭。这就是梵塔问题。经计算,把64个盘子全部搬到3号杆上,需要穿插搬动盘子 264-118 446 744 073 709 511 615 次。所以直接考虑原问题,将过于复杂。67谢谢观赏2019-8-26第 3 章 图搜索与问题求解 设有三根宝石杆,在1号杆上穿有A、B两个金盘,A小于
43、B,A位于B的上面。要求把这两个金盘全部移到另一根杆上,而且规定每次只能移动一个盘子,任何时刻都不能使B位于A的上面。设用二元组(SA,SB)表示问题的状态,SA表示金盘A所在的杆号,SB表示金盘B所在的杆号,这样,全部可能的状态有9种,可表示如下:(1,1),(1,2),(1,3)(2,1),(2,2),(2,3)(3,1),(3,2),(3,3)如图3-10所示。68谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-10 二阶梵塔的全部状态 69谢谢观赏2019-8-26第 3 章 图搜索与问题求解 这里的状态转换规则就是金盘的搬动规则,分别用A(i,j)及B(i,j)表示:
44、A(i,j)表示把A盘从第i号杆移到第j号杆上;B(i,j)表示把B盘从第i号杆移到第j号杆上。经分析,共有12个操作,它们分别是:A(1,2),A(1,3),A(2,1),A(2,3),A(3,1),A(3,2)B(1,2),B(1,3),B(2,1),B(2,3),B(3,1),B(3,2)当然,规则的具体形式应是:IF条件THENA(i,j)IF条件THEN B(i,j)70谢谢观赏2019-8-26第 3 章 图搜索与问题求解 这样由题意,问题的初始状态为(1,1),目标状态为(3,3),则二阶梵塔问题可用状态图表示为(1,1),A(1,2),B(3,2),(3,3)由这9种可能的状态
45、和12种操作,二阶梵塔问题的状态空间图如图3-11所示。71谢谢观赏2019-8-26第 3 章 图搜索与问题求解 图 3-11 二阶梵塔状态空间图 72谢谢观赏2019-8-26第 3 章 图搜索与问题求解 例例3.10 3.10 旅行商问题(Traveling-Salesman Problem,TSP)。设有n个互相可直达的城市,某推销商准备从其中的A城出发,周游各城市一遍,最后又回到A城。要求为该推销商规划一条最短的旅行路线。该问题的状态为以A打头的已访问过的城市序列:A So:A。Sg:A,A。其中“”为其余n-1个城市的一个序列。73谢谢观赏2019-8-26第 3 章 图搜索与问题
46、求解 状态转换规则:规则规则1 1 如果当前城市的下一个城市还未去过,则去该城市,并把该城市名排在已去过的城市名序列后端。规则规则2 2 如果所有城市都去过一次,则从当前城市返回A城,把A也添在去过的城市名序列后端。74谢谢观赏2019-8-26第 3 章 图搜索与问题求解 3.2.2 状态图问题求解程序举例状态图问题求解程序举例 例3.11 下面是一个通用的状态图搜索程序。对于求解的具体问题,只需将其状态图的程序表示并入该程序即可。/*状态图搜索通用程序*/DOMAINS state=%例如:state=symbol DATABASE-mydatabase open(state,intege
47、r)%用动态数据库实现OPEN表 closed(integer,state,integer)%和CLOSED表 res(state)open1(state,integer)min(state,integer)mark(state)fail75谢谢观赏2019-8-26第 3 章 图搜索与问题求解 PREDICATES solve search(state,state)result searching step4(integer,state)step56(integer,state)equal(state,state)repeat resulting(integer)rule(state,sta
48、te)76谢谢观赏2019-8-26第 3 章 图搜索与问题求解 GOAL solve.CLAUSES solve:-search(,),result./*例如 solve:-search(st(0,1,2,3,4,5,6,7,8),st(0,2,8,3,4,5,6,7,1),result.*/search(Begin,End):-%搜索 retractall(_,mydatabase),assert(closed(0,Begin,0),assert(open(Begin,0),%步1 将初始节点放入OPEN表 assert(mark(End),repeat,searching,!.77谢谢观
49、赏2019-8-26第 3 章 图搜索与问题求解 result:-%输出解 not(fail_),retract(closed(0,_,0),closed(M,_,_),resulting(M),!.result:-beep,write(sorry dont find a road!).searching:-open(State,Pointer),%步2 若OPEN表空,则失败,退出 retract(open(State,Pointer),%步3 取出OPEN表中第一个节点,给其 closed(No,_,_),No2=No+1,%编号 asserta(closed(No2,State,Poin
50、ter),%放入CLOSED表 !,step4(No2,State).searching:-assert(fail_).%步4 若当前节点为目标节点,则成功 78谢谢观赏2019-8-26第 3 章 图搜索与问题求解 step4(_,State):-mark(End),equal(State,End).%转步2step4(No,State):-step56(No,State),!,fail.step56(No,StateX):-%步5 若当前节点不可扩展,转步2 rule(StateX,StateY),%步6 扩展当前节点X得Y not(open(StateY,_),%考察Y是否已在OPEN表