欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载
     

    人工智能ppt课件搜索问题.ppt

    • 资源ID:1622021       资源大小:437KB        全文页数:70页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    人工智能ppt课件搜索问题.ppt

    第一部分 问题求解,用搜索法对问题求解问题求解算法描述:问题实例 :玩具世界与现实世界问题 搜索求解性能的度量 *无信息的搜索策略 *有信息的搜索和探索 *对抗搜索(与或图搜索) 高级搜索,第二部分 知识表示与推理,谓词逻辑与归结原理 命题逻辑 谓词逻辑 *归结原理 Herbrand定理知识表示 知识概述 *产生式表示 语义网络表示 框架表示 其他表示方法,第三部分 人工智能高级专题,基于模型的诊断配置问题智能规划调度,搜索算法把问题作为输入,并以行动序列的形式返回问题的解。一旦找到一个解,那么它所建议的行动就可以付诸实施,这被称为执行阶段。因而我们可以对问题求解算法进行设计,即“形式化、搜索、执行”问题的形式化:一个问题可以形式化地定义为四个组成部分:初始状态;可能的行动的描述。最常见的形式化是使用一个后继函数。给定一个特殊的状态x,Successor(x)返回一个由有序对(行动,后继)组成的集合,其中每个行动都是状态x下的合法行动之一,每个后继都是行动后从状态x能够达到的状态。,定义明确的问题及解,总之,初始状态和它的后继函数隐含的定义了问题的状态空间-即从初始状态可以达到的所有状态的集合。状态空间形成一个图,其中节点是状态,节点之间的弧就是行动,状态空间中的一条路径就是通过行动序列连接起来的一个状态序列。目标测试,用来确定当前状态是不是目标状态。路径耗散函数为每条路径分配一个数值化的耗散值。问题求解算法选择能反映它自己性能度量的耗散函数。上述四个元素定义了一个问题,可以把它们集合在一起成为一个单一的数据结构,作为问题求解算法的输入。问题的解就是从初始状态到目标状态的路径。解的优劣由路径耗散函数度量,而最优解是所有的解里路径耗散值最小的解。,前面用初始状态、后继函数、目标测试和路径耗散来表示问题,这种形式化表示是合理的,不过它忽略了现实世界的许多方面,去除表示中细节的过程被称为抽象化,而去除表示中细节的描述称为问题形式化。,问题实例,玩具世界与现实世界问题我们首先来看一个八数码游戏,初始状态,目标状态,它包括一个3X3的棋盘,棋盘上摆放着8个写有数字的棋子,留下一个空位。与空位相邻的棋子可以滑入到空位中。游戏的目的是要达到一个特定的目标状态。,初始状态,搜索和执行,标准的形式化如下:状态;描述了指定8个棋子中的每一个以及空位在棋盘的9个方格上的分布。初始状态:任何状态都可以指定为初始状态。注意要到达任何一个给定的目标,可能的初始状态中恰好只有一半可以作为初始状态。后继函数:用来产生通过四个行动(把空位向Left,right,Up或Down)能够达到的合法状态。目标测试:用来检测状态是否是目标状态。路径耗散:设每一步的耗散值是1因此整个路径的耗散值是路径中的步数。这里的抽象化只保留了游戏规则相关的描述,而忽略所有物理操作的细节。,八数码游戏属于滑快问题家族,这类问题经常被用作AI中新的搜索算法的测试问题。这类一般问题已知为NP完全问题,因此对这类问题不要期望在最坏情况下找到好于我们后面要讲述的算法。八数码游戏共有9!/2=181440个可达到的状态,这是很容易求解的。15数码问题则大约有1.3万亿个状态,用最好的搜索算法最优化地求解一个随机的实例需要几毫秒。24数码游戏则大约有1025个状态,用目前的机器和最优化算法求解随机的实例仍是相当困难的。四皇后问题在一个44的国际象棋棋盘上,一次一个地摆布四枚皇后棋子,摆好后要满足每行、每列和对角线上只允许出现一枚棋子,即棋子间不许相互俘获。如图其中a,b满足目标条件,c,d,e为不合法状态,即不可能构成满足目标条件的中间势态。,四皇后问题的几个状态,尽管对于这个问题和整个n皇后问题家族存在有效的专用算法,这类问题对于搜索算法仍然是个有趣的测试问题。形式化主要有两类:一类是增量形式化,包括了增加状态描述的算符,从空状态开始:对于四皇后问题意味着每次行动添加一个皇后到状态中去。另一类是完全状态形式化,4个皇后都在棋盘上开始,然后移动它们。,增量形式化如下:状态:把0到4个皇后放棋盘上的任何安排都是一个状态。初始状态;棋盘上没有皇后。后继函数;把一个皇后添加到棋盘上的任何空格。目标测试:4个皇后都在棋盘上,并且互相攻击不到。在这个形式化中,我们需要调查16X15X14X13个可能的序列。更好的形式化方法是禁止把一个皇后放到任何可能被攻击的格子里:状态:摆放n个皇后(0n4)的安排,要求最左侧n列里每一列一个皇后,保证没有一个皇后能攻击另一个。后继函数:把一个皇后添加到最左侧空列的任何格子内,只要该格子未被其他皇后攻击。这样的形式化把四皇后问题的状态空间从4万多降到3。,如果是八皇后呢?在这个形式化中,需要调查64X63XX57 3X1014个状态状态:摆放n个皇后(0n8)的安排,要求最左侧n列里每一列一个皇后,保证没有一个皇后能攻击另一个。后继函数:把一个皇后添加到最左侧空列的任何格子内,只要该格子未被其他皇后攻击。这样的形式化把四皇后问题的状态空间从3X1014降到2057,解就容易找到了。对于100个皇后,初始的形式化约有10400个状态,而用改进的形式化方法约有1052个状态这是一个相当大的缩减,但是仍然太大。我们以后将给出一个简单算法,可以处理百万皇后问题。,现实世界问题,我们已经看到寻径问题是如何根据特定的位置和沿它们之间的连接进行转移而定义的。寻径问题在实际中有许多应用。诸如计算机网络的路由、军事行动的规划、生产调度问题、排课问题,以及飞机航线旅行规划系统等等。这些问题都是典型的描述起来复杂的问题。,考虑一个飞机航线旅行问题的简化例子,设定如下:状态:每个状态由位置(例如机场)和当前的时间来表示。初始状态:由具体问题而定。后继函数:返回的状态是下列因素的结果:乘坐的航班,起飞时刻距当前时刻的时间差加上从当前机场到另一个机场所需要的飞行时间。目标测试:我们是否在某个预定的时刻到达目的地?路径耗散:取决于金钱的花费、等待的时间、飞行时间、过海关和入境的过程、座位的质量、一天中的哪个时间段、飞机类型、飞行常客的里程奖等。,商业旅行建议系统使用了这种问题形式化的方法,同时要考虑很多附加的复杂因素以应付航空公司强加的繁复的收费结构。然而,任何经常作飞机的乘客都知道并不是所有的飞行旅行都能够按计划顺利进行。好的系统应该包括应急计划。旅行问题与寻径问题有很近的关系,但是有很重要的不同。例如多个城市之间的旅行问题,从长春出发到其他19个城市中的每一个至少一次最后在回到出发地这样一个问题。如寻径一样,行动还是对应临近城市之间的旅行。然而,状态空间就不一样了。每个状态不仅必须包括当前所在的位置,还必须包括已经访问过的城市。因此初始状态可能是“in长春;visited长春,一个中间状态可能是”in上海; visited长春,沈阳、上海“,而目标测试应该是检测是否在长春并且已经访问过所有的20个城市。其他实际问题,解的搜索,在对一些问题形式化之后,我们现在开始考虑如何对它们求解,这是通过在状态空间中的搜索完成的。下面讨论的搜索技术使用显式的搜索树,搜索树是由初始状态和后继函数共同生成的,同时也定义了状态空间。下图是一个简化的罗马尼亚道路图,Hirsova,86,Eforic,一个简化的罗马尼亚道路图,下图显示了为寻找从Arad到Bucharest的路径对搜索树进行的某些扩展,初始状态,扩展Arad之后,扩展Sibiu之后,非形式化算法Tree-Search,1.根据问题初始状态初始化搜索树;2.While(不满足结束条件时)2.1 If(没有可扩展的结点)返回失败信息; 2.2 根据某种策略选择一个可扩展叶子结点; 2.3 If(当前结点满足目标状态)返回解的信息;Else将该结点(可扩展结点)加入到搜索树中;,该算法如何进行优化?,搜索树中节点的表示有多种方式,不过我们可以假设节点是一个包含五个要素的数据结构:状态:状态空间中与该方法相对应的格局;父节点:搜索树中生成该节点的节点;行动:由父节点产生该节点所采取的操作;路径耗散(成本):从初始状态到该节点的路径耗散,一般记为g(n),路径有父指针表示;深度:从根节点到该节点所经路径上的步数。,节点与状态的区别?,父节点,节点,状态,行动=Right,深度=3,路径耗散=3,节点产生构造搜索树的数据结构,每个节点都具有父节点,状态和各种记录域,图中箭头是由子节点指向父节点的指针。,度量问题求解的性能,完备性:当问题有解时,这个算法是否能保证找到一个解?,空间复杂度:执行搜索的过程中需要多少内存?,时间复杂度:找到一个解需要花费多少长时间?,最优性:该搜索策略是否能找到最优解?,时间和空间的复杂性度量往往要与问题难度的某种度量一起考虑,在理论计算机科学中,一个典型的度量是状态空间的大小。因为状态空间图被视为要输入到搜索程序的显示数据结构。在AI 中,状态空间图是由初始状态和后继函数隐含地表示的,经常是无限的,它的复杂度根据下列三个值来表达:,B,分支因子;d,最浅的目标节点的深度;m,状态空间中任何路径的最大长度。时间复杂度一般根据搜索过程中产生的节点数目来度量,而空间复杂度则根据在内存中存储的最大节点个数来度量。,无信息搜索,无信息搜索算法是经典计算机科学(Horowitz和Sahni,1978)和运筹学(Dreyfus,1969)的一个中心话题,1988年Gallo和Pallottino给出了相关问题的综述文章。搜索问题回溯策略图搜索策略无信息图搜索:广度优先、代价一致搜索、深度优先、深度有限搜索、迭代深入深度优先搜索、双向搜索、无信息搜索策略的比较、避免重复状态。,人类的思维过程,可以看作是一个搜索的过程。从小学到现在,你也许遇到过很多种智力游戏问题,比如说传教士和野人问题:有3个传教士和3个野人来到河边准备过河,河岸有一条船,每次至多可供2人乘坐。问传教士为安全起见,应如何规划摆渡方案,使得任何时候,在船上与河的两岸野人数目总是不超过传教士数目(但允许在河的某一侧只有野人而没有传教士)?如果要做这个智力游戏,在每一次渡河之后,都会有几种渡河方案供你选择,究竟哪种方案才有利于在满足题目所规定的约束条件下顺利过河呢?这就是搜索问题。,搜索问题,经过反复努力和试探,你终于找到了一种解决方法。在你高兴之余,你可能马上会想到,这个办法所用的步骤是否最少?也就是说,它是最优的吗?如果不是,如何才能找到最优的办法?你是学过计算机程序设计的学生,你考虑过在计算机上又如何实现这样的搜索?这些问题就是我们要学习的内容。,一般而言,很多问题求解过程可以转化为状态空间的搜索问题。比如,前面讲过的传教士与野人问题,当用在河左岸的传教士人数、野人人数和船的情况表示问题时,该问题的初始状态可以用三元组表示为(3,3,1),结束状态可以表示为(0,0,0),而中间状态可以表示为(2,2,0)、(3,2,1)、(3,0,0)等,每个三元组对应了三维空间上的一个点。而问题的解,则是一个合法状态的序列,其中序列的第一个状态是问题的初始状态,而最后一个状态则是问题的结束状态,介于它们之间的是中间状态。除了第一个状态外,该序列中任何状态都可以通过一条规则由与它相邻的前一个状态转换得到。下页的图给出了一个搜索问题的示意图。含义是如何在一个比较大的问题空间中,只通过搜索比较小的范围,就找到问题的解。寻找这样的序列过程称为搜索。,搜索方法,从搜索方式上来讲,搜索可以划分为两大类,即盲目搜索和启发式搜索。所谓盲目搜索,就是未利用问题的知识,采用固定的方式生成状态的方法。显然这种方法的搜索效率是低下的,但方法具有通用性。当一时难以找到求解问题的有效知识时,是一种不得不采用的方法。所谓启发式搜索,与盲目搜索正好相反,它利用问题的知识,缩小问题的搜索范围,选择那些最有可能在(最优)解路径上的状态优先搜索,以尽快地找到问题的(最优)解。由于利用了问题的有关知识,一般来说,搜索效率会有所提高。但如何找到对求解问题有帮助的知识,以及如何利用这些知识,是问题的关键所在。,到目前为止,在人工智能领域中已提出许多具体的搜索方法,概括起来有:(1)求任一解路的搜索策略回溯法(Backtracking)爬山法(Hill Climbing)宽度优先法(Breadth-first)深度优先法(Depth-first)限定范围搜索法(Beam Search) 好的优先法(Best-first)(2)求最佳解路的搜索策略大英博物馆法(British Museum)分枝界限法(Branch and Bound)动态规划法(Dynamic Programming)最佳图搜索法(A)(3)求与或关系解图的搜索法一般与或图搜索法(AO)极小极大法(Minimax)剪枝法(Alpha-beta Pruning)启发式剪枝法(Heuristic Pruning)今后对其中几个基本搜索策略作进一步的讨论。,无信息的搜索策略,这部分无信息搜索(也称为盲目搜索)主要包括广度优先搜索、代价一致搜索、深度优先搜索、深度有限搜索和迭代深度优先搜索和双向搜索几种。以下我们分别进行讲述和对比 。广度优先搜索:它是一种简单的搜索策略,首先扩展根节点,接下来扩展根节点的所有后继,然后再扩展它们的后继,依此类推。一般来讲,在下一层的任何节点扩展之前搜索树上当前层的所有节点都已经扩展完。1959年Moore最早使用广度优先搜索形式化并解决迷宫问题。广度优先搜索可以调用函数TREE-SEARCH来实现,该函数以一个空的边缘为参数,而边缘是一个先进先出(FIFO)队列,保证先访问的节点先扩展。这意味着浅层的节点会在深层节点之前被扩展。,一个简单二叉树的搜索过程,在每一个阶段,下一个要扩展的节点由箭头指示出来。,广度优先搜索算法的评价,从完备性和最优性来看我们很容易知道广度优先搜索是完备的如果最浅的目标节点处于一个有限的深度d,广度优先搜索在扩展完比它浅的所有节点(假设分支因子b是有限的)后最终能找到这个目标节点。但最浅的目标不一定是最优的目标节点:,从技术上讲,如果路径耗散是节点深度的非递减函数,广度优先算法才是最优的。,从时间和空间复杂性来看我们考虑一个假想的状态空间,状态空间中每个状态都有b个后继。这样搜索树的根节点生成第一层的b个子节点,每个子节点又生成b个子节点,在第二层共有b2个节点,这些节点中的每一个又生成b个子节点,如此类推,假设解的深度为d,在最坏情况下,我们将扩展d层除了最后一个节点外的所有节点(因为目标节点本身尚未被扩展),那么在d+1层会产生bd+1-b个节点, 这时已经生成的节点数是多少?,b+b2+b3+bd+(bd+1-b)=O(bd+1)每个生成的节点都必须保存在内存中,因为它既是边缘节点的一部分又是边缘节点的祖先,因此该算法的时间复杂度和空间复杂度相等(再加上一个根节点)。,广度优先搜索时间与空间复杂度分析,深度 节点数 时间数 内存,2 1100 0. 11秒 1Mbit,下图是分支因子b=10的时候广度优先搜索到不同的解深度d所需要的时间和空间开销,并假定每秒生成10000个节点,并且存储一个节点需要1k字节。,4 111,100 11秒 106M,6 107 19分钟 10G,8 109 31小时 1T(KG),10 1011 129天 101T,12 1013 35年 10P(KT),14 1015 3523年 1E(KP),从上图我们可以得到两个结论:第一个结论,在广度优先搜索算法中内存的需求是比执行时间消耗更大的问题。第二个结论,时间需求仍是个主要因素。一般来讲,除最小的实例外指数级复杂度的搜索问题不能用无信息的方法解决。,代价一致搜索,当所有单步消耗相等时,广度优先搜索是最优的,因为它们总是扩展深度最浅的未扩展节点。但代价一致搜索扩展的是路径消耗最低的节点n。 在什么条件下广度优先搜索与代价一致搜索相 同?,代价一致搜索时对一条路径的步数并不关心,而只是关心所经步骤总的耗散。因此若扩展到一个具有能返回同一状态的零耗散行动的节点时会陷入无限循环,造成不完备性。若每一步的耗散都大于等于某个最小的正常数时,能够保证其完备性与最优性。沿着路径的耗散总是增加的,因此第一个被扩展的目标节点就是最优解(记住,算法只对被选中扩展的节点进行目标测试)。,代价一致算法的度量,代价一致搜索由路径的耗散引导而不是深度,因此它的复杂度不能简单地使用b和d来刻画。我们使用C*表示最优解的耗散值,并且假定每个行动的耗散至少为。那么算法的时间和空间复杂度为 ,要比bd大得多。 为什么?什么条件下一广度优先算法复杂度一样?我们学过代价一致的搜索吗?,深度优先搜索,深度优先搜索总是扩展搜索树的当前边缘中最深的节点,搜索直接推进到搜索树的最深层,那里的节点没有后继节点。当那些节点被扩展完之后,它们被从边缘中去掉,然后搜索算法“向上回到”下一个还有未扩展后继节点的稍浅的节点。 在搜索算法Tree-Search中采用什么策略能够使搜索过程按照深度优先进行?,深度优先搜索对内存的需求很少,它只需要存储一条从根节点到叶节点的路径,以及该路径上每个节点的所有未被扩展的兄弟节点即可。一旦一个节点被扩展,当它的所有后代都被扩展和这个节点从内存中删除。因此,对上面的搜索图,若分支因子为b,最大深度为m的状态空间,深度优先搜索只需要存储bm+1个节点。与广度优先相同假设下,并且假设与目标节点在同一深度的节点没有后继节点,我们看到在深度d=12时深度优先搜索只需要118k字节而不是10P 字节,节省了大约百亿倍的空间。深度优先搜索的缺点是它有可能错误地选择一条分支并且沿着一条很长(甚至是无限的)路径一直走下去,而如果做出不同的选择则可能引导对树根节点附近的解进行搜索。,1初始化。取图中任意结点s(G=s)作为初始结点将其赋值到OPEN表,CLOSED表置空。2循环执行以下语句直至找到解或OPEN表为空2.1n=first(OPEN);2.2 IF GOAL(n) return(SUCCESS);算法结束;2.3 REMOVE(n,OPEN),ADD(n,CLOSE);2.4 EXPAND(n)-mi; G=ADD(mi,G);2.5 ADD(mj,OPEN),并标记mj到n的指针;把不在OPEN或CLOSE中的结点放在OPEN表的最前面,使浓度大的结点可优先扩展。,深度优先搜索算法的框架,深度有限搜索,前面我们看到,深度优先搜索虽然占用的内存比较小,但这种算法不是完备的也不是最优的。为此,我们可以通过对深度优先搜索提供一个预先设定的的深度限制l 来解决,就是说深度为l的节点被当作没有后继的节点对待,这种办法称为深度有限搜索。对深度限制解决了无穷路径问题。但问题是如果我们选择的ld的话,搜索也不是最优的,深度优先可以看作深度有限的一种特殊情况。那么如何来优化这种方法呢?,深度有限搜索可以通过对一般的树搜索算法或者递归深度优先搜索算法进行简单的修改来实现。即对深度限制l不断进行迭代更新。,迭代深入搜索,迭代深入搜索(或迭代深入深度优先搜索)是一个用来寻找最合适的深度限制的通用策略,它经常与深度优先搜索结合使用。做法是不断地增大深度限制-首先为0,接着为1,然后是2,依此类推-直到找到目标节点。但深度限制达到d,即最浅的目标节点的深度时,就找到目标节点,下面的图给出了算法的搜索过程,该算法结合了深度优先和广度优先搜索的优点,它的空间和深度优先搜索需求一样小,为O(bd)。它和广度优先搜索一样当分支因子有限时是完备的,当路径耗散是节点深度的非递减函数时是最优的。,迭代深入搜索也许看起来比较浪费,因为有些状态被多次生成。但实际上代价不是很大。原因在于一棵每层的分支因子都相同(或相近)的搜索树中,底层节点(深度d)只被生成一次,倒数第二层的节点生成两次。依此类推,一直到根节点的子节点,它被生成d次。因此生成的总节点数为 (d+1)b0+db+(d-1)b2+2bd-1+bd,时间复杂度是O(bd)。与广度优先生成的节点数相比,它没有生成d+1层的节点而广度优先可能会生成一些d+1层的节点,因此它比广度优先搜索要快。比如b=10,d=5,迭代深入搜索生成50+400+3000+20000+100000=123450个节点,而广度优先搜索生成10+100+1000+10000+100000+999990=1111110个节点。,迭代深入搜索的性质,完备吗? 是时间复杂性? (d+1)b0 + d b1 + (d-1)b2 + + bd = O(bd)空间复杂性? O(bd)最优性? 是, if step cost = 1,双向搜索,双向搜索的思想是同时进行两个方向的搜索,一个从初始状态向目标状态进行,另一个从目标状态向初始状态搜,动机的产生的节点是bd/2+bd/2要比bd小得多,即两个小圆的面积之和比起点为中心达到目标的大圆面积大得多。双向搜索最吸引人的地方是时间复杂度的降低,但实际上如何从目标向初始状态搜并不容易。,几种算法的比较,标准 广度优先 代价一致 深度优先 深度限制 迭代深入,完备性 是 是 否 否 是时间 O(bd+1) O(bC*/) O(bm) O(bl) O(bd)空间 O(bd+1) O(bC*/) O(bm) O(bl) O(bd)最优性 是 是 否 否 是,回溯策略,回溯策略属于盲目搜索的一种。所谓回溯策略,简单地说是这样一种策略:首先将规则给出一个固定的排序,在搜索时,对当前状态(搜索开始时,当前状态是初始状态)依次检测每一条规则,在当前状态未使用过的规则中找到第一条可触发规则,被应用于当前状态,得到的新状态重新设置为当前状态,并重复以上搜索。如果当前状态无规则可用,或者所有规则已经被试探过仍未找到问题的解,则将当前状态的前一个状态(即直接生成该状态的状态)设置为当前状态。重复以上搜索,直到找到问题的解,或者试探了所有可能后仍找不到问题的解为止。,回溯策略可以有多种实现的方法,其中用递归法实现也许是最简单的方法了,本书中给出的就是这种算法。对于初次接触递归程序设计或者对递归程序设计不熟悉的同学,对这段算法也许不容易理解。在这里对递归程序设计的思想做一个通俗易懂的介绍。对递归程序设计熟悉的同学可以略过。以C语言为例,我们在写一个函数时,一般是用其他已经有的函数(系统提供的库函数或者自己已经定义好的自定义函数)来定义该函数。而递归程序设计则是在定义一个函数时“自己调用自己”(直接的,或者间接的),比如定义abc这个函数,如果写成这样的形式:,int abc(int n)abc(m);则abc是一个递归调用,因为我们在定义abc这个函数时,同时也用到了abc这个函数,这就是所谓的自己调用自己。,其实我们早就遇到过递归了。在大家小的时候,都听过那个从前有座山的故事吧?从前有座山,山里有个庙,庙里有个和尚正在讲故事,讲的什么故事呢?讲的是从前有座山,山里有个庙,庙里有个和尚正在讲故事,讲的什么故事呢?讲的是从前有座山,山里有个庙,庙里有个和尚正在讲故事,讲的什么故事呢?讲的是这就是一个典型的递归。不过这个递归永远也不会结束,是一种死递归。但是我们大家谁也没有永远将这个故事听下去。因为当满足一定的条件时,比如讲故事的人口干舌燥不想讲了,故事也就结束了。这虽然是一个一点也不动听的故事,但它确实是一个故事。这里的口干舌燥就是递归的一个结束条件,正是由于有了这个条件,才使得递归结束。,考察这个故事,有两个特点,一是有一个简单的结束条件,如这里的“口干舌燥”;二是每一次递归调用,都使得问题-在这里就是故事-距离结束近了一些。比如第二次讲“从前有座山”时,就比第一次讲“从前有座山”时距离故事结束近。正是这两点,构成了递归程序设计的两个要点。,下面举一个简单的C程序例子,在这个例子中,利用递归求解一个链表的长度。struct LIST /定义一个简单的链表结构 Tdtat; struct LIST *pNext;int ListLenght(LIST *pList)/ 递归定义函数ListLenght/ 函数的功能是求解给定链表的长度if (pList = NULL) return 0; / 递归的结束条件,一个空的链表长度定义为0else return ListLenght(pList-pNext)+1;/ 递归调用/ 将求链表pList的长度问题,变换为求解pList-pNext的长度问题/ pList的长度等于pList-pNext的长度+1,递归过程BACKTRACK(DATA)IF TERM(DATA),RETURN NIL;TERM取真即找到目标,则过程返回空表NIL。IF DEADEND(DATA),RETURN FAIL;DEADEND取真,即该状态不合法,则过程返回FAIL,必须回溯。RULES:APPRULES(DATA);APPRULES计算DATA的可应用规则集,依某种原则(任意排列或按启发式准则)排列后赋给RULES。LOOP:IF NULL(RULES),RETURN FAIL;NULL取真,即规则用完未找到目标,过程返回FAIL,必须回溯。R:FIRST(RULES);取头条可应用规则。RULES:TAIL(RULES);删去头条规则,减少可应用规则表的长度。RDATA:GEN(R,DATA);调用规则R作用于当前状态,生成新状态。PATH:BACKTRACK(RDATA);对新状态递归调用本过程。IF PATHFAIL,GO LOOP;当PATHFAIL时,递归调用失败,则转移调用另一规则进行测试。RETURN CONS(R,PATH);过程返回解路径规则表(或局部解路径子表)。,下面对这个算法作几点说明。首先解释一下其中的变量、常量、谓词、函数等符号的意义。变量符号DATA、RULES、R、RDATA、PATH分别表示当前状态、规则集序列表、当前调用规则、新生成状态、当前解路径表。常量符号NIL、FAIL、LOOP分别表示空表、回溯点标记、循环标号。当状态变量DATA满足结束条件时,TERM(DATA)取真;当DATA为非法状态时,DEADEND(DATA)取真;当规则集变量表RULES取空时,NULL取真。函数RETURN、APPRULES、FIRST、TAIL、GEN、GO、CONS的作用是:RETURN返回其自变量值;APPRULES求可应用规则集;FIRST和TAIL分别取表头和表尾;GEN调用规则R生成新状态;GO执行转移;CONS构造新表,把其第一个自变量加到一个表(第二个自变量)的前头。BACKTRACK(RDATA)表示调用递归过程作用于新自变量上。,这里再说明一下该过程的运行情况。当某一个状态Sg满足结束条件时,算法才在第1步结束并返回NIL,此时BACKTRACK(Sg)NIL。失败退出发生在第2、4步,第2步是处理不合法状态的回溯点,而第4步是处理全部规则应用均失败时的回溯点。若处在递归调用过程期间失败,过程会回溯到上一层继续运行,而在最高层失败则整个过程宣告失败退出。构造成功结束时的规则表在第10步完成。算法第3步实现可应用规则的排序,可以是固定排序或根据启发信息排序。这个简单的BACKTRACK过程只设置两个回溯点,可用于求解N皇后这类性质的问题,下面以四皇后问题为例来说明算法的运行过程。,设有44的国际象棋棋盘,现在要求把4个皇后放到棋盘上,使它们不能互相攻击。我们采用标记皇后位置的44矩阵作为状态描述。如果矩阵中已经有4个标记皇后的符号“”,并且它们不能互相攻击,则认为这个状态描述满足终止条件,对于这个状态描述来说,TERM取真值。根据问题的要求,采用下面的问题描述:状态:摆放n个皇后(1n4)的安排,要求最上面n-1行里每一行一个皇后,保证没有一个皇后能攻击另一个。初始状态;棋盘上没有皇后。后继函数;如果第n-1行有一个皇后,把一个皇后添加到第n行第m列格子内( 1m4),表示为Rnm。 目标测试:4个皇后都在棋盘上,并且互相攻击不到。,如果从一个给定的状态描述出发,已经明显看出不能得到问题的解,则对此状态DEADEND取真,例如,如果发现有两个皇后在同一列,则DEADEND为真,因为没有关于问题的探索性信息指导,所以回溯的次数很到,经过22次回溯后才找到解。,1,2,4,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,NIL,避免重复状态,不能够检测到重复的状态可把一个线性问题变成指数问题,总结,问题的形式化是从现实世界中抽取出能够定义容易求解状态空间的抽象。,无信息搜索算法的分类。,迭代深度搜索一般是线性的使用的时间不超过其他无信息搜索算法。,搜索树中已经生成出来但还未被扩展的节点集合被称为边缘,边缘的每个元素都是叶节点,即在搜索树中没有后继的节点。前面罗马尼亚城市路径搜索树中的边缘由搜索树中实线轮廓线表示的节点组成。边缘就是节点集合。,

    注意事项

    本文(人工智能ppt课件搜索问题.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开