与或树的盲目搜索和启发式搜索

来源:互联网 发布:南宁扶贫云数据平台 编辑:程序博客网 时间:2024/05/16 11:23
与或树的盲目搜索


与或树的一般搜索过程如下

(1)把原始问题作为初始节点S0,并把它作为当前节点
(2)应用分解或等价变换操作对当前节点进行扩展
(3)为每个子节点设置指向父节点的指针
(4)选择合适的子节点作为当前节点,反复执行第(2)步和第(3)步,在此期间需要多次调用可解标记过程或不可解标记过程,直到初始节点被标记为可解节点或不可解节点为止

上述搜索过程将形成一棵与或树,这种由搜索过程形成的与或树称为搜索树。当搜索成功时,经可解标记过程标识的由初始节点极其下属的可解节点构成的子树称为解树。

与或树搜索过程中的可解标记过程与不可解标记过程都是自下而上进行的,即由子节点的(不)可解性确定父节点、祖父节点的(不)可解性。

在与或树中,除端节点和终止节点外,一个节点的可解性完全是由其子节点来决定的。对与节点,只有其所有子节点都为可解时它才可解,只要有一个子节点不可解它就不可解;对于或节点,只要有一个子节点可解它就是可解的,仅当所有子节点都是不可解时它才为不可解。

可解标记过程:由可解子节点来确定其父节点、祖父节点为可解节点的过程
不可解标记过程:由不可解子节点来确定其父节点、祖父节点为不可解节点的过程

由于与或树搜索的目标是寻找解树,因此,如果搜索过程确定某个节点为可解节点,则其不可解的后裔节点就可以从搜索树中删去;同样,如果搜索过程能确定某个节点未不可解节点,则其后裔节点也可以从搜索树中删去。


与或树的广度优先搜索

与或树的广度优先搜索与状态空间的广度优先搜索类似,只是在搜索过程中需要多次调用可解标记过程或不可解标记过程,其搜索算法如下:
(1)把初始节点S0放入Open表中
(2)把Open表的第一个节点取出放入Closed表,并记该节点为n
(3)如果节点n可扩展,则做下列工作:
  • 扩展节点n,将其子节点放入Open表的尾部,并为每一个子节点设置指向父节点的指针
  • 考察这些子节点中是否有终止节点。若有,则标记这些终止节点为可解节点,并用可解标记过程对其父节点及其先辈节点中的可解节点进行标记。如果初始解节点S0能够被标记为可解节点,就得到了解树,搜索成功,退出搜索过程;若果不能确定S0为可解节点,则从Open表中删去具有可解先辈的节点
  • 转第(2)步
(4)如果节点n不可扩展,则做下列工作:
  • 标记节点n为不可解节点
  • 应用不可解标记过程对节点n的先辈中不可解的节点进行标记。如果初始解节点S0也被标记为不可解节点,则从Open表中删去具有不可解先辈的节点
  • 转第(2)步


与或树的深度优先搜索

与或树的深度优先搜索和与或树的宽度优先搜索过程基本相同,其主要区别在于Open表中节点的排列顺序不同。在扩展节点时,与或树的深度优先搜索过程总是把刚生成的节点放在Open表的首部
与或树的有限深度优先算法:
(1)把初始节点s0放入Open表中
(2)把Open表的第一个节点取出放入Closed表,并记该节点为n
(3)如果节点n的深度等于dm,则转第(5)步的第一点
(4)如果节点n可扩展,则做下列工作
  • 扩展节点n,将其子节点放入Open表的首部,并为每一个子节点设置指向父节点的指针
  • 考察这些子节点中是否有终止节点。若有,则标记这些终止节点为可解节点,并用可解标记过程对其父节点中的可解节点进行标记。如果初始节点S0能够被标记为可解节点,就得到了解树,搜索成功,退出搜索过程;如果不能确定S0为可解节点,则从Open表中删去具有可解先辈的节点
  • 转第(2)步
(5)如果节点n不可扩展,则做下列工作
  •    标记节点n为不可解节点
  • 应用不可解标记对节点n的先辈中不可解的节点进行标记。如果初始节点S0也被标记为不可解节点,则搜索失败,表明原始问题无解,退出搜索过程;如果不能确定为不可解节点,则从Open表中删去具有不可解先辈的节点
  • 转第(2)



与或树的启发式搜索

与或树的盲目搜索时按确定路线进行的,没有考虑要付出的代价,因而求得的解树不一定是代价最小的解树,即不一定是最优解树。因此,我们需要考虑与或树的启发式搜索。
与或树的启发式搜索过程是一种利用搜素过程所得到的启发性信息寻找最优解的过程
对搜索的每一步,算法都试图找到一个最有希望成为最优解的子树
最优解树是指代价最小的那棵解树

要寻找最优解树,首先需要计算解树的代价。在与或树的启发式搜索过程中,解树的代价可按如下规则计算:
(1)若n为终止节点,则其代价h(n)=0
(2)若n为或节点,且子节点为n1,n2,...,nk,则n的代价为h(n)=min{c(n.\,ni)+h(ni)}(1<=i<=k)其中,c(n,ni)是节点n到其子节点ni的边代价
(3)若n为与节点,且子节点为n1,n2,...nk,则n的代价可用和代价法或最大代价法
   若用和代价法,则其计算公式为    h(n)=求和((c(n,ni)+h(ni))  i=1,2,......k
   若用最大代价法,则其计算公式为  h(n)=max{c(n,ni)+h(ni)}  (1<=i<=k)
(4)若n是端节点,但又不是终止节点,则n不可扩展,其代价定义为h(n)=无穷大
(5)根节点的代价即为解树的代价

为了找到最优解树,搜索过程的任何时刻都应该选择那些最有希望成为最优解树一部分的节点进行扩展。由于这些节点及其父节点所构成的与或树最有可能成为最优解树的一部分,因此称它为希望解树,也简称为希望树。
搜索过程:
(1)把初始节点S0放入到Open表中,计算h(S0)
(2)计算希望树T
(3)依次在Open表中取出T的端点放入Closed表,并记该节点为n
(4)如果节点n为终止节点,则做下列工作
  • 标记节点n为可解节点
  • 在T上应用可解标记过程,对n的先辈节点中的所有可解节点进行标记
  • 如果初始节点S0能够标记为可解节点,则T就是最优解树,成功退出
  • 否则,从Open表中删去具有可解先辈的所有节点
  • 转第(2)步
(5)如果节点n不是终止节点,但可扩展,则做下列工作
  • 扩展节点n,生成n的所有子节点
  • 把这些子节点都放入Open表中,并为每一个子节点设置指向父节点n的指针
  • 计算这些子节点及其先辈节点的h值
  • 转第(2)步
(6)如果节点n不是终止节点,且不可扩展,则做下列工作
  • 标记节点n为不可解节点
  • 在T上应用不可解标记过程,对n的先辈节点中的所有不可解节点进行标记
  • 如果厨师节点S0能够被标记为不可解节点,则问题无解,失败退出
  • 否则,从Open表中删去具有不可解先辈的所有节点
  • 转第(2)步
原创粉丝点击