4_搜索策略

搜索的表示与求解

状态空间法

概述(就是产生式表示法)

  • (S,F,G)表示一个问题的状态空间(S为初始状态集合,F为操作的集合,G为目标状态的集合)
  • (S,F,G)可以使用状态空间图进行表示
  • 求解:要么依据(S,F,G)穷举,要么在状态空间图找通路

例子,二阶梵塔问题

设有三根钢针,它们的编号分别是1号、2号和3号。在初始情况下,1号钢针上穿有AB两个金片,AB小,A位于B的上面。要求把这两个金片全部移到另一根钢针上,而且规定每次只能移动一个金片,任何时刻都不能使大的位于小的上面。

image-20201024163054941

image-20201024163106294

例子,猴子摘香蕉问题

猴子摘香蕉问题。在讨论知识表示时,我们曾提到过这一问题,现在用状态空间法来解决这一问题。

image-20201024163158310

image-20201024163216366

image-20201024163225784

image-20201024163231959

问题规约法

概念

思想

不断地分解和变换问题,将之转化为一系列较简单的子问题,通过求解子问题求解原问题。

  • 分解:将一个问题分解为n个问题,若要解决原问题,这n个问题必须都得到解决
  • 等价变换:将一个问题转换为n个问题,若要解决原问题,解决n个问题之一就可以

图形表示

image-20201024163911272image-20201024163920154

求解

在构建的语义树中寻找可以推出原始问题的子树。

image-20201024164442362image-20201024164532803

例子:三阶梵塔问题

三阶梵塔问题。要求把1号钢针上的3个金片全部移到3号钢针上,如下图所示。

image-20201024164659035

image-20201024164716553

image-20201024164723670

额外附送状态空间图

image-20201024164803685

状态空间盲目搜索

盲目搜索概念

没有使用任何的启发式方式,盲目搜索

  • Open表:存放未扩展的节点
  • Closed表:存放已经扩展的节点
  • S0:表示问题的初始状态
  • Sg:表示问题的目标状态

搜索算法总过程

  • 把初始节点S0放入Open表,设g(s0)=0, 建立一个CLOSED表,置为空;
  • 检查Open表是否为空表,若为空,则问题无解,失败退出;
  • 把Open表的第˜一个节点取出放入Closed表,并记该节点为n;
  • 考察节点n是否为目标节点,若是则得到问题的解成功退出;
  • 若节点n不可扩展,则转第(2)步;
  • 下一步为扩展节点,依据不同的搜索策略进行扩展。

广度优先搜索

Breadth-first Search的第五步为:

  • 扩展节点n, 将其子节点放入Open表的部,并为每˜个子节点设置指向父节点的指针, 转向第(2)步。

Open表可以认为是队列结构,先进入的先扩展。

  • 完备的搜索策略,会得到路径最短的解
  • 所占用的空间较大,若b为每个节点可以扩展的新节点,m为搜索树的层数,那么open表将会需要O(bm)的空间。

深度优先搜索

Depth-frist Search的第五步为:

  • 扩展节点n, 将其子节点放入Open表的部,并为每˜个子节点设置指向父节点的指针, 转向第(2)步。

Open表可以认为是栈结构,先进入的后扩展。

  • 不完备的搜索策略,由于一个有解的问题树可能含有无穷分枝,深度优先搜索如果误入无穷分枝(即深度无限),则不可能找到目标节点。所以,深度优先搜索策略是不完备的。
  • 所占用的空间较小,若b为每个节点可以扩展的新节点,m为搜索树的层数,那么open表将会需要O(bm)的空间。

有界深度优先搜索方法

Iterative-deepening-depth-first_search

可以认为是广度优先搜索和深度优先搜索的结合体

可以扩展

代价一致算法

Uniform-cost/Cheapest-first search的第五步:

  • 扩展节点n, 生成子节点ni(i=1,2,……),将其子节点放入Open表,并为每个子节点设置指向父节点的指针,计算各个节点的代价g(ni),将Open表内的节点按g(ni)从小到大排序, 转向第(2)步。

Open表可以视为一个优先队列,将会先处理代价最小的未处理节点。

  • 较深度和广度搜索可以添加代价,广度搜索可以认为是每条边代价相同的代价一致算法

例子,代价一致搜索的扩展过程

image-20201025150605145

hint:同一优先级,按字母顺序进行扩展

迭代次数 Open表 扩展节点
0 (S,0)
1 (A,1), (D,5) S
2 (B,4), (D,5) A
3 (C,5), (D,5), (G,5) B
4 (D,5), (G,5), (G,6) C
5 (G,5), (G,6), (G,6) D
6 (G,6), (G,6) G得到结果

值得注意的算法的执行过程

状态空间启发式搜索

贪心算法

第五步如下:

  • 扩展节点n, 生成子节点ni(i=1,2,……),将其子节点放入Open表,并为每个子节点设置指向父节点的指针,依据启发式函数,将Open表内的节点按距离目标节点的距离从小到大排序, 转向第(2)步。

特点

  • 搜索速度明显加快,但是找到的解可能不是最优解,

A算法

第五步如下:

  • 扩展节点n, 生成子节点ni(i=1,2,……),将其子节点放入Open表,并为每个子节点设置指向父节点的指针,依据启发式函数,将Open表内的节点按估价函数(从当前节点到目标节点的最优路径的估计代价+当前节点的实际代价)从小到大排序, 转向第(2)步。

该算法可以认为是贪心算法与代价一致算法的结合体。

  • 启发函数一旦发生错误,将不会得到最优的解

A*算法

A*算法对A算法的估价函数提出要求:

  • 从当前节点到目标节点的最优路径的估计代价必须小于实际代价

  • 可纳性,如果存在初始节点到目标节点的路径,A*算法总可以在有限步骤内找到最优路径

  • 最优性,如果从当前节点到目标节点的最优路径的估计代价越接近真实代价,A*算法扩展节点数目越少(效率越高),且从当前节点到目标节点的最优路径的估计代价较低的A*算法扩展的节点一定包含较高A*算法扩展的节点。

  • 单调限制性,如果启发函数满足以下两个条件: h(Sg )=0&&对任意节点ni 及其任一子节点nj ,都有0≤h(ni )-h(nj )≤c(ni , nj ) 其中c(ni , nj )是ni 到其子节点nj 的边代价,则称h(n)满足单调限制。

没看懂其中的单调限制性的问题

A算法实例

image-20201025154759282
迭代次数 Open表 扩展节点
0 (S,0)
1 (B,2+1), (A,2+2) S
2 (A,2+2), (G,5+0) B
3 (G,4+0), (G,5+0) A
4 (G,5+0) G得到结果

估价函数为 f(n)=d(n)+W(n)

  • W(n)表示节点n不在位的数码个数。
  • d(n)表示节点n在搜索树中的深度
image-20201025155212912
image-20201025155325829
posted @ 2020-10-26 08:51  zqybegin  阅读(1711)  评论(0)    收藏  举报