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

3.6 启发式搜索

前面说的所有的算法都是无信息的,并没有考虑目标节点在哪里。它们没有使用任何指引它们该向哪去的信息,除非它们无意中发现目标。关于哪些节点是最有希望节点的启发信息的一种形式叫做启发函数h(n),这个函数参数为节点n,返回一个非负实数,即为节点n到目标节点的估计花费。如果h(n)的值小于或等于从n节点到目标节点最低花费路径的实际花费,那么就说启发函数是“低估”的。
启发函数是得出目标的搜索方向的一种方式。它提供一个有信息依据的方法来猜测节点的哪个邻居将会通往目标节点。
启发函数没有什么神奇可言。它只能使用可容易地从节点上获取的信息。通常情况下,需要在以下两个值之间做折中:获取一个节点的启发值所花费的工作量,以及一个节点的启发值如何准确地衡量从该节点到目标的实际路径花费。
得到启发函数的一个标准方式是:解决一个更简单点的问题,然后将简化了的问题的实际花费作为原始问题的启发函数。
【例3-12】 图3-2中,从节点到目标位置的直线距离可以作为启发函数。
下述实例中假设如下启发函数:

h(mail)=26h(ts)=23h(o103)=21
h(o109)=24h(o111)=27h(o119)=11
h(o123)=4h(o125)=6h(r123)=0
h(b1)=13h(b2)=15h(b3)=17
h(b4)=18h(c1)=6h(c2)=10
h(c3)=12h(storage)=12

h函数就是一个低估,因为h的值小于或等于从节点到目标的最低花费路径的真实花费。对于o123来说,h的值就是真实花费值。对b1来说,则是很大的低估,看起来b1离目标很近,但其实只能通过一条很长的路径才能到达目标。而对于c1来说,这个h值则差之千里,因为看起来它离目标节点很近,事实上没有从该节点通往目标节点的路径。
【例3-13】 在例3-2中的投递机器人,状态空间包含要运送的包裹。假定花费函数是机器人运送所有包裹走过的总距离。一个可能的启发函数就是一个包裹到目的地的最大距离。如果机器人只能携带一个包裹,那么可能的启发函数就是包裹经过的距离之和。如果机器人一次可以携带多个包裹,那么这个启发函数就不是真实花费的低估了。
h函数也可以扩展适用(非空)路径。路径的启发值是路径最后的节点的启发值。即
h(〈no,…,nk〉)=h(nk)
启发函数的一个简单应用是在深度优先搜索中为邻居排序,这些节点被依次压入堆栈来表示边界,这样邻居被加入边界,因此最先选择的是最优邻居,即所谓“启发式深度优先”(heuristic depth-first search)算法。这种搜索算法可以找到局部最优路径,但是在搜索另一条路径之前,它会遍历所有已选路径。尽管这个算法常用,但也受困于深度优先搜索自身的问题。
启发函数的另一种使用方式是:总是选择边界中具有最低启发值的路径,这叫做最优优先搜索(best-first search)。这个方法通常不太有效,它会选择看上去最有希望的路径,因为他们离目标节点很近,但是路径花费会不断增加。

【例3-14】 如图3-8所示,弧线的花费是它的长度。目标是找到从s到g的最短路径。假定到节点g的欧几里得距离是启发函数。启发深度优先搜索将会选择位于s下面的节点,并永远不会终止。相似地,因为位于s以下的所有节点看起来都不错,最优优先搜索将会在它们之间循环,而从不尝试由s开始的其他可替换路径。
3.6.1 A 搜索
A 搜索是最低花费优先搜索和最优优先搜索的结合,它在选择路径扩展时既要考虑路径的花费也要考虑启发信息。对于边界上的每一条路径,A都会估计沿路径从初始节点到目标节点的总路径花费。它使用函数cost(p)(即已找到的路径花费)和启发函数h(p)(即从p的结尾到目标的估计花费)。
对于边界上的任意路径p,定义函数f(p)=cost(p)+h(p),指沿着路径p到目标节点的估计总花费。
如果n是路径p的末节点,那么可以描述为:

如果h(n)是从节点n到目标节点路径花费的低估,那么f(p)就是从初始节点经过p到目标节点路径花费的低估。
是通过将边界看做按照f(p)进行排序的优先级队列来实现的。
【例3-15】 对例3-4运用A算法进行搜索,并使用例3-12的启发函数。在这个例子中,边界上的路径用路径上最后一个节点来表示,下标是路径的f值。初始边界是:[o10321],因为h(o103)=21,路径花费是0。然后用邻居替换,形成新的边界:[b321,ts31,o10936]。
第一个元素代表路径〈o103,b3〉,它的f的值为:f(〈o103,b3〉)=cost(〈o103,b3〉)+h(b3)=4+17=21。接着b3就被邻居替换,边界变为:[b121,b429,ts31,o10936]。
然后到b1的路径被b1的邻居替换,边界变为:[c221,b429,b229,ts31,o10936]。
接下来,到c2的路径被它的邻居替换,边界变为:[c121,b429,b229,c329,ts31,o10936]。
直到这个状态,搜索一直都在找看起来直接通往目标节点的路径。下面,选择c1被相邻点替代,形成边界:[b429,b229,c329,ts31,c335,o10936]。
直到这一步,到c3有两条不同路径。其中一条不经过c1,它的f值要比经过c1的另外一条路径低。在后面,我们会考虑将其中一个路径剪枝的情况。
这里有两条相同f值的路径。算法没有指定选择哪条。假设下一步选择了通往b4的路径,并被它的相邻点替换,形成边界:[b229,c329,ts31,c335,o10936,o10942]。
然后选择到b2的路径并被邻居替换,但这条路径是空集,所以形成边界:[c329,ts31,c335,b435,o10936,o10942]。
然后到c3的路径被删除,它没有邻居,因此,新的边界变为:[ts31,c335,b435,o10936,o10942]。
注意A算法是如何从一开始寻求多个不同路径的。
最终会找到一个最低花费路径。这个算法会强制尝试很多不同的路径,因为它们其中的一些路径暂时看上去有最低花费。它仍然比最低花费优先和最优优先搜索方法都要好。
【例3-16】 考虑图3-8,对于其他的启发方法,这是个有问题的图。虽然由于启发函数,起始情况从节点s向下搜索,但最终路径的花费变得非常大,因此它选择了在实际最优路径上的节点。
如果解存在,A总是能找到最优解,而且搜索的第一条路径就是最优的,这个性质叫做A的“可采纳性”(admissibility)。它意味着:即使当搜索空间是无限的,如果解存在,那么就一定能找到解,而且找到的第一条路径就是最优解,即从起始节点到目标节点的最低花费路径。
命题3.1(A可采纳性) 如果存在解,A总可以找一个解,并且找到的第一个解就是最优解,如果:

  • 分支系数有限(每一个节点有有限个邻居);
  • 弧线花费大于ε>0;
  • h(n)是从节点n到目标节点的最低花费路径的最小实际花费值的下界。

证明:
A部分:可以找到解。如果弧线的花费都大于ε,ε>0,最终对于边界中所有的路径p,cost(p)会超过任何有限的数。因此,如果存在解,cost(p)会超过解的花费(搜索树的深度不会大于m/ε,这里m是解的花费)。因为分支系数是有限的,在搜索树还没扩展到这个规模之前,只能扩展有限数目的节点,但是那时A算法已经找到了解路径。
B部分:找到的第一条解路径就是最优路径。在最优解路径中,任何一个节点的f值都小于或者等于最优解的f值。这是因为h是从一个节点到目标的实际花费的低估。因此,最优解路径中任何一个节点的f值都小于任何非最优解的f值。所以,当一个节点存在于指向最优解的边界中时,算法永远不会选择一个非最优的路径(因为在每一步中,都会选择f值最小的元素)。因此,在可能选择一个非最优解之前,它肯定已经造访了一个最优路径上的所有的节点,包括每一个最优解。
应该注意到:A的可采纳性不能保证每一个从边界中选择的中间节点位于从开始节点到目标节点的最优路径中。可采纳性使算法不必担心环路问题,保证了第一个解是最优解。但当局部路径最优时,它并不能保证算法不会改变主意。
看一下启发函数是如何提高A算法的效率的,假设c是从起始节点到目标节点的最短路径的花费。A具有可采纳性的启发信息,91扩展集合{p:cost(p)+h(p)<c}中从起始节点开始的每一条路径,或者集合{p:cost(p)+h(p)=c}中的某些路径。
如果减少这些集合中第一部分的数量,提高h则会影响A的效率。
3.6.2 搜索策略总结

图3-9中的表格给出了各种搜索策略的总结。
图3-9 搜索策略的总结
注:“终止否”意味着“如果图(可能无穷大)中有一条到目标的路径,该路径上每个节点都有有限个数量的邻居,且每条弧的花费都有正值下界,那么这个方法能否保证搜索终止? ”。那些回答“Yes”的搜索策略的最坏情况下的时间复杂度与路径长度呈指数形式增长。那些不能保证终止的算法有无限最坏情况的时间复杂度。“空间”指的是空间复杂度,它与路径长度是“线性”或是“指数级”关系。
深度优先搜索在空间上与造访路径的长度呈线性增长,但是即使有解存在,它也不能保证能找到解。宽度优先、最低花费优先以及A算法在时间和空间上都是呈指数增长,只要解存在,即使图是无限大的(只要分支系数有界,弧线花费是正非平凡),它们都能保证找到解。
最低花费优先和A搜索算法都能保证第一个找到的解是最低花费的解。

时间: 2024-08-25 16:15:16

《人工智能:计算Agent基础》——3.6 启发式搜索的相关文章

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

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

《人工智能:计算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基础》——1.6 原型应用

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

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

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

《人工智能:计算Agent基础》——2.5 通过推理来行动

2.5 通过推理来行动 之前的部分假定Agent有着很多在各个时段保留下来的信念状态.对于一个智能Agent,信念状态可以非常复杂,甚至可用占用单独一层. 学习和构建智能Agent的经验表明智能Agent需要某些信念状态的内部表示方法.知识指的是领域内的信息,可用于解决该领域内的问题.知识指的是用于特定情境.领域的一般性知识.因此关于特定状态更常使用知识而非信念.基于知识的系统是可以使用领域内知识来动作或者解决问题的系统. 哲学家们将知识定义为正确的.经过证实的信念.人工智能研究者们则更倾向于融

《人工智能:计算Agent基础》——1.2 人工智能简史

1.2 人工智能简史 纵观人类历史,人们曾一直用技术为人类自身建立模型,例如古代的中国.古埃及和古希腊都可以证明,每一种新技术都不断地用来建造Agent或其他意识模型.发条装置.水力学.电话转换系统.全息图.模拟计算机以及数字计算机等都被提出作为智能装置和意识模型的技术原理.大约400年前,人们开始解释思维与推理的本质.Hobbes(1588-1679)被Haugeland6[1985,P.85]称为人工智能的始祖,认为思考是符号推理,例如大声说话或用纸笔计算出某个答案.Descartes(15

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

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

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

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