《人工智能:计算Agent基础》——3.5 无信息搜索策略

3.5 无信息搜索策略

一个问题给定了图和目标,但并没有给出从边界中选择哪条路径。这是搜索策略的任务,一个搜索策略指定如何从边界中选择路径。通过改变在边界中选择路径的实现方法从而可以得出不同的搜索策略。79
这部分介绍了三种不考虑目标节点位置的所谓无信息搜索策略(uninformed search strategy)。直觉上,这些算法不关心它们要到哪里去,直到找到目标节点并报告成功。
3.5.1 深度优先搜索
第一个策略是深度优先搜索(depth-first search)策略。在深度优先搜索中,边界的动作像一个先进后出的堆栈(stack)。这些元素被逐次地压入栈中。在边界中被选择并撤销的节点肯定是最后一个入栈的元素。
【例3-6】 考虑图3-5中的树形图,假设初始节点是树的根(在顶部的节点),节点从左到右排序,所以最左边的邻居最后被压入栈 在深度优先搜索中,节点扩展的方向并不依赖于目标节点的位置。图3-5中,我们将首批扩展的16个节点用数字标记出来了。阴影节点表示这16步检索完成后,边界路径上的最终节点。

注意最开始的6个节点是如何在单一的路径上扩展的。第6个节点没有邻居,因此,下一个要扩展的节点是距离它最近的且有尚未扩展的子节点的父节点的子节点。
利用堆栈来实现边界会导致使用深度优先的方式得到路径——在查找一条路径到头之后再尝试另一个分支路径。这种方法叫做回溯(backtracking):在每一个节点,算法会先选择每个节点上第一条可选择的路径搜索下去,当执行完第一个选择的整个路径它会回溯到下一个80可选的路径。一些路径可能是无限的,比如当图中有环或者有无限多节点时,这样深度优先搜索也许永远不会停止。
这种算法没有明确规定将邻居压入堆栈的顺序,并用堆栈代表了边界。算法的效率就跟这个顺序相关。
【例3-7】 考虑图3-2中的从房间o103出发的深度优先搜索,唯一的目标节点是r123。在这个例子里,边界表示为一个路径列表,栈顶作为列表的开始部分。
最初,边界包含平凡路径〈o103〉。
下一步,边界包含了后面的路径:[〈o103,ts〉,〈o103,b3〉,〈o103,o109〉]。
接下来,会选择路径〈o103,ts〉,因为它位于栈顶。这条路径就从边界中删除并用一段弧扩展它后再替换它,这样边界就变为:[〈o103,ts,mail〉,〈o103,b3〉,〈o103,o109〉]。
接下来,第一条路径〈o103,ts,mail〉也就被删除并被用一段新弧扩展后的一个路径集所替代,但由于mail节点没有邻居,所以该集合是空的。因此边界变为:[〈o103,b3〉,〈o103,o109〉]。
在这个阶段,路径〈o103,b3〉在堆栈的顶部。注意一个事实,当深度搜索已经遍历了所有的从ts出发的路径(这里只有一条),它就要回溯到堆栈的下一个元素。接下来,选择〈o103,b3〉,并用新弧的扩展路径替换它,边界变为:[〈o103,b3,b1〉,〈o103,b3,b4〉,〈o103,o109〉]。
然后从边界中选择〈o103,b3,b1〉并扩展,边界变为:[〈o103,b3,b1,c2〉,〈o103,b3,b1,b2〉,〈o103,b3,b4〉,〈o103,o109〉]。
现在第一条路径就从边界中选出来了,并通过新弧扩展出来,产生边界路径:[〈o103,b3,b1,c2,c3〉,〈o103,b3,b1,c2,c1〉,〈o103,b3,b1,b2〉,〈o103,b3,b4〉,〈o103,o109〉]。
注意节点c3没有邻居,因此搜索回溯到最近的尚未造访的节点,即c1。
假定〈n0,…,nk〉是在边界中被选定的路径,边界的每一个其他元素都表示为〈n0,…,ni,m〉,其中i为了更好地理解深度优先的复杂度(参见下面“各种算法性能对比”的内容),考虑使用家族树来类比,一个节点的邻居对应的是树中的子节点。树的根是起始节点,树的分支对应的是从起始节点开始的路径。考虑边界顶端的路径的最终节点,边界的其他元素是这个节点父节点的其他子节点,对应就是“叔叔”、“伯伯”,等等。如果分支系数是b,列表的第一个元素的长度是n,那么最多有n×(b-1)个边界的其他元素。这些元素对应着每一个节点都有b-1个可选路径。因此,对于深度优先搜索,使用的空间开销与从起始节点到某一个节点的路径长度呈线性关系。各种算法性能对比各种算法(包含搜索算法)可以按以下几项进行比较:

  • 时间开销
  • 空间开销
  • 结果的质量以及准确性

时间开销、空间开销以及结果的准确性都是算法输入的函数。计算机科学家们所探讨的渐进复杂度(asymptotic complexity),规定了时空开销是如何随着算法的输入量的增加而增长的。算法对于输入大小n有时间(或空间)的复杂度函数O(f(n)),读作“大Of(n)”,这里f(n)是关于n的函数,如果存在常数n0和k,对于所有的n>n0, 都有算法的时间或空间开销少于k×f(n)。这个函数的最常见形式是指数函数,如2n、3n、1.015n;多项式函数,如n5、n2、n、n1/2;或对数函数,如logn。一般来说,指数函数算法比多项式函数算法复杂度增长更快,相应的,多项式函数算法比对数函数增长的快。
当输入大小为n时,如果存在常数n0和k,对于所有的n>n0,都有算法的时间或空间开销大于k×f(n),就称算法有时间或空间复杂度Ω(f(n))。一个算法如果有复杂度O(n)和Ω(n),那么它就有时间或空间的复杂度Θ(f(n))。通常情况下,不能说一个算法的复杂度是Θ(f(n)),因为大多数算法输入不同,时间开销也不同。因此,当比较算法时,必须确定问题分类。
当通过时间、空间或准确性某个方面衡量出算法A比算法B更优,则意味着:

  • A最坏的情况比B的最坏的情况好;
  • 在实践中,A能更好运行。或者在考虑典型性问题的平均情况时,A运行的平均情况比B好;
  • 由你描述哪类问题使用算法A比B好,所以算法的优劣取决于要解决的问题;
  • 对于任何的问题,A都比B好。

最坏情况的渐进式复杂度往往最容易显现,但它通常是最没用的。如果很容易确定所给定问题是哪一类,通过对问题的特征分类来决定哪种算法更优是最有用的方法。不幸的是,这种特征分类很难。
通过对问题的特征分类来确定哪种算法更优,可以在理论上通过数学方法或在经验上通过建立程序来实现。这些数学定理的有效性只能依赖于作为基础的假设。相似地,基于经验的程序验证只能在测试用例和算法实际的实现方法中有效。我们很容易通过举个反例来反驳一种算法对某类问题更优的猜想,但却很难证明这种猜想。如果第一个分支搜索就得到一个解,那么时间复杂度就与路径的深度呈线性关系,它只考虑这条路径上的元素,以及它的兄弟姐妹。最坏情况的时间复杂度是无限大。即使存在一个解,如果这个图是无限的或者循环的,深度优先搜索会陷入无限的分支然后永远找不到解。如果图是有限的树,前向分支系数最大是b,深度为n,那么最坏情况的时间复杂度是O(bn)。
【例3-8】 考虑修改前面的图,让Agent在位置之间移动更自由,得出图3-6,一条无限的路径从ts指向mail,然后回到ts,再返回mail,如此循环往复。显然,深度优先搜索将沿着这条路径永远搜索下去,而不会考虑到b3或者o109等可选择路径。前5次反复使用深度优先路径搜索算法得到的边界如下:

[〈o103〉]
[〈o103,ts〉,〈o103,b3〉,〈o103,o109〉]
[〈o103,ts,mail〉,〈o103,ts,o103〉,〈o103,b3〉,〈o103,o109〉]
[〈o103,ts,mail,ts〉,〈o103,ts,o103〉,〈o103,b3〉,〈o103,o109〉]
[〈o103,ts,mail,ts,mail〉,〈o103,ts,mail,ts,o103〉,〈o103,ts,o103〉,〈o103,b3〉,o103,o109〉]

可以通过不考虑有环路径来优化深度优先搜索。
因为深度优先搜索对邻居加入边界的顺序敏感,这一点必须仔细对待。这个顺序可以是静态的(这样邻居的顺序固定)或者是动态的(邻居的顺序由目标节点决定)。
深度优先搜索适用的条件:

  • 空间是被限定的;
  • 存在许多解,可能路径很长,尤其当几乎所有路径都导致一个解时;
  • 节点邻居的压栈的顺序可以调整,以便在第一次尝试中就找到解。
    深度优先搜索不适用的条件:
  • 当图是无限的或者图中有环的时候,有可能陷入无限的路径中;
  • 解路径存在于隐蔽的深度,因为在这种情况下可能要搜索很多条长路径才能发现短路径结果。
    深度优先搜索是许多其他搜索算法的基础,如迭代搜索。

3.5.2 宽度优先搜索
在宽度优先搜索(breadth-first search)中,边界是用一个先进先出(FIFO)队列实现的。因此,最开始从边界中选择的路径是最早进入队列的。
这个方法意味着从初始节点出发的路径按照弧数目多少的顺序依次产生。在每一个阶段中,选择弧最少的那条路径。84

【例3-9】 来看图3-7中的树形图。假定起始节点在顶部。在宽度优先搜索中,节点扩展的顺序与目标节点的位置无关,这与深度优先搜索相同。最开始搜索的16个节点的扩展顺序已经在图中标记出来了。在最开始扩展的16步完成后,阴影节点就是多条路径的末端,并组成了边界。
【例3-10】 考虑图3-2从o103的宽度优先搜索。唯一的目标节点是r123。最开始,边界是[〈o103〉]。然后经过o103的邻居得到扩展的边界,即[〈o103,ts〉,〈o103,b3〉,〈o103,o109〉]。这些都是o103的一条出弧所指向的节点。下面选择的三条路径是〈o103,ts〉,〈o103,b3〉,〈o103,o109〉,这个阶段,边界扩展为:[〈o103,ts,mail〉,〈o103,b3,b1〉,〈o103,b3,b4〉,〈o103,o109,o111〉,〈o103,o109,o119〉]。
这些路径都包含有两段弧,并都始于o103。经过下一步的边界节点选择和扩展,得到新的五条路径,这时边界包括的从o103出发的路径都含有三段弧。记作:[〈o103,b3,b1,c2〉,〈o103,b3,b1,b2〉,〈o103,b3,b4,o109〉,〈o103,o109,o119,storage〉,〈o103,o109,o119,o123〉]。
注意到边界的每一条路径都有近似相等的弧数。对于宽度优先搜索,通常边界中路径的弧数最大相差1条。85
假定搜索的分支系数是b。如果边界的第一条路径包含n段弧,那么边界中就至少有bn-1个节点。所有的这些路径包含n或者n+1段弧。因此,根据到达目标节点弧数最少的那条路径上的弧数,空间和时间复杂度呈指数级增长。无论如何,这个方法可以保证只要有解就能找到,并且是最少弧的解。
宽度优先搜索适用于:

  • 不存在空间问题;
  • 想找最少弧的路径;
  • 可能有很少的解,但是至少有一个短路径解;
  • 可能存在无限的路径,因为它会遍历所有的搜索空间,即使是无限的路径。

这个算法并不适用于所有的路径都很长,或者有一些可用的启发知识的情况。因为空间复杂度很大,所以它并不常用。
3.5.3 最低花费优先搜索
当路径的花费与弧有关时,我们常常想找到总花费最小的路径。例如,对于一个投递机器人,花费可能是两位置之间的距离,我们需要总距离最短的那条解路径。花费也可能是机器人按照弧实施动作所需要的各种资源。一个指导系统的花费可能是学生所需要的时间和精力。在每一种情况下,搜索者都试图找到最低花费的解路径来达到目标。
目前为止考虑的搜索算法不能保证找到最低花费的路径,他们完全没有使用弧花费的任何信息。宽度优先搜索首先找到弧数最少的路径,但这未必是最少花费的路径。
最简单的能保证找到最低花费路径的搜索方法与宽度优先搜索算法相似。不同的是,它是寻找最低花费的路径,而不是通过扩展路径找最少弧数的路径。这是通过把边界作为一个由花费函数排序的优先级队列来实现的。
【例3-11】 看图3-2,考虑图中从o103开始的最低花费优先搜索。唯一的目标节点是r123。这个例子中,路径由最后的节点表示,下标是路径的花费值。
最初,边界是[o1030]。下一阶段是[b34,ts8,o10912]。因为b3的花费最小,所以选择了到b3的路径,结果边界变为:[b18,ts8,b411,o10912]。86
因为b1的花费最小,然后选择到b1的路径,结果为:[ts8,c211,b411,o10912,b214]。
因为ts的花费最小,然后选择到ts的路径,结果为:[c211,b411,o10912,mail14,b214]。
然后选择到c2的路径,如此循环。注意最低花费优先搜索是如何逐渐增长路径的,它总是扩展花费值最低的路径。
如果一个问题存在解路径,弧线的花费被界定为低于一个正常数且分支系数也是有限的,那么最低花费优先搜索就能确定找到一个最优解(即有最低花费的路径)。而且,最先找到的路径就是花费最低的路径。因为算法产生的路径从最初就是按照路径花费值排序的,所以这个解是最优的。如果存在一个比第一个被发现的解更优的解,它在边界中会被选择得更早。
界定的弧花费是用来保证最低花费搜索能找到最优解。如果没有这样的界定,就会有有限花费的无限路径。例如,对于每一个i>0,节点n0,n1,n2,…对应的弧线〈ni-1,ni〉中每一条弧线的花费都是1/2i,这样的话,存在很多形式为〈n0,n1,n2,…,nk〉的路径,它们的花费都小于1。如果有一条弧从n0到目标节点的花费大于或等于1,它将永远都不会被选中。这个就是早在2300年前亚里士多德写到的“芝诺悖论”的基础。
像宽度优先搜索,最低花费优先搜索在时间和空间上都是典型的指数函数。它会产生所有的低于解路径花费的从起始节点开始的路径。

时间: 2024-09-20 06:09:34

《人工智能:计算Agent基础》——3.5 无信息搜索策略的相关文章

《人工智能:计算Agent基础》——导读

前 言 本书是一本关于人工智能(AI)科学的图书.本书认为AI所要研究的是如何设计智能计算Agent(智能体).本书采用教科书的组织形式,适合广大读者阅读.过去几十年,我们见证了AI这门综合学科的兴起.正如其他学科一样,AI具有清晰.规范的理论和难操控的实验部分.本书平衡了理论和实验,并将两者密切地结合.俗话说"好的理论必须有其实用价值",因此我们将工程应用融入到AI的科学研究中.本书所述方法都秉承了格言"凡事都应尽量从简,但不可过简".我们认为科学必须有其坚实的基

《人工智能:计算Agent基础》——3.7 更复杂的搜索方

3.7 更复杂的搜索方法 之前的策略可以进行很多优化.首先,我们给出两种适用于图中有环的方法:一种是对环路的明确检查,而另一种是对到某一节点的多路径检查.然后,我们给出迭代深度算法和深度分支界限搜索法,92这两种方法是能保证找到解路径(甚至是最优解)的一般方法,就像宽度优先搜索算法或者A搜索算法,但是利用了深度优先搜索的空间优点.我们将搜索问题分解为很多小的搜索问题来简化搜索方法,这样每一个都更容易解决.最后,我们说明利用动态规划法如何寻找路径和构建启发函数.3.7.1 环检查用来代表搜索空间

《人工智能:计算Agent基础》——第二部分 表达和推理第3章 状态和搜索3.1 用搜索进行问题求解

第二部分 表达和推理 第3章 状态和搜索 你看到过海岸上的螃蟹在寻找大西洋的过程中一直向后爬行,最终消失吗?人们也是同样的思考方式.--H.L.Mencken (1880-1956) 前面一章讨论了Agent是如何理解和动作的,但是没有讲到它们的目标是如何影响动作的.一个Agent可以根据既定的目标集有规划的去动作,但是如果不能适应变化的目标,这样的Agent就是非智能的.或者,Agent能够根据自身能力和既定目标去推理,从而决定应该做什么.这一章介绍将Agent决定做什么的问题描述为在一个图中

《人工智能:计算Agent基础》——第一部分 世界中的Agent:什么是Agent及如何创建它们第1章人工智能与Agent1.1 什么是人工智能

第一部分 世界中的Agent:什么是Agent及如何创建它们 第1章人工智能与Agent 人工智能的历史充满幻想.可能.验证和希望.自从荷马描绘机器"鼎"服侍在众神的餐桌旁,那想象中的机器佣人便成为我们文化的一部分.然而,我们人工智能的研究者,直到50年前,才首次制造出实验性机器来验证那些假想,即有关具备思维和智能行为机器人的假想,使得之前仅在理论上具备可能性的机器人得到验证.--Bruce Buchanan [2005] 历经几个世纪的思想构建,人工智能学科被公认为有超过50年的历史

《人工智能:计算Agent基础》——第2章 体系结构和分层控制

第2章 体系结构和分层控制 所谓分层或分层系统,是指一个系统由多个相互关联的子系统组成,而每个子系统又可再次分层直至到达最底层基本子系统为止.自然界的大部分系统中,何时停止分层及什么是基本元素的随意性极大.物理学中会经常使用基本粒子的概念,但是粒子早已证实不是物质的最底层基本元素.我们从实验观察到自然中的大部分复杂系统都展示出分层结构.从理论上讲,我们希望世界上的复杂系统都具备分层结构,其复杂系统可从简单系统演变而来.--Herbert A.Simon[1996] 本章主要讨论智能Agent在实

《人工智能:计算Agent基础》——3.6 启发式搜索

3.6 启发式搜索 前面说的所有的算法都是无信息的,并没有考虑目标节点在哪里.它们没有使用任何指引它们该向哪去的信息,除非它们无意中发现目标.关于哪些节点是最有希望节点的启发信息的一种形式叫做启发函数h(n),这个函数参数为节点n,返回一个非负实数,即为节点n到目标节点的估计花费.如果h(n)的值小于或等于从n节点到目标节点最低花费路径的实际花费,那么就说启发函数是"低估"的. 启发函数是得出目标的搜索方向的一种方式.它提供一个有信息依据的方法来猜测节点的哪个邻居将会通往目标节点. 启

《人工智能:计算Agent基础》——1.5 复杂性维度

1.5 复杂性维度 从自动调温器到在竞争性环境中有多种目标的企业,Agent在环境中行为的复杂性各不相同.Agent的设计存在多个维度的复杂性.这些维度可以分开来考虑,但建造智能Agent时必须组合起来.这些维度定义了人工智能的一个设计空间,空间里的不同点可以通过改变维度值来得到.这里我们介绍9个维度:模块性.表示方案.规划期.感知不确定性.效用不确定性.偏好.Agent数量.学习和计算限制.这些维度对智能系统的设计空间做了粗糙的划分.有时为了建立智能系统必须做出很多其他的选择.1.5.1 模块

《人工智能:计算Agent基础》——1.6 原型应用

1.6 原型应用 人工智能领域的应用广泛而且多样化,包括医疗诊断.工厂流程调度.险恶环境中的机器人.博弈.太空中的无人驾驶车辆.自然语言处理系统.指导系统等.这些应用并不是独立进行的,我们抽象出这些应用的本质特点,来研究智能推理及动作背后的原理. 本节概述了4个应用领域,其中的几个实例将贯穿整本书.尽管我们介绍的几个实例都很29简单(如此他们才适用于本书),但其应用领域代表了人工智能技术能够或正在应用的领域范围. 4个应用领域如下所示: 自主传送机器人会在某个建筑物旁徘徊,负责给里面的人传送包裹

《人工智能:计算Agent基础》——1.4 知识表示

1.4 知识表示 一般情况下,要解决的问题或要完成的任务,包括解的构成,是通过非形式化的方式给出的,例如"他们到达时,请立即递交包裹"或"请修理家中存在故障的电力系统". 计算机解决问题的一般框架在图1-4中给出.为了解决问题,系统设计者必须: 具体化任务,并制定解决方案. 用特定的语言表达问题,以便计算机进行推理.11 用计算机计算出相应结果进行输出,可以给用户呈现一个答案或是在环境中需要执行的一系列行为. 解释作为问题的解决方案的输出结果. 知识是可以用来解决本