1、人工智能原理,(符号计算科学),Principles of Artificial Intelligence,第四章: 状态空间搜索,Chapter 04 Search in State Spaces,01 Three-S 的基本思想,Section 01 the Essentials of Three-S,01 Three-S 的基本思想,1.1 所谓状态空间搜索:机器的一种思维方式,模拟人的问题球解过程,模拟人的思维或逻辑推理,是人工智能,特别是符号计算学的重要任务。,人工智能的问题求解方法,是人的思维和逻辑推理的形式化,是机器或计算机的思维和逻辑推理。,状态空间搜索 (The Search
2、 in State Spaces, Three-S) 是一种问题求解策略,是一种模拟人的问题球解过程的人工智能方法,是机器的一种思维方式或逻辑推理方式。,01 Three-S 的基本思想,1.2 事物的特性变化的和运动的,事物有事物的特性。,事物既有内在特性又有外在特性,内在特性通常表现为事物固有的和本质的特征,而外在特性通常表现为事物与环境的关系。,事物的特性是在不断地变化的,或不断地运动的,因而,被称为动态特性。,事物特性的变化或运动必定是在一定的时间和空间中发生的。,01 Three-S 的基本思想,1.3 事物特性的可操作性事物特性问题性质,在问题求解活动中,事物的特性代表着问题的性质
3、,事物特性的变化意味着问题性质的变化。,在状态空间搜索策略中,事物的特性称为事物的状态,状态随时间变化或运动,而状态运动的空间,就是状态空间。,因此,状态空间中状态的运动,意味着事物特性的变化,意味着问题性质的变化。重要的是,这种运动是可以通过对事物进行操作来控制的。,01 Three-S 的基本思想,1.4 状态是问题的性质问题求解过程搜索过程,关于状态空间搜索 (Three-S):,状态 (State): 状态空间中的点,代表问题的性质;问题原态对应的状态称为初始状态,问题终态所对应的状态称为目标状态。,状态空间 (State Space):所有可能的状态的集合。,状态空间搜索 (Sear
4、ch in State Space): 在状态空间中搜寻一条由初始状态到目标状态的路径的过程,即问题求解的过程。,01 Three-S 的基本思想,1.4 状态是问题的性质问题求解过程搜索过程,关于状态空间搜索 (Three-S):,状态空间,过渡状态,操作: 改变问题状态的措施,问题的解: 一条由初始状态至目标 状态的路径。,问题求解的过程: 搜索由初始状态至目标 状态的路径的过程。,02 Three-S 问题的描述,Section 02 Representations of Problems in Three-S,02 Three-S 问题的描述,2.1 Three-S 问题的形式化定义:
5、,状态空间搜索中的问题被定义为一个四元组:,其中:,S,O,s(o),s(g) (4.1),(1) S =s:状态空间 (状态的集合) (2) O =O:算子空间 (操作的集合) (3) s(o)S:初始状态 (4) s(g)S:目标状态,应用 O 中的算子 (操作) 对 s(o) 进行操作 (运算),使其运动至目标状态 s(g) 的过程称为问题 (4.1) 的求解。,02 Three-S 问题的描述,2.2 Three-S 问题的三要素s(o)和 s(g)以及O,02 Three-S 问题的描述,2.3 Three-S 问题描述示例八数码问题:,02 Three-S 问题的描述,2.3 Th
6、ree-S 问题描述示例八数码问题:,02 Three-S 问题的描述,2.3 Three-S 问题描述示例八数码问题:,状态 (State),八数码问题状态空间 S 中可能的状态数:,9!,状态的编码或表达方法:,(1) 向量编码,s = (s1,s2,s3,s4,s5,s6,s7,s8,s9)S,初始状态:s(o) = (1,2,3,4,0,5,6,7,8),目标状态:s(g) = (0,1,2,4,5,3,6,7,8),02 Three-S 问题的描述,2.3 Three-S 问题描述示例八数码问题:,状态 (State),状态的编码或表达方法:,(2) 矩阵编码:,初始状态,目标状态,
7、02 Three-S 问题的描述,2.3 Three-S 问题描述示例八数码问题:,状态 (State),状态的编码或表达方法:,(3) 图或模式编码:,02 Three-S 问题的描述,2.3 Three-S 问题描述示例八数码问题:,操作 (或称算子,Operator),八数码问题中,数码运动等价于空格运动,操作可视为对空格的操作,故算子空间(操作集合)可定义为: O=Oleft,Oright,Oup,Odown 其中:(1) Oleft:空格左移(2) Oright:空格右移(3) Oup:空格上移(4) Odown:空格下移,02 Three-S 问题的描述,2.3 Three-S 问
8、题描述示例八数码问题:,操作 (或称算子,Operator),操作的可行性问题:,操作的可行性问题 ,也即操作的合法性问题。操作的可行性由问题的性质所决定,与问题的操作和操作的对象有关,即与问题的算子和状态有关。可行的操作称为合法操作,否则称为非法操作。,可行的操作称为合法操作。 不可行的操作称为非法操作。,02 Three-S 问题的描述,2.3 Three-S 问题描述示例八数码问题:,操作 (或称算子,Operator),操作的可行性问题:,合法操作示例,非法操作示例,02 Three-S 问题的描述,2.3 Three-S 问题描述示例八数码问题:,问题的解:一条 s(o) 至 s(g
9、) 的路径,初始 状态s(o),目标 状态s(g),问题的解 (即s(o) 至 s(g) 的路径) 也可以由算子(操作符)来描述:,2.4 练习与思考,02 Three-S 问题的描述,4-2 在状态空间中描述如下机器人与积木问题:,2.4 练习与思考,02 Three-S 问题的描述,a,b,c,初始状态,工作台B,工作台 A,机器人,积木 a b c,工作间,4-2 在状态空间中描述如下机器人与积木问题:,2.4 练习与思考,02 Three-S 问题的描述,a,b,c,目标状态,4-2 在状态空间中描述如下机器人与积木问题:,2.4 练习与思考,02 Three-S 问题的描述,在一工作
10、间 Workshop 里,有两个工作台 Table A 和 Table B,以及一个机器人 Robot;工作台 A 上有三块积木 Block A、Block B 和 Block C。,机器人可以在 Workshop 中行走,并可用双手拿起或放下积木块。,机器人的任务是:用 Block A 和 Block B 作为桥墩,用 Block C 作为跨梁,在 Table B 上搭建一座桥。,为了给 Robot 定位,将 Workshop 划分为若干方格,并记为 lij (i 1,2,3,4,5,6,7,8; j 1,2,3, 4,5,6, 7,8,9,A,B)。,4-2 在状态空间中描述如下机器人与积
11、木问题:,2.4 练习与思考,02 Three-S 问题的描述,机器人的手可能是空的,也可能握有积木,但每只手上最多只能有一块积木。,为了给积木定位,将工作台台面划分为若干方格,并记为 Art 和 Brt (r1,2,3; t1,2,3,4) 。,积木除水平位置外,还有立体位置,如在工作台上,或在其它积木上。,03 Three-S 的状态图,Section 03 State Graphs in Three-S,03 Three-S 的状态图,3.1 基本要素节点(node)与弧(arc),在状态空间法中,问题空间,也即状态空间,是由图论中的图来表达或描述的,称为状态图。,状态图是由节点和弧构成
12、的,即基本要素为:,03 Three-S 的状态图,3.2 基本概念起始节点和目标节点,03 Three-S 的状态图,3.2 基本概念起始节点和目标节点,03 Three-S 的状态图,3.2 基本概念起始节点和目标节点,祖先节点:1) n 的父节点是 n 的祖先节点;2) n 的祖先节点的父节点是 n 的祖先节点。,子孙节点:1) n 的子节点是 n 的子孙节点; 2) n 的子孙节点的子节点是 n 的子孙节点。,指针:状态图中的有向弧,在程序设计中,指针用于表示子节点指向父节点的路径。,03 Three-S 的状态图,3.3 状态树:简单而特殊的状态图State-Tree 定义:,树:无
13、环路和闭路的 图称为树,第零层,第一层,第二层,第三层,03 Three-S 的状态图,3.3 状态树:简单而特殊的状态图状态图状态树,一般地,通过添加节点,状态图能化为状态树,因此,我们只研究状态树所表达的状态空间。,03 Three-S 的状态图,3.3 状态树:简单而特殊的状态图八数码问题树,03 Three-S 的状态图,3.4 图搜索搜索的含义,在状态空间中,问题求解的过程就是图搜索过程。状态图的搜索过程,就是由状态图的起始节点开始,按一定搜索策略,选用合适的算子或操作,扩展或生长出新的节点或子节点,直到出现目标节点的过程。,搜索: 在状态图中寻找一条由起始节点通向目标节点的路径。,
14、搜索过程是状态树生长的过程,搜索过程是问题求解的过程,03 Three-S 的状态图,3.4 图搜索相关的概念,开节点(open node):未进行扩展操作的节点;,闭节点(closed node) :已进行扩展操作的节点;,扩展节点(expended node):已进行扩展操作,并生长出子结点的节点;,死节点(dead node):闭节点,但不是扩展节点;,叶节点(leaf node):无子节点或未生成子节点的节点。,03 Three-S 的状态图,3.4 图搜索搜索的策略和算法,在状态图中,寻找由起始节点通向目标节点的路径可以有各种不同的搜索策略。不同的策略以不同的方式控制着搜索的过程。因
15、此,搜索策略又称控制策略。,与问题相关的信息往往能帮助我们进行更为有效的搜索,当然,这取决于相关信息的质和量。依据控制策略利用与问题相关信息的情形来对图搜索算法进行分类,可将其分为:,盲目搜索算法 (Blink Search) (2) 启发式搜索算法 (Heauristic Search),03 Three-S 的状态图,3.4 图搜索搜索的策略和算法,(1) 盲目搜索算法 (Blind Search):控制策略无任何启发式信息可利用的图搜索算法。,(2) 启发式搜索算法 (Heauristic Search):控制算法利用启发式信息进行搜索的图搜索算法。,利用启发式信息进行搜索的目的在于:减
16、小问题的搜索空间 (2) 获得问题的某种最优解,03 Three-S 的状态图,3.4 图搜索搜索的费用,图搜索算法的费用大致可以分为: (1) 操作费用:应用操作的费用 (2) 控制费用:控制策略运行的费用,图搜索算法的总费用为操作费用与控制费用之和。,一般地,搜索的空间越大,应用的操作就越多,搜索算法的操作费用就越高;而控制策略越复杂,搜索算法的控制费用就越高。,03 Three-S 的状态图,3.4 图搜索搜索的费用,一般地,盲目搜索算法需要搜索的空间比较大,因而,其操作的费用较高;而启发式搜索算法的控制策略比较复杂,因而,其控制的费用较高。,一方面,启发式信息利用程度越高,问题的搜索空
17、间越小,操作的费用越低。另一方面,启发式信息利用程度越高,控制策略越复杂,控制的费用越高。,操作费用与控制费用的这种辨证关系对于我们设计或选择图搜索算法具有指导意义。,03 Three-S 的状态图,3.4 图搜索搜索的费用,04 宽度优先搜索策略,Section 04 Breadth-First Search Strategy,04 宽度优先搜索策略,4.1 宽度优先搜索 (depth-first search)基本特征,宽度优先搜索策略是一种盲目搜索策略。,所谓 “宽度优先”,即:状态树的生长或展开,首先沿状态树的宽度方向进行。,s11,s12,s21,s22,s23,s24,s31,s3
18、2,s33,s34,s35,s36,s37,s38,s41,s42,s43,s44,s45,s46,s47,s48,04 宽度优先搜索策略,4.2 记录搜索过程的表Open表和 Closed表,正如我们已经反复说明的,在状态空间法中,问题求解的过程是在状态图中搜寻一条由起始节点通向目标节点的路径的过程,这一过程伴随着状态树的生长过程。,因此,我们搜索算法应该能记录下状态树生长的过程,特别地,记录下由起始节点通向目标节点的路径,它代表了问题的解。,04 宽度优先搜索策略,4.2 记录搜索过程的表Open表和 Closed表,当然,记录下状态树的生长过程,也就记录下了由起始节点通向目标节点的路径。
19、,在宽度优先搜索算法中,记录状态树生长过程的是两个表:,(1) Open:用以存放状态树的开节点,(2) Closed:用以存放状态树的闭节点,04 宽度优先搜索策略,4.3 宽度优先搜索算法算法框图,开始,将 so 放入 Open,Open 空?,扩展节点 n 生成其不在 Open 和 Closed 中的子节点集 Sub_N,将 Sub_N 中的成员放入 Open 的末端并设置其通向 n 的指针,SgSub_N?,no,04 宽度优先搜索策略,4.3 宽度优先搜索算法算法步骤,将起始节点 so 放入 Open 表中;,若目标节点 sg 在 Sub_N 中,则成功退出;,将 Open 中的第一
20、个节点 n 送入 Closed;,扩展节点 n ,生成其不在 Open 和 Closed 中 (即不在图上) 的子节点集合 Sub_N;,将 Sub_N 中的成员放入 Open 的末端,并为每一个成员设置其通向 n 的指针;,若 Open 空,则失败退出;,转向 step2。,04 宽度优先搜索策略,4.4 示例:八数码问题问题陈述,要求利用宽度优先搜索算法求解该问题。,04 宽度优先搜索策略,4.4 示例:八数码问题搜索,04 宽度优先搜索策略,4.4 示例:八数码问题问题的解:,一条 s(o) 至 s(g) 的路径:,s12 = Oright(s(o),s23 = Oup(s21),s33
21、 = Oleft(s23),s(o) = s45 = Oleft(s33),04 宽度优先搜索策略,4.4 示例:八数码问题循环中的 Open 和 Closed,开始: Closed = Open = so,循环1: Closed = soOpen = s11,s12,s13,s14,循环2: Closed = so,s11Open = s12,s13,s14,s21,s22,循环3: Closed = so,s11,s12Open = s13,s14,s21,s22,s23,s24,04 宽度优先搜索策略,4.4 示例:八数码问题循环中的 Open 和 Closed,循环4: Closed
22、= so,s11,s12,s13Open = s14,s21,s22,s23,s24,s25,s26,循环5: Closed = so,s11,s12,s13,s14Open = s21,s22,s23,s24,s25,s26,s27,s28,循环6: Closed = so,s11,s12,s13,s14,s21Open = s22,s23,s24,s25,s26,s27,s28,s31,循环7: Closed = so,s11,s12,s13,s14,s21,s22Open = s23,s24,s25,s26,s27,s28,s31,s32,04 宽度优先搜索策略,4.4 示例:八数码问题
23、循环中的 Open 和 Closed,循环8: Closed = so,s11,s12,s13,s14,s21,s22,s23Open = s24,s25,s26,s27,s28,s31,s32,s33,循环9: Closed = so,s11,s12,s13,s14,s21,s22,s23,s24Open = s25,s26,s27,s28,s31,s32,s33,s34,循环10: Closed = so,s11,s12,s13,s14,s21,s22,s23,s24,s25Open = s26,s27,s28,s31,s32,s33,s34,s35,循环11: Closed = so,s
24、11,s12,s13,s14,s21,s22,s23,s24,s25,s26Open = s27,s28,s31,s32,s33,s34,s35,s36,04 宽度优先搜索策略,4.4 示例:八数码问题循环中的 Open 和 Closed,循环12: Closed = so,s11,s12,s13,s14,s21,s22,s23,s24,s25,s26,s27Open = s28,s31,s32,s33,s34,s35,s36,s37,循环13: Closed = so,s11,s12,s13,s14,s21,s22,s25,s26,s27,s28Open = s31,s32,s33,s34,
25、s35,s36,s37,s38,循环14: Closed = so,s11,s12,s13,s14,s21,s22,s26,s27,s28,s31Open = s32,s33,s34,s35,s36,s37,s38,s41,s42,循环15: Closed = so,s11,s12,s13,s14,s21,s22,s23,s28,s31,s32Open = s33,s34,s35,s36,s37,s38,s41,s42,s43,s44,04 宽度优先搜索策略,4.4 示例:八数码问题循环中的 Open 和 Closed,循环16: Closed = so,s11,s12,s13,s14,s21
26、,s22,s28,s31,s32,s33Open = s34,s35,s36,s37,s38,s41,s42,s43,s44,s45,s46,关于Breadth_First_Search算法的第二步 step2:,04 宽度优先搜索策略,4.5 算法注释关于失败退出,Open 空,意味着状态图中已不存在可扩展的节点,搜索已无法继续下去,而此时,目标节点 sg 还未生成,算法只能在未搜索到 sg 的情况下终止。,关于Breadth_First_Search算法的第三和第五步 step3 & step5:,04 宽度优先搜索策略,4.5 算法注释关于扩展顺序,step3 将Open中第一个节点送入
27、Closed,而 step5 将生成的子节点送入Open的末端,这意味着Open是一个队列,其中节点依先后次序进行扩展。 先生成的节点总是排在后生成的节点之前,因而将先被扩展,从而实现宽度优先搜索。,关于Breadth_First_Search算法的第四步 step4:,04 宽度优先搜索策略,4.5 算法注释关于图的简化,扩展节点时,生成不在 Open 和 Closed 中(即不在图上)的节点,意在简化状态图,减少不必要的重复的节点和树枝。但算法对扩展出的每一个子节点都需要测试,以判定其是否在图上出现过,从而增加了程序的复杂度和运行时间。 因此, step4 可叙述为:“扩展节点 n,生成其
28、全部子节点。” 以减少程序复杂性和运行时间。,关于Breadth_First_Search算法的第六步 step6:,04 宽度优先搜索策略,4.5 算法注释关于目标检测,当算法搜索到目标节点 sg 时,意味着算法已搜索到 so 至 sg 的路径,求得问题的解,搜索过程无须继续进行下去,算法成功终止。 许多版本的宽度优先搜索算法通过检验Open中是否存在目标节点sg来判断问题求解的任务是否已经完成。检验Open 意味着除检验Sub_N中的节点外,需要重复检验原本已经被检验过的Open中原有的节点,从而造成运算上的浪费。,关于Breadth_First_Search算法的第五和第六步 step5
29、 & tep6:,04 宽度优先搜索策略,4.5 算法注释关于树的完整性,为什么不在将Sub_N中的节点送入Open之前,检验sg是否在Sub_N中以确定是否需要终止搜索呢? 如果未将Sub_N中的节点存入Open前就终止搜索,Open和Closed所描述的状态树将部分缺失,从而影响算法对搜索结果或解的提取,影响Open和Closed以及算法形式上的完整性。,Open 的数据结构:,宽度优先搜索算法的优点:,队,宽度优先搜索算法能找到由起始节点至目标节点的最短路径,这是一条应用操作或算子数量最少的路径。实际上,宽度优先搜索算法是启发式索算法 A* 算法的特例。,当然,操作次数的最少,并不等价于
30、费用或代价最小,最短路径并不等价于最优解答。,04 宽度优先搜索策略,4.6 性能与特点Open数据结构及算法优点,04 宽度优先搜索策略,4.6 性能与特点算法缺点,宽度优先搜索算法的缺点:,任何图搜索算法都需要记忆单元,以便记忆或存储图搜索算法运行过程中的运行数据,其中,必须记忆的是起始节点 so 至目标节点 sg 的路径。,宽度优先算法中的记忆单元是 Open 和 Closed,用于记忆或存放算法运行过程中生成的状态图中的节点,以便算法成功终止时从 Open 和 Closed 中检索出 so 至 sg 的路径。,04 宽度优先搜索策略,4.6 性能与特点算法缺点,宽度优先搜索算法的缺点:
31、,对于宽度优先搜索算法,在目标节点 sg 生成之前,Open 中任意节点都可能需要扩展,而 Closed 中任意节点都具有成为 so 至 sg 路径上的节点的可能性。,因此,宽度优先搜索算法运行过程中生成的状态图必须完整地保存下来。,04 宽度优先搜索策略,4.6 性能与特点算法缺点,宽度优先搜索算法的缺点:,为了将搜索过程中生成的状态图完整地保存下来,状态图中的所有开节点都必须记忆在 Open 中,而所有的闭节点都必须记忆在 Closed 中。,于是,对于宽度优先算法,随着搜索深度的加深,搜索图上的节点数将成几何级数地增长,这意味着,对于大的问题,宽度优先搜索算法需要巨大的记忆体或存储空间。
32、,04 宽度优先搜索策略,4.7 练习与思考,05 深度优先搜索策略,Section 05 Depth-First Search Strategy,05 深度优先搜索策略,5.1 深度优先搜索 (depth-first search)基本特征,深度优先搜索策略也是一种盲目搜索策略。,所谓 “深度优先”,即:状态树的生长或展开,首先沿状态树的深度方向进行。,s11,s12,s21,s22,s31,s32,s41,s42,s33,s34,s43,s44,s23,s24,s35,s36,s45,s46,s37,s38,s47,s48,05 深度优先搜索策略,5.2 记录搜索过程的表Open表和 Cl
33、osed表,与宽度优先搜索算法一样,深度优先搜索算法也需要记录下状态树的生长过程,特别是,记录下了由起始节点通向目标节点的路径。,在深度优先搜索算法中,Open 和 Closed 的含义和作用与其在宽度优先搜索算法中一样,即:,(1) Open:用以存放状态树的开节点,(2) Closed:用以存放状态树的闭节点,05 深度优先搜索策略,5.3 深度优先搜索算法算法框图,开始,将 so 放入 Open,Open 空?,n 深度Dep?,yes,将 Sub_N 中的成员放入 Open 的前端并设置其通向 n 的指针,SgSub_N?,no,05 深度优先搜索策略,5.3 深度优先搜索算法算法步骤
34、,将起始节点 so 放入 Open 表中;,若目标节点 sg 在 Sub_N 中,则成功退出;,将 Open 中的第一个节点 n 送入 Closed;,扩展节点 n ,生成其不在 Open 和 Closed 中 (即不在图上) 的子节点集合 Sub_N;,将 Sub_N 中的成员放入 Open 的前端,并为每一个成员设置其通向 n 的指针;,若 Open 空,则失败退出;,转向 step2。,若节点 n 深度超过 Dep 则转向 step2;,关于Breadth_First_Search算法的第四步 step4:,05 深度优先搜索策略,5.3 深度优先搜索算法算法注释,深度优先搜索算法需要设
35、置深度界限 Dep,以防止搜索深度无限制加深。第四步意味着,若节点 n 深度超过深度界限值 Dep,则算法不再对其进行扩展。,关于Breadth_First_Search算法的第三和第六步 step3 & step6:,05 深度优先搜索策略,5.3 深度优先搜索算法算法注释,step3 将 Open 中第一个节点送入 Closed,而 step5 将生成的子节点送入 Open 的前端,这意味着 Open 是一个堆栈,节点后进先出。 因此,后进入 Open 的节点先进入 Closed,因而将先被扩展,从而实现深度优先搜索。,05 深度优先搜索策略,5.4 性能与特点Open数据结构及算法优点,
36、Open 的数据结构:,深度优先搜索算法的优点:,堆栈,在状态空间搜索中,问题的解是 s(o) 至 s(g) 的路径,因此,是搜索过程中必须记录下来的,而状态树的其它部分,在不影响解的记录时,可以不进行记录。,深度优先搜索算法可用很小的存储容量实现,其必须存储的节点可用一堆栈存放,堆栈的深度小于或等于搜索深度界限加一,即:Dep+1。,5.5 练习与思考,05 深度优先搜索策略,06 A*搜索算法,Section 06 A* Search Algorithm,06 A*搜索算法,6.1 A* 搜索一种启发式搜索,宽度优先搜索策略和深度优先搜索策略是盲目的搜索策略,因其 Open 中开节点的盲目
37、排序而被称无序搜索策略。,状态空间搜索算法的任务在于搜寻状态空间中的目标节点。自然地,状态空间中,不同的节点导向目标节点的可能性是不同的。,盲目的搜索策略或无序策略,没有任何先验信息可被用于 Open 中节点的排序,只能盲目地选择被扩展的节点,因而,在状态空间中盲目地搜索目标。,06 A*搜索算法,6.1 A* 搜索一种启发式搜索,任何问题都有与之相关的某些先验的信息,这些信息对于问题求解具有指导或启发的作用,因而被称之为启发式信息 (Heuristic Information)。,在问题求解过程中,人的智能行为很大程度上体现在人对启发式信息的利用方面。,启发式搜索 (Heuristic Se
38、arch) 策略 (一种有序搜索策略) 试图利用问题的启发式信息帮助计算机更有效地求解问题,以表现出更强的智能特性。,06 A*搜索算法,6.1 A* 搜索一种启发式搜索,利用启发式信息的实际意义在于: (1) 缩小问题的搜索空间; (2) 获得问题某种意义上的最优解。,A* 算法是一种启发式搜索算法,它利用包含问题启发式信息的评价函数对 Open 中的节点进行排序 (Node Ordering),使搜索方向朝着最有可能找到目标并产生最优解的方向。,值得注意的是,启发式信息来自具体的问题。因此, A* 算法评价函数的设计需特殊问题特殊对待。,06 A*搜索算法,6.2 记录搜索过程Open 和
39、 Closed,与盲目搜索一样,A* 算法也需要: (1) Open:用以存放状态树的开节点 (2) Closed:用以存放状态树的闭节点,作为状态空间法中的搜索策略,A* 算法求解问题的过程也是状态树生长的过程。因此,A* 算法需要记录下这棵树及其生长的过程。,然而, A* 算法中的 Open 具有与宽度优先搜索和深度优先搜索所不同的数据结构。Open 中的每一个节点都需要付带一个路径费用估计值。,06 A*搜索算法,6.3 估计搜索费用评价函数,搜索的费用计算,(1) 节点 ni 到 nj 的搜索费用:c(ni,nj) (0),(2) 节点 ni 到 nj 的最小费用:c*(ni,nj)
40、(0),(3) s(o) 到节点 n 的最佳路径的费用:g*(n) = c*(s(o),n),(4) 节点 n 到 s(g) 的最佳路径的费用:h*(n) = c*(n,s(g),(5) s(o) 经节点 n 到 s(g) 的最佳路径的搜索费用: f*(n) = g*(n) + h*(n),值得注意的是:如果nj是nj的子节点, 则c(ni,nj)就是njnj一次操作的费用。,06 A*搜索算法,6.3 估计搜索费用评价函数,起始节点 s(o) 经过节点 n 到目标节点 s(g) 的最佳路径,显然,s(o) 到 s(g) 最佳路径的费用:,c*(s(o),s(g) = f*(s(o) = h*
41、(s(o),或: c*(s(o),s(g) = f*(s(g) = g*(s(g),且: f*(s(o) = f*(s(g) f*(n),06 A*搜索算法,6.3 估计搜索费用评价函数,搜索的费用估计,一般地,最佳路径的费用在搜索过程中是无法确定的。,搜索过程中生成的状态树只是问题空间的一个局部,一般不具备足够的信息以计算最佳路径费用,因此,我们需要对最佳路径的费用进行估计。,06 A*搜索算法,6.3 估计搜索费用评价函数,搜索的费用估计,如果我们能够对起始节点 s(o) 经开节点 n 到目标节点 s(g) 的最佳路径的费用 f*(n) 进行估算,我们就有了评价经由节点 n 通向目标节点
42、s(g) 的可能性和最佳性的依据,从而合理地选择 Open 中的开节点进行扩展。,06 A*搜索算法,6.3 估计搜索费用评价函数,搜索的费用评价函数定义,f (n) 既是对 s(o) 经 n 到 s(g) 最佳路径费用的估计,又是对 n 处于最佳路径上的可能性的评价。,06 A*搜索算法,6.3 估计搜索费用评价函数,关于深度特性函数 g(n),节点序列表示路径,与 节点深度或搜索的深度,这里,节点序数 i 就是节点 ni 的深度,而 k 就是节点 n=nk 的深度。,06 A*搜索算法,6.3 估计搜索费用评价函数,关于深度特性函数 g(n),定义深度函数 d(n),满足:d(ni)=i。
43、,状态空间中每一条弧都代表了一次操作。因此,节点的深度也就是搜索算法由起始节点 s(o) 到 n 的所进行过的操作的次数。,可见,s(o) 至 n 的操作费用与节点 n 的深度 d(n) 相关。,06 A*搜索算法,6.3 估计搜索费用评价函数,关于深度特性函数 g(n),g(n) 是 g*(n) 的估计值,可定义为: g(n) = c(s(o),n) (g(n)g*(n),显然,g(n)是一个与深度相关联的函数。如果令 c(ni,ni+1)1,即每一次操作的费用为 1,则 g(n)=d(n),g(n) 的值就是节点 n 的深度值。,因此,我们称g(n)为深度特性函数。,我们无法像定义 g(n
44、) 那样定义 h(n),因为,我们无法像估计 g*(n) 那样估计 h*(n)。,唯一能帮助我们估计h*(n)的是问题的状态 n 所包含的启发式信息,这些信息依赖于具体的问题,用于定义 h(n)。因此,h(n) 又称启发式函数。,问:为什么不能象g(n)那样定义h(n)呢?,06 A*搜索算法,6.3 估计搜索费用评价函数,关于启发式函数 h(n),设计评价函数 f (n) 的目的在于评估 Open 中的开节点 n 处于 s(o)s(g) 的最佳路径的可能性,以确定是否应该对 n 进行扩展。,当我们评估开节点 n 时,s(o)n 的路径已经出现在状态图上,费用 g*(n)=c(s(o),n)
45、可以由已经生成的状态树计算,作为对 g*(n) 的估计。,06 A*搜索算法,6.3 估计搜索费用评价函数,关于启发式函数 h(n),然而,启发式函数 h(n) 不能由已经生成的状态树计算,因为开节点 n 的子节点还未生成,ns(g) 的路径还没有被搜索到,状态图上还没有出现路径 ns(g),我们无法计算 c(n,s(g)。,因此,对于启发式函数 h(n),我们只能依赖于问题的启发式信息,对其进行定义。,06 A*搜索算法,6.3 估计搜索费用评价函数,关于启发式函数 h(n),启发式函数 h(n) 的定义依赖于具体问题。,然而,无论对于什么问题,启发式函数 h(n) 必须满足:0 h(n)
46、h*(n),06 A*搜索算法,6.3 估计搜索费用评价函数,关于启发式函数 h(n),问:不等式 h(n) h*(n) 的含义是什么?为什么要求 h(n) h*(n)?,深度特性函数 g(n) 与启发式函数 h(n) 在 A* 算法中扮演着不同的角色,深度特性函数 g(n) 是 A* 算法已经耗费的操作费用;而启发式函数 h(n) 是 A* 算法继续搜索所需操作费用的一个估计。,深度特性函数 g(n) 将控制 A* 算法的搜索深度,使其不至于因 h(n) 的误导而陷得过深;而启发式函数 h(n) 将控制 A* 算法的搜索宽度,将搜索尽可能地导向目标,避免在宽度方向过度地展开。,06 A*搜索
47、算法,6.3 估计搜索费用评价函数,6.4 A*算法程序步骤程序 A,将起始节点 so 放入 Open 表,计算 f(so);,将 Open 中 f(n) 值最小的节点 n 记作:n*;,若 n* 是目标节点,则成功退出;,扩展 n*,生成其全部子节点,并将它们放入子节点集合 Sub_N;,若 Open 空,则失败退出;,06 A*搜索算法,6.4 A*算法程序步骤程序 A,对于 Sub_N 中的每一个子节点 Son,进行:,如果 Son 不在 Open 和 Closed 中,设置 Son 指向 n* 的指针;,如果 Son 已在 Open 或 Closed 中,且 g(new_Son)g(o
48、ld_Son),则从 Sub_N 中删除 Son;,计算 f(Son);,06 A*搜索算法,6.4 A*算法程序步骤程序 A,06 A*搜索算法,如果 Son 已在 Open 或 Closed 中,并且, g(new_Son)g(old_Son),则:,(1) 用 g(new_Son) 替代 g(old_Son);,(2) 将原指针改为指向 n*;,(3) 如果 Son 在 Closed 中,重新计算 Son 子孙节点的评价函数 f 值;,(4) 从 Sub_N 中删除 Son;,6.4 A*算法程序步骤程序 A,将 n* 移出 Open 并移入 Closed;将 Sub_N 的成员放入 O
49、pen;,转向 step2。,06 A*搜索算法,6.4 A*算法程序步骤程序 A 注释,06 A*搜索算法,Son 已在 Open 或 Closed 中,且 g(new_Son)g(old_Son),意味着 Son 在过去已经生成,并且其性能比现在好,即旧的 f 值比新的 f 值小。,因此,不必改变过去的搜索结构或状态图,只能去掉 Son。,为什么 g(new)g(old) 意味着 f(new)f(old),6.4 A*算法程序步骤程序 A 注释,06 A*搜索算法,Son 已在 Open 或 Closed 中,且 g(new)g(old),意味着 Son 在过去已经生成,但其性能不如现在好。因此,需要改变其指针和 f 值。,因此,第一: 将 old 的 f(old) 值换成 f(new);,