第2222章用搜索求解问题的基本原理问题求解问题求解(Problem-solving)(Problem-solving)是是AIAI领域中的一领域中的一大课题大课题,,它涉及规约、推断、决策、规划、它涉及规约、推断、决策、规划、常识推理、定理证明等相关过程的核心概念常识推理、定理证明等相关过程的核心概念,,是人工智能中研究得较早而且比较成熟的一是人工智能中研究得较早而且比较成熟的一个领域。个领域。2.1问题与问题空间�AI早期的目的是想通过计算技术来求解这样一些问题:它们不存在现成的求解算法或求解方法非常复杂,而人使用其自身的智能都能较好地求解。为模拟这些问题的求解过程而发展的一种技术叫搜索。把问题求解定义为状态空间的搜索�在分析和研究了人运用智能求解的方法之后,人们发现许多问题的求解方法都是通过试探在某个可能的解空间内寻找一个解来求解问题,这种基于解答空间的问题表示和求解方法就是状态空间法。许多涉及智力的问题求解可看成状态空间的搜索。状态和状态空间�状态(state)是为描述某些不同事物间的差别而引入的一组最少变量q0,q1,q2…,qn的有序集合,并表示为:�Q=(q0,q1,…,qn)�其中,每个元素qⅰ称为状态变量。给定每个分量的一组值,就得到一个具体的状态。状态和状态空间�使问题从一种状态变化为另一种状态的手段称为操作符或算子(operator)。�操作符可能是走步(下棋)、过程、规则、数学算子、运算符号或逻辑运算符等。�问题的状态空间(statespace)是一个表示该问题全部可能状态及其关系的集合。状态和状态空间�它包含三种类型的集合,即该问题所有可能的��初始状态集合初始状态集合SS,,��操作符集合操作符集合FF��目标状态集合目标状态集合GG。。�因此,可把状态空间记为三元组(S,F,G)。问题状态空间法的基本思想是:�(1)将问题中的已知条件看成状态空间中初始状态;将问题中要求的目标看成状态空间中目标状态;将问题中其它可能的情况看成状态空间的任一状态。�(2)设法在状态空间寻找一条路径,由初始状态出发,能够沿着这条路径达到目标状态。问题状态空间法的基本算法:(1)根据问题,定义出相应的状态空间,确定出状态的一般表示,它含有相关对象的各种可能的排列。这里仅仅是定义这个空间的状态,而不必枚举该状态空间的所有状态,但由此可以得出问题的初始状态、目标状态,并能够表示出所有其它状态。问题状态空间法的基本算法:(2)规定一组操作(算子),能够使状态从一个状态变为另一个状态。(3)决定一种搜索策略,使得能够从初始状态出发,沿某个路径达到目标状态。水壶问题�给定两个水壶,一个可装4加仑水,一个能装3加仑水。水壶上没有任何度量标记。有一水泵可用来往壶中装水。�问:怎样在能装4加仑的水壶里恰好只装2加仑水?(1)定义状态空间�可将问题进行抽象,用数偶(x,y)表示状态空间的任一状态。�x—表示4gallon水壶中所装的水量,x=0,1,2,3或4;�y—表示3gallon水壶中所装的水量,y=0,1,2或3;�初始状态为(0,0)�目标状态为(2,?)�?表示水量不限,因为问题中未规定在3加仑水壶里装多少水。(2222)确定一组操作1(X,Y|X4)→(4,Y)4加仑水壶不满时,将其装满;2(X,Y|Y3)→(X,3)3加仑水壶不满时,将其装满;5(X,Y|X0)→(0,Y)把4加仑水壶中的水全部倒出;6(X,Y|Y0)→(X,0)把3加仑水壶中的水全部倒出;7(X,Y|X+Y≥4∧Y0)→(4,Y-(4-X))把3加仑水壶中的水往4加仑水壶里倒,直至4加仑水壶装满为止8(X,Y|X+Y≥3∧X0)→(X-(3-Y),3)把4加仑水壶中的水往3加仑水壶里倒,直至3加仑水壶装满为止;9(X,Y|X+Y≤4∧Y0)→(X+Y,0)把3加仑水壶中的水全部倒进4加仑水壶里;10(X,Y|X+Y≤3∧X0)→(0,X+Y)把4加仑水壶中的水全部倒进3加仑水壶里;(3333)选择一种搜索策略该策略为一个简单的循环控制结构:选择其左部匹配当前状态的某条规则,并按照该规则右部的行为对此状态作适当改变,然后检查改变后的状态是否为某一目标状态,若不是,则继续该循环。�4加仑水壶中3加仑水壶中所应用的含水加仑数含水加仑数规则�00�032�309�332�427�025�209例2.2分配问题有两个液源A和B。A的流量为100L/m,B的流量为50L/m。现要求它们以75L/m的流量分别供应两个同样的洗涤槽C,D。液体从液源经过最大输出能力为75L/m的管道进行分配,A、B、C、D的位置、距离如图2-2所示。并且要求只允许管子在液源或洗涤槽位置有接头。例2.2分配问题�问:如何连接管子使得管材最少?图2-2液源分配问题示意图例2.2分配问题(1)(1)(1)(1)定义状态空间中的状态表示状态以表的形式表示为:(A=?B=?C=?D=?)初态:(A=100B=50C=0D=0)目标状态:(A=0B=0C=75D=75)例2.2分配问题(2)(2)(2)(2)定义操作现在取从一处到另一处流量的增量,为各点流量与各处所需流量的最大公约数(greatestcommondivisor)。100、50、75的GCD为25,所以取增量为25。例2.2分配问题�①本身到本身不必传递,用×表示;②洗涤槽不必往液源送,用⊕表示;例2.2分配问题1A→B(A≥25∧B75)→(A-25,B+25,C,D)4km2A→C(A≥25∧C75)→(A-25,B,C+25,D)5km3A→D(A≥25∧D75)→(A-25,B,C,D+25)5km4B→C(B≥25∧C75)→(A,B-25,C+25,D)3km例2.2分配问题5B→D(B≥25∧D75)→(A,B-25,C,D+25)3km6C→D(C≥25∧D75)→(A,B,C-25,D+25)6km7D→C(C75∧D≥25)→(A,B,C+25,D-25)6km例2.2分配问题(3)(3)(3)(3)定义策略因为现在没有给出任何知识可用来指导搜索,所以可采用耗尽式搜索,即每次却将7个操作试用一遍。对于该具体问题,搜索时要注意:①若操作重复时,只算一次距离;②边搜索边求出距离最短的管长。分配问题�搜索路径:2.42.42.42.4问题特征分析对问题的几个关键指标或特征加以分析。一般要考虑:�问题可分解成为一组独立的、更小、更容易解决的子问题吗?�当结果表明解题步骤不合适的时侯,能忽略或撤回吗?�问题的全域可预测吗?2.42.42.42.4问题特征分析�在未与所有其它可能解作比较之前,能说当前的解是最好的吗?�用于求解问题的知识库是相容的吗?�求解问题一定需要大量的知识吗?或者说,有大量知识时候,搜索时应加以限制吗?�只把问题交给电脑,电脑就能返回答案吗?或者说,为得到问题的解,需要人机交互吗?2.4.12.4.12.4.12.4.1问题是否可分解?如果问题能分解成若干子问题,则将子问题解出后,原问题的解也就求出来了。人们称这种解决问题的方法为问题的归约。例2.32.32.32.3符号积分不定积分的计算规则有:∫udv→uv-∫vdu分部积分产生式规则∫(f(x)+g(x))dx→∫f(x)dx+∫g(x)dx和式分解规则∫kf(x)dx→k∫f(x)dx因子规则例2.4积木问题──机器人规划的抽象模型积木问题关心的是积木块的相对位置:某一积木在桌上或某一积木在另一积木上。机器人一次只能拿一块积木,每次搬动时积木上面必须是空的。例2.4积木问题积木的相对位置可用谓词表示为:初始状态:ontabel(B)∧clear(B)∧ontabel(A)∧on(C,A)∧clear(C)目标状态:ontabel(C)∧on(B,C)∧on(A,B)其中目标状态可分解为:子问题1:ontabel(c)子问题2:on(B,C)子问题3:on(A,B)例2.4积木问题机器人所需完成的操作:OP1:clear(x)→ontabel(x)无论x在何处,若x上无物体,则可将x放于桌上OP2:clear(x)∧clear(y)→On(x,y)若x,y上无物体,则可将x放在y上这个问题的求解方法有两种:��一种方法是采用全面搜索的方法;一种方法是采用全面搜索的方法;��一种是用分解子问题的方法。一种是用分解子问题的方法。从目标来看,总问题可分解成三个子问题,但这三个子问题不能按任意次序求解。但若从初态出发,,,,将on(A,B)on(A,B)on(A,B)on(A,B)作为子问题1111首先求解,这样会使搜索离目标越来越远。对于子问题的之间的关系,实际上有两种:一种为子问题之间是独立的,其搜索路径为:�另一种是子问题之间有依赖关系,其搜索路径为:2.4.22.4.22.4.22.4.2问题求解步骤是否可撤回?在问题求解的每一步骤完成后,分析一下它的“踪迹”,可分为3类:(1)求解步骤可忽略如定理证明,证明定理的每一件事情都为真或者为假,且总是保存知识库里,它是怎样推出来的对下一步并不重要,因而控制结构不需要带回溯。(2)可复原如走迷宫,实在走不通,可退回一步重来。这种搜索需用回溯技术,例如:��需用一定的控制结构;需用一定的控制结构;��需采用堆栈技术。需采用堆栈技术。(3)不可复原如下棋、决策等问题,要提前分析每走一步后会导致的结果。不可回头重来,这需要使用规划技术。2.4.32.4.32.4.32.4.3问题全域可预测否?有些问题它的全域可预测,如水壶问题、定理证明,这些问题结局肯定,可只用开环控制结构。有些问题的全域不可预测,如变化环境下机器人的控制,特别是危险环境下工作的机器人随时可能出意外,必须利用反馈信息,应使用闭环控制结构。2.4.42.4.42.4.42.4.4问题要求的是最优解还是较满意解?一般说来,最佳路径问题的计算较任意路径问题的计算要困难。如果使用的启发式方法不理想,那么对这个解的搜索就不可能很顺利。有些问题要求找出真正的最佳路径,可能任何启发式法都不能适用。因此,得进行耗尽式搜索,