800 likes | 1.07k Views
第四章 状态空间搜索. 用搜索法对问题求解 问题实例 状态空间搜索的结构 问题的状态空间表示法 状态空间搜索策略 与 / 或树的盲目搜索 基于递归的搜索. 4.1 用搜索法对问题求解. 一个问题可以形式化地定义为四个组成部分: 初始状态 可能行动的描述 目标测试 路径耗散. 问题的解就是从初始状态到目标状态的路径. 寻找解的过程就是搜索. 4.1 用搜索法对问题求解. 要成功地设计和实现搜索算法 : 问题求解器是否一定能找到一个解 ? 问题求解器是否能终止运行 , 或是否会陷入一个死循环 ?
E N D
第四章 状态空间搜索 • 用搜索法对问题求解 • 问题实例 • 状态空间搜索的结构 • 问题的状态空间表示法 • 状态空间搜索策略 • 与/或树的盲目搜索 • 基于递归的搜索
4.1 用搜索法对问题求解 • 一个问题可以形式化地定义为四个组成部分: 初始状态 可能行动的描述 目标测试 路径耗散 • 问题的解就是从初始状态到目标状态的路径 • 寻找解的过程就是搜索
4.1 用搜索法对问题求解 要成功地设计和实现搜索算法: • 问题求解器是否一定能找到一个解? • 问题求解器是否能终止运行, 或是否会陷入一个死循环? • 当问题求解器找到解时, 找到的是否是最好的解? • 搜索过程的时间与空间复杂性如何? • 怎样才能最有效地降低搜索的复杂性? • 怎样设计才能最有效地利用描述语言?
4.1 用搜索法对问题求解 • 状态空间的理论是我们用来回答这些疑问最主要的工具。 • 图由结点集和连接结点对的弧或边的集合组成。 结点:问题求解中的不同状态(棋局 / 推理结果) 弧:状态之间的转换(一步走棋 / 一条规则运用)
4.2 问题实例 • 二阶梵塔问题 设有三根钢针,它们的编号分别是1号、2号和3号。在初始情况下,1号钢针上穿有A、B两个金片,A比B小,A位于B的上面。要求把这两个金片全部移到另一根钢针上,而且规定每次只能移动一个金片,任何时刻都不能使大的位于小的上面。 解:全部可能的问题状态共有以下9种: S0=(1, 1) S1=(1, 2) S2=(1, 3) S3=(2, 1) S4=(2, 2) S5=(2, 3) S6=(3, 1) S7=(3, 2) S8=(3, 3)
初始状态S0和目标状态S4、S8如图所示 A B A B A B 1 2 3 1 2 3 1 2 3 S0=(1, 1) S4=(2, 2) S8=(3, 3) 二阶梵塔问题的初始状态和目标状态 问题的初始状态集合: 目标状态集合: S={S0} =(1, 1) G={S4, S5}={(2,2),(3,3)}
一个问题可以形式化地定义为四个组成部分: 初始状态 可能行动的描述 目标测试 路径耗散 A B A B A B 1 2 3 1 2 3 1 2 3 S0=(1, 1) S4=(2, 2) S8=(3, 3) 二阶梵塔问题的初始状态和目标状态 操作分别用A(i, j)和B(i, j)表示: 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)
A B A B A B 1 2 3 1 2 3 1 2 3 S0=(1, 1) S4=(2, 2) S8=(3, 3) (1,1) A(1,3) A(1,2) (2,1) (3,1) B(1,2) B(1,3) (2,3) (3,2) A(3,2) A(2,3) (3,3) (1,3) (1,2) (2,2) 从初始节点(1, 1)到目标节点(2, 2)及(3, 3)的任何一条路径都是问题的一个解。 最短的路径长度是?
2 猴子摘香蕉问题 解: 4元组 (w, x, y, z) 其中: w表示猴子的水平位置; x表示箱子的水平位置; y表示猴子是否在箱子上,当猴子在箱子上时,y取1,否则y取0; z表示猴子是否拿到香蕉,当拿到香蕉时z取1,否则z取0。 c b a
初始状态: S0: (a, b, 0, 0) S1: (b, b, 0, 0) S2: (c, c, 0, 0) S3: (c, c, 1, 0) c b a S4: (c, c, 1, 1) 目标状态 允许的操作为: Goto(u):猴子走到位置u,即 (w, x, 0, 0)→(u, x, 0, 0) Pushbox(v): 猴子推着箱子到水平位置v,即 (x, x, 0, 0)→(v, v, 0, 0) Climbbox: 猴子爬上箱子,即 (x, x, 0, 0)→(x, x, 1, 0) Grasp;猴子拿到香蕉,即 (c, c, 1, 0 )→(c, c, 1, 1)
c b a 猴子摘香蕉问题的解 (a,b,0,0) 初始状态 Goto(b) Goto(b) (b,b,0,0) Climbbox Pushbox(c) Pushbox(c) (c,c,0,0) (b ,b,1,0) Climbbox Pushbox(a) Pushbox(c) (c,c,1,0) (a,a,0,0) Pushbox(a) Grasp (c,c,1,1) 目标状态 猴子摘香蕉问题的状态空间图 解序列为: {Goto(b), Pushbox(c), Climbbox, Grasp}
1 2 3 4 5 6 7 8 3. 八数码问题
八数码问题 状态:状态描述了8个棋子中的每一个以及空位在棋盘的9个方格上的分布。 初始状态:任何状态都可以被指定为初始状态。注意要到达任何一个给定的目标,可能的初始状态中恰好只有一半可以作为开始。 后继函数:用来产生通过四个行动(把空位向Left,Right,Up或Down移动)能够达到的合法状态。 目标测试:用来检测状态是否能匹配所要求的目标格局。 路径耗散:每一步的耗散值为1,因此整个路径的耗散值为路径中的步数。
S0 1 2 8 3 1 4 7 6 5 2 3 4 5 2 8 3 1 4 7 6 5 2 3 1 8 4 7 6 5 2 8 3 1 4 7 6 5 2 8 3 1 6 4 7 5 6 7 8 9 10 11 12 13 8 3 2 1 4 7 6 5 2 8 3 7 1 4 6 5 2 3 1 8 4 7 6 5 2 3 1 8 4 7 6 5 2 8 1 4 3 7 6 5 2 8 3 1 4 5 7 6 2 8 3 1 6 4 7 5 2 8 3 1 6 4 7 5 14 15 16 17 18 19 20 21 8 3 2 1 4 7 6 5 2 8 3 7 1 4 6 5 1 2 3 8 4 7 6 5 2 3 4 1 8 7 6 5 2 8 1 4 3 7 6 5 2 8 3 1 4 5 7 6 2 8 3 6 4 1 7 5 2 8 3 1 6 7 5 4 22 23 24 25 26 27 8 3 2 1 4 7 6 5 8 1 3 2 4 7 6 5 2 8 3 7 4 6 1 5 2 8 3 7 1 4 6 5 1 2 3 8 4 7 6 5 1 2 3 7 8 4 6 5 Sg
4. 八皇后问题 状态:把8个皇后摆放在棋盘上的任何安排都是一个状态。 初始状态:棋盘上没有皇后。 后继状态:把一个皇后添加到棋盘上的任何空格。 目标测试:8个皇后都在棋盘上,并且互相攻击不到。
4.3 状态空间搜索的结构 • 图是结点及连接它们的边的集合。 • 如果图中每个结点都有一个或多个描述符(标记)使之与其他结点区别开来, 这样的图称为标记图。 • 有方向性的弧连接的图是有向图。 • 图中的弧也可以做上标记,用来给关系取名或表示权值。当一对结点间有多条弧相连时,这种方法可以使之区别。
E D 结点集={A, B, C, D, E} 弧集={(A,B), (A,D), (B,C), (C,B), (C,D), (D,A),(D,E), (E,C), (E,D)} 有向图 C A B
4.3 状态空间搜索的结构 • 有根图具有唯一一个称为根的结点,从根结点出发到图中任何结点都存在相应路径。 A B D C E I J F G H 有根树,一个家庭关系的例子
4.3 状态空间搜索的结构 用来描述结点之间关系:祖先、后裔、父母、子女、兄弟 E D C A B
4.4 问题的状态空间表示法 图的结点和弧分别表示问题求解过程中解题状态和解题步骤。 • 初始状态对应于实际问题的已知信息, 是图中的根结点。 • 目标就是实际问题的解。 • 状态空间搜索将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。
4.4 问题的状态空间表示法 [定义] 状态空间搜索 状态空间是一个四元组[N,A,S,GD]: N是图中状态结点集,代表问题求解过程中的各种状态。 A是结点间弧(或链)的集合,代表问题求解过程的各个步骤。 S是N的非空子集,包含问题的初始状态。 GD是N的非空子集,包含问题的目标状态。 GD中的状态可用两种方式中的任一种来描述: • 搜索中遇到了目标状态的可检测的性质; • 欲搜索的路径的性质。 图中从S中结点到GD中结点的路径称为求解路径。 搜索算法的任务是在问题空间里找到一条求解路径。它包含了一系列使问题得到解决的操作(算子)。
4.4 问题的状态空间表示法 例: 旅行推销员问题 假设一个推销员要到5个城市去访问,然后回家。问题是要找到一条最短的路径,使得推销员访问过每个城市后回到出发地。假定推销员在A城, 他最后要返回原地。 100 A B 75 125 125 75 50 100 125 E C 50 100 D
4.4 问题的状态空间表示法 100 A B 图 旅行推销员问题的一个例子 [A,D,C,B,E,A]: 75 125 125 75 50 100 125 E C 50 100 D 开销为450 目标要求的是有最小开销的完整回路。
4.4 问题的状态空间表示法 减少搜索的复杂性 • 多种可能解题路径的方法。 • 目标是开销最小的路径。 • 遍历搜索旅行推销员问题的复杂度为(N-1)!
4.4 问题的状态空间表示法 减少搜索的复杂性 • 有限分枝法 • 回路的开销作为界限,以检验以后的侯选路径。每次加入一条路径,如果发现扩展它的最好结果的开销比界限值大,就不在沿着这条路径的方向继续搜索。 • “最近邻居”法 • “按照去最近的、未到达的城市”规则构筑路径
4.4 问题的状态空间表示法 图 旅行推销员问题的一例 100 A B 75 300 125 75 50 100 125 E C 50 100 D
4.5 状态空间搜索策略 4.5.1 数据驱动和目标驱动的搜索 • 状态空间可以从两个方向进行搜索:从实际问题的给定数据向目标搜索或者从目标到数据进行搜索 • 数据驱动推理是运用问题给出的条件及规则或合法移动,产生新的条件,向目标靠近;目标驱动推理着眼于目标,寻找产生目标的规则,通过反向连续的规则和子目标进行反向推理直至找到问题给出的条件。 • 采用哪种方式取决于求解问题的结构。
4.5.1 数据驱动和目标驱动的搜索 • 目标驱动搜索可用于下列情况: ——问题的说明中给出了目标或假设, 或者很容易用公式来表示它们。 ——有大量的规则适用于问题的条件,因而可以推出许多结论和结果, 较早地选好目标可剪掉空间中许多分枝, 使目标驱动搜索的效率更高。 ——问题没有给出数据,必须在求解中获取。
4.5.1 数据驱动和目标驱动的搜索 • 数据驱动搜索可用于下列情况: ——问题的初始说明给出了全部或大部分数据。 ——存在大量可能的目标,但对实际问题的条件及给定的信息加以运用的方法很少 。 ——难以形成一个目标或假设。
4.5.2 图搜索的实现 “扩展”是指对该节点用某个可用操作进行作用,生成该节点的一组子节点 状态空间搜索的基本思想: • 先把问题的初始状态作为当前扩展节点对其进行扩展,生成一组子节点 • 然后检查问题的目标状态是否出现在这些子节点中。 • 若出现,则搜索成功,找到了问题的解;若没出现,则再按照某种搜索策略从已生成的子节点中选择一个节点作为当前扩展节点。 • 重复上述过程,直到目标状态出现在子节点中或者没有可供操作的节点为止。
4.5.2 图搜索的实现 • 应用回溯算法 A 1 10 B 2 D 8 C E 9 3 6 F goal G 7 J 5 4 H I 图一个假想状态空间的深度优先回溯搜索
4.5.2 图搜索的实现 定义一个回溯搜索的算法。设: • SL 为状态表,列出了当前路径上的状态。 • NSL 为新状态表, 包含了等待评估的结点,其后裔结点还未被扩展。 • DE 为不可解节点集。 • CS 为当前正在检测的状态,即当前状态。
4.5.2 图搜索的实现 function backtrack; begin SL:=[Start];NSL:=[Start]; DE=[ ];CS:=Start; % 初始化 while NSL≠[ ] % 还有未检查的状态 do begin if CS=目标(或符合目标的要求) then return(SL); % 成功,返回路径中状态的表 if CS 没有子状态(不包括DE、SL和NSL中已有的状态) then begin while((SL非空)and(CS=SL中第一个元素))
4.5.2 图搜索的实现 do begin 将CS加入DE;% 标明此状态不可解 从SL中删除第一个元素;% 回溯 从NSL中删去第一个元素; CS:=NSL中第一个元素; end; 将CS加入SL; end else begin 将CS子状态(不包括DE、SL、NSL中已有的)加入NSL; CS:=NSL中第一个元素; 将CS加入SL; end end return FAIL; % 整个空间搜索完 end.
A 1 10 B 2 D 8 C E 9 3 6 F goal G 7 J 5 4 H I 初值:SL=[A];NSL=[A];DE=[ ];CS=A; CS SL NSL DE A [A] [A] [ ] B [BA] [BCDA] [ ] E [EBA] [EFBCDA] [ ] H [HEBA] [HIEFBCDA] [ ] I [IEBA] [IEFBCDA] [H] F [FBA] [FBCDA] [EIH] J [JFBA] [JFBCDA] [EIH] C [CA] [CDA] [BFJEIH] G [GCA] [GCDA] [BFJEIH]
4.5.2 图搜索的实现 • 用未处理状态表(NSL)使算法能返回(回溯)到其中任一个状态。 • 有一张"坏"状态表(DE)避免算法重新搜索无解的路径。 • 有当前解题路径状态表(SL),当满足目标时可以将它〈作为结果〉返回。 • 为避免陷入死循环必须是显式地对新状态进行检查, 看它是否在三张表中。
Backtrack 是状态空间搜索的一个基本算法,后面所讲的图搜索算法,包括深度优先,广度优先,最好优先搜索,都有回溯中的思想。 • 基本思想是用表来保存搜索空间中状态轨迹的搜索算法。
当问题有解时,这个算法是否能够保证找到一个解当问题有解时,这个算法是否能够保证找到一个解 这个搜索策略是否能够找到最优解 找到一个解需要花费多长时间 在执行搜索的过程中需要多少内存 度量问题求解的性能 • 完备性 • 最优性 • 时间复杂度 • 空间复杂度
4.5.3 深度和广度优先搜索 深度优先的基本思想: 从初始节点S0开始,在其子节点中选择一个最新生成的节点进行考察,如果该子节点不是目标节点且可以扩展,则扩展该子节点,然后再在此子节点的子节点中选择一个最新生成的节点进行考察,依此向下搜索,直到某个子节点既不是目标节点,又不能继续扩展时,才选择其兄弟节点进行考察。 广度优先的基本思想: 从初始节点S0开始逐层向下扩展,在第n层节点还没有全部搜索完之前,不进入第n+1层节点的搜索。Open表中的节点总是按进入的先后排序,先进入的节点排在前面,后进入的节点排在后面。
4.5.3 深度和广度优先搜索 A 1 10 B 2 D 8 C E 9 3 6 F goal G 7 J 5 4 H I
4.5.3 深度和广度优先搜索 • 在深度优先搜索中,当查到某一个状态时,它所有的子状态以及子状态的后裔结点必须先于该状态的兄弟状态被查找。尽量往深处走,只有再也找不出其后裔时才考虑兄弟。 • 广度优先搜索是一层一层地搜索空间,仅当某一层的状态全部搜索完毕,它才转入下一层搜索。
4.5.3 深度和广度优先搜索 图 用于广度及深度优先搜索的例图 A B D C J E I F G H K L N O P Q R M U S T
4.5.3 深度和广度优先搜索 • 广度优先搜索 关于实现: 为了保存状态空间搜索的轨迹,用到了:open表和closed表 • open表:列出了已经产生出来但子状态未被查找的状态。 • closed表:记录了已检查过的状态。
广度优先搜索 procedure breadth_first_search lnitialize:open=[start];closed=[ ]; while open≠[ ] do begin 从open表中删除最左边的状态 X; if X 是目标,then 返回(success); 生成 X 所有的子状态; 将 X 放入 closed 表中; 从 X 的子状态中删除已经在open或closed表中的状态; 将其余子状态按生成的次序放入open表的右边。 end
A B D C J E I F G H K L N O P Q R M U S T 目标状态 • 1.open=[A]; closed=[ ]; • 2.open=[B,C,D]; closed=[A]; • 3.open=[C,D,E,F]; closed=[B,A] • 4.open=[D,E,F,G,H]; closed=[C,B,A] • 5.open=[E,F,G,H,I,J]; closed=[D,C,B,A] • 6.open=[F,G,H,I,J,K,L]; closed=[E,D,C,B,A] • 7.open=[G,H,I,J,K,L,M]; closed=[F,E,D,C,B,A] • 8.open=[H,I,J,K,L,M,N]; closed=[G,F,E,D,C,B,A] • 如此重复直到U或open=[ ]
广度优先搜索 深度 节点数 时间 内存 2 1100 0.11秒 IMB 4 111,100 11秒 106MB 6 107 19分钟 10GB 8 10931 小时1TB 10 1011 129天 101TB • 是完备的 • 所需的时间和内存: 指数级复杂度
4.5.3 深度和广度优先搜索 • 深度优先搜索 ——如果已知解题路径很长,深度优先搜索就不会在图中大量的“浅层”状态上浪费时间。 ——但深度优先搜索会在图的深处“迷失方向”,找不到目标的更短路径或陷入到一个不通往目标的无限长的路径中。 ——深度优先搜索耗费的空间量是路径长度值的线性函数。 ——深度优先搜索不是最优的,不是完备的。
4.5.4 有界深度优先搜索 • 无边界的搜索树问题可以通过对深度优先搜索提供一个预先设定的深度限制来解决。 • 一旦搜索路径进入某一层时,深度限制便强迫该路径上的搜索失败。 • 解决了无穷路径问题。 • 又是造成不完备的原因。 • 深度优先搜索可以看作是有界深度优先搜索的一种特殊情况。
例:八数码问题。在3×3的方格棋盘上,分别放置了表有数字1、2、3、4、5、6、7、8的八张牌,初始状态S0,目标状态Sg,如下图所示。可以使用的操作有:例:八数码问题。在3×3的方格棋盘上,分别放置了表有数字1、2、3、4、5、6、7、8的八张牌,初始状态S0,目标状态Sg,如下图所示。可以使用的操作有: 空格左移,空格上移,空格右移,空格下移 即只允许把位于空格左、上、右、下方的牌移入空格。 S0 Sg 1 2 3 8 4 7 6 5 • 8 3 1 4 7 6 5 • 广度优先搜索策略 • 深度优先搜索策略