计算机人工智能基础与应用(下)
第4章 搜索 搜索是人工智能的一个基本问题,是推理不可分割的一部分。一个问题的求解过程就是搜索过程,所以搜索实际上是求解问题的一种方法。 4.1 搜索概述 4.1.1搜索的基本概念 人类的思维过程,可以看作是一个搜索的过程。我们曾经遇到过很多有趣的智力游戏问题,比如传教士和野人问题:有三传教士和三个野人过河,河岸上只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于传教士的人数,那么传教士就会有危险。你能不能找出一种安全的渡河方法呢?如果要作这个游戏,在每一次渡河之后,都会有几种渡河方案供你选择,究竟哪种方案才有利于在满足题目所规定的约束条件下顺利过河呢?人工智能要解决的问题大多数是结构不良或者非结构的问题,对这样的问题一般不存在成熟的求解算法,而只能利用已有的知识一步步地摸索着前进。在这个过程中,存在着如何寻找一条推理路线,使得付出的代价尽可能地少,而问题又能够得到解决。我们称寻找这样路线的过程为搜索。 4.1.2搜索的分类 根据在问题求解过程中是否运用启发性知识,搜索可分为盲目搜索和启发式搜索。 盲目搜索是按预定的控制策略进行,在搜索的过程中所获得的信息不用来改进控制策略的一种搜索。由于搜索总是按预先规定的路线进行,没有考虑问题本身的特性,这种方法缺乏对问题求解的针对性,需要进行全方位的搜索,而没有选择最优的搜索途径,因此,这种搜索具有盲目性,效率较低。 启发式搜索是在搜索中加入了与问题有关的启发式信息,用来指导搜索朝着最有希望的方向前进,加速问题的求解过程,并找到最优解。 4.2状态空间搜索 状态空间法 状态空间法的基本思想:用“状态”和“操作”来表示或求解问题。问题是用“状态”和“操作”来表示,问题求解过程是用“状态空间”来表示的。 状态是表示问题求解过程中每一步问题状况的数据结构,它可形式地表示为:Sk={Sk0, Sk1,……}。在这种状态中,当对每一个分量都给予确定的值时,就得到了一个具体的状态。 操作,也称算符,它是把问题一个状态变换为另一种状态的手段。操作可理解为状态集合上的一个函数,它描述了状态之间的关系。 状态空间用来描述一个问题的全部状态以及这些状态之间的相互关系。 状态空间法基本过程:首先为问题选择适当的“状态”及“操作”的形式化描述方法;然后从某个初始状态出发,每次使用一个“操作”,递增的建立起操作序列,直到达到目标状态为止;此时,由初始状态到目标状态所使用的算符序列就是该问题的一个解。 八数码难题 在3*3的方格棋盘上,分别放置了标有数字1、2、3、4、5、6、7、8的八张牌,初始状态S0,目标状态为Sg。可以使用的操作有: 空格左移、上移、下移、右移 状态 任一时刻, 综合数据库的情况; 状态空间 状态空间 所有可能的状态的全体. 状态转移 初始状态 目标状态 状态转移 规则 搜索(search) 路径 状态序列 搜索 寻找从初始状态到目标状态的路径; 搜索问题 搜索与检索的区别 状态是否动态生成; 检索: 静态; 在数据库中检索某人的纪录; 搜索: 动态生成; 下棋 状态空间搜索步骤 状态空间搜索实际上就是对有向图的搜索。 先把问题的初始状态当作当前扩展节点对其进行扩展,生成一组子节点,然后检查问题的目标状态是否出现在这些子节点中。若出现,则搜索成功,找到了该问题的解;若没有出现,则按照某种搜索策略从已生成的子节点中选择一个作为当前扩展节点。重复上述过程,直到目标状态出现在子节点中或没有可供扩展的节点为止。 状态空间搜索算法(准备) 若要讨论状态空间搜索的一般算法,需要: Open表和Closed表这样两个数据结构。其中, Open表用于存放还没有扩展的节点,因此,Open表称为未扩展的节点表。 Closed表用于存放已经扩展或将要扩展的节点,因此, Closed称为已扩展的节点表。 用S0表示问题的初始状态,G表示搜索过程所得到的搜索图,M表示当前扩展节点新生成的且不为自己先辈的子节点集。 算法(simple version) 1.建立一个只有起始节点S0组成的图G, 把S0放到OPEN表中; 2.建立一个CLOSED表,置为空; 3.While( !NULL (OPEN) ) a) 从OPEN表中取出(并删除)第一个节点n放入 CLOSED表。 b) 如果n是目标节点,成功结束; c) 扩展节点n,把n的后继加入G中; d) 把n的后继加入OPEN表中,并建立它们到n的指针; e) 对OPEN表中的节点排序; 4.返回FAIL; 例子 算法4.1 状态空间图的一般搜索算法: 1、把初始节点S0放入Open表中,并建立目前仅包含S0的图G; 2、检查是否为空,若为空,则问题无解,失败退