人工智能学习(三):通过搜索进行问题求解——有信息搜索

目录

引言

2.1 贪婪最佳优先搜索

2.2 贪婪最佳优先搜索 V.S. 一致代价搜索

2.3 A*搜索:缩小总评估代价

2.4 A*搜索和一致代价搜索的直观比较

2.5 五种搜索算法的直观比较

2.6 可接受的启发式方法

2.7 局部搜索算法

2.7.1 局部搜索算法

2.7.2 爬山算法


引言

有信息搜索又称为启发式搜索

使用问题本身的定义之外的特定知识——比无信息的搜索策略更有效地进行问题求解。

最佳优先搜索(best-first search):

我们要考虑的一般算法称为最佳优先搜索。 最佳优先搜索结点是基于评价函数f(n)值被选择扩展的。评估函数被看作是代价估计,因此评估值最低的结点被选择首先进行扩展。

最佳优先图搜索的实现与一致代价搜索类似,不过最佳优先是根据f值而不是g值对优先级队列排队。

启发函数(heuristic function):

f的选择决定了搜索策略(深度优先搜索是最佳优先树搜索的特殊情况)。大多数的最佳优先搜索算法的f由启发函数构成:

h(n)=结点n到目标结点的最小代价路径的代价估计值

(要注意的是h(n)以结点为输入,但它与g(n)不同,它只依赖于结点状态)。

若n是目标结点,则h(n)=0。 

启发式函数常用的测距方法

曼哈顿距离

两点之间沿着坐标轴方向的累积距离d=(x_1-x_2) + (y_1-y_2)

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第1张图片

欧几里得距离

两点之间的直线距离d = \sqrt{(x_1-x_2)^2 +(y_1-y_2)^2}

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第2张图片


描述一下下面使用的问题情景

在地图中寻找起始城市到达目标城市的路径。如未指明,起始城市默认为:Arad;目标城市默认为:Bucharest。 

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第3张图片

启发式函数h(n)默认使用直线距离:

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第4张图片

2.1 贪婪最佳优先搜索

贪婪最佳优先搜索(greedy best-first search):

贪婪最佳优先搜索试图扩展离目标最近的结点,理由是这样可能可以很快找到解。

启发函数:

只用启发式信息,即f(n)= h(n)


将此算法应用在罗马尼亚问题中;使用直线距离启发式,记为h_{SLD}。 如果目的地是Bucharest,我们需要知道到达Bucharest的直线距离,如图所示。h_{SLD}不能由问题本身的描述计算得到。而且,由经验可知h_{SLD}和实际路程相关,因此这是一个有用的启发式。 

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第5张图片

下图给出了使用h_{SLD}的贪婪最佳优先搜索寻找从AradBucharest的路的过程:

  1. Arad出发最先扩展Sibiu,因为与ZerindTimisoara相比,它距离Bucharest最近。
  2. 下一个扩展的结点是Fagaras,因为它是离目标最近的。
  3. Fagaras接下来生成了Bucharest,也就是目标结点。

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第6张图片


完备性:贪婪最佳优先搜索不是完备的。

贪婪最佳优先搜索与深度优先搜索类似,即使是有限状态空间,它也是不完备的。考虑从lasiFagaras

理想状态下,启发式建议先扩展Neamt,因为它离Fagaras最近,但是这是个死胡同。解法是先到Vaslui——根据启发式这是离目标较远的一步,然后继续前往UrziceniBucharestFagaras

然而,算法始终找不到这个解,因为扩展Neamt则将lasi重新放回到了边缘结点集中,lasiVasluiFagaras更近,所以又去扩展lasi,从而导致死循环。(有限状态空间的图搜索版本是完备的,但无限的则不是)。

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第7张图片

最优性:贪婪最佳优先搜索不是最优的。

对于这个特殊问题,使用h_{SLD}的贪婪最佳优先搜索在没有扩展任何不在解路径上的结点前就找到了问题的解;所以,它的搜索代价是最小的。然而却不是最优的:经过SibiuFagarasBucharest的路径比经过Rimnicu\: \: VilceaPitestiBucharestt的路径要长32公里。这说明了为什么这个算法被称为“贪婪的”——在每一步它都要试图找到离目标最近的结点。

最坏情况下,时间和空间复杂度都是O(b^{m}),其中m是搜索空间的最大深度。然而这是建立在启发式函数是直线距离的基础上,如果有一个好的启发式函数,复杂度可以得到有效降低。下降的幅度取决于特定的问题和启发式函数的质量。 

时间复杂度:最坏情况下,算法的时间复杂度为O(b^{m})

空间复杂度:最坏情况下,算法的空间复杂度为O(b^{m})

2.2 贪婪最佳优先搜索 V.S. 一致代价搜索

我们上一篇博客学习了一直代价搜索,一致代价搜索主张扩展cost最小的节点,它和贪婪最佳优先搜索的区别和联系是什么呢?

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第8张图片

如果把UCS比喻成一只乌龟,缓慢的、按部就班地依次对所有当前最短的cost进行搜索,但它是完备的并且最终得到最优解。

贪婪最佳优先搜索就是兔子,跑的很快,但是不一定找到最优解甚至不一定完备。


下面有一个例子:左边是各个city的状态图,右边是根据状态图构建的搜索树。

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第9张图片        人工智能学习(三):通过搜索进行问题求解——有信息搜索_第10张图片

对于这样一颗搜索树,其中g是从起始节点到当前边缘节点的累积cost;如果按照UCS的思路,会依次扩展s\rightarrow a\rightarrow c\rightarrow d\rightarrow g然,得到最优解。

如果对于贪婪最佳优先搜索,则依据的是当前边缘节点到目标节点的距离,然后选择最短的一条,因此他会依次扩展:s\rightarrow a\rightarrow e\rightarrow d \rightarrow g,很显然,这并不是最优的。
 

2.3 A*搜索:缩小总评估代价

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第11张图片

最佳优先搜索的最广为人知的形式是A^{*}搜索。A^{*}搜索结合了贪婪最佳优先搜索和UCS的优点。

启发函数

它对结点的评估结合了g(n),即到达此结点已经花费的代价,和h(n),从该结点到目标结点所花代价:

f(n)= g(n) + h(n)

由于g(n)是从开始结点到结点n的实际路径代价,而h(n)是从结点n到目标结点的最小代价路径的估计值,因此:

f(n)=经过结点n的最小代价解的估计代价


注意:将节点压入边缘节点集合的时候如果符合目标检测的条件,搜索不能马上结d束。而应该等到这个边缘节点从数据结构中弹出才能进行目标检测判断是否结束。

目标检测时机

目标检测应用于结点被选择扩展时,而不是在结点生成的时候进行。

这是为什么呢?我们描述一个应用场景:

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第12张图片

在本图中,首先扩展S,边缘节点集合中加入A, B,根据A^{*}g+h

f(B)=2+1=3

f(A)=2+2=4

得出应该扩展B;这个时候边缘节点集合更新为A, G。如果这时候仅凭G是否出现在边缘节点集合中判断是否返回,那么现在就得到了S\rightarrow B\rightarrow G这条路,Cost =5,显然不是最优路径;

按照规定的流程,比较GA哪个应该被扩展,A此时的f(A)=4Gf(G)=5,因此应该选择A 进行扩展,而这时候边缘节点集合更新为G,G;从A那边到达的Gf(A)=4,因此应该选择扩展S\rightarrow A\rightarrow GCost =4,是最优路径。


具体描述

 人工智能学习(三):通过搜索进行问题求解——有信息搜索_第13张图片        人工智能学习(三):通过搜索进行问题求解——有信息搜索_第14张图片

  1. 首先扩展S
  2. 扩展a,现在b,d,e作为边缘节点。
  3. 根据g+h最小选择d作为新的扩展节点进行扩展,边缘节点集中的节点更新为:b, e, g
  4. g进行扩展(加入到解中),进行目标检测,程序结束。A^{*}搜索算法完成。

这样,如果我们想要找到最小代价的解,首先扩展g(n) + h(n)值最小的结点是合理的。可以发现这个策略不仅仅合理:假设启发式函数h(n)满足特定的条件,A^{*}搜索既是完备的也是最优的。算法与一致代价搜索类似,除了A^{*}使用g+h而不只是g

完备性A^{*}搜索是完备的。

最优性A^{*}搜索是最优的。 

但是存在保证最优性的条件——可采纳性和一致性:


可采纳性:

h(n)是一个可采纳启发式。可采纳启发式是指它从不会过高估计到达目标的代价。

因为g(n)是当前路径到达结点n的实际代价,而f(n)= g(n) + h(n)。我们可以得到直接结论:f(n)永远不会超过经过结点n的解的实际代价。

可采纳的启发式自然是乐观的,因为它们认为解决问题所花代价比实际代价小。


一致性

只作用于在图搜索中使用A^{*}算法。我们称启发式h(n)是一致的,如果对于每个结点n和通过任一行动a生成的n的每个后继结点n^{'},从结点n到达目标的估计代价不大于从nn^{'}的单步代价与从n^{'}到达目标的估计代价之和:

h(n)\leq c(n,a,n^{'})+h(n^{'})

这是一般的三角不等式,它保证了三角形中任何一条边的长度不大于另两条边之和。这里,三角形是由nn^{'}和离n最近的目标结点G_{n}构成的。

对于可采纳的启发式,这种不等式有明确意义:如果从n经过n^{'}G_{n}h(n)代价小,就违反了h(n)的性质:它是到达G_{n}的下界。

时间复杂度:最坏情况下,算法的时间复杂度为。

空间复杂度:最坏情况下,算法的空间复杂度为。


证明可采纳性A^{*}搜索是最优性的条件:

上面说到只要h(n)\leq h^*(n),由于没有过高地估计某个点到目标点的花费,这样我们必然能够找到最优的线路;而相反,如果某个点的h(n)>h^*(n),那么我们就很有可能不会走这个点。

下面给出一个形式化的证明:

我们假设出发点位于顶端,A为最优目标点,B为非最优目标点,n为最优线路上的点:

因为B是某条线路下的目标点

所以h(B)=0,同理h(A)=0

又因为B非最优目标点,A为最优目标点

所以g(B)> g(A)f(B)> f(A),对于n点来说,h(n)\leq h^{*}(n)

所以h(n)+g(n)\leq h^{*}(n)+g(n)

而我们知道A为最优目标点,故f(A)=h^{*}(n)+g(n)

综上f(n)=h(n)+g(n)\leq f(A)< f(B)

所以永远也不会通过走某条非最优路来到达目标点!

2.4 A*搜索和一致代价搜索的直观比较

UCS

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第15张图片

UCS的吃豆人

A^{*}

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第16张图片

A^{*}虽然和UCS有着类似的扩散,但是A^{*}更倾向于靠近目标点,向有利于目标的方向扩散。

A星搜索的吃豆人

Greedy

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第17张图片

2.5 五种搜索算法的直观比较

 BFS

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第18张图片

DFS

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第19张图片

Greedy

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第20张图片

UCS

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第21张图片

\textbf{A}^{*}

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第22张图片

2.6 可接受的启发式方法

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第23张图片

h_{1}(n) = number\: \: of \: \: misplaced\: \: tiles=7

h_{2}(n) = total\: \: Manhattan\: \: distance= 2+3+3+2+4+2+0+2 = 18


主导

If\: \: h_{2}(n) \geq h_{1}(n) \: \: for \: \: all\: \: n

那么h_{2}就会支配h_{1},并且更有利于搜索。

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第24张图片

在保证启发式是可接受的范围内,越接近真实的距离,越节省计算量。


宽松问题(Relaxed problems):

可接受的启发式方法可以从问题的宽松版本的精确解决成本中得出。

如果8拼图的规则被放宽,使瓷砖可以移动到任何地方,那么h_{1}给出了最短的解决方案。

如果放宽规则,使瓷砖可以移动到任何相邻的方格,那么h_{2}给出了最短的解决方案。

2.7 局部搜索算法

参考:爬山算法

2.7.1 局部搜索算法

例如我们上面所提到的所有案例,都返回从初始状态到目标状态的这条路径作为这个问题的解;

而实际中有很多最优化的问题,不关心路径,它只关心状态本身,它需要算法找到一个符合要求的目标状态,那么这个目标状态本身才是问题的解。针对这一类问题我们可以采用局部搜索算法。

局部搜索算法不记录它的搜索过程,它只记录一个或多个当前状态,然后通过不断的改进修改当前状态,直到它满足目标约束,也就是说是一个目标状态为止。那么这个目标状态本身返回去作为这个问题的解,那么它叫做局部的原因就是因为它只储存当前状态。那么它并不像前面一样,系统的记录从初始结点到达后续结点、目标节点的路径,并不储存这些东西。它只是在当前状态这个局部领域里记录它的搜索。这个是局部搜索算法的思想和它适用的问题。

这种算法有一个很大的优点,就是它对存储空间的要求非常的低,它只需要存储当前状态,并不需要把它走过的结点都记录下来。所以它对于现实世界的问题,一般都是无限空间状态的问题。那么它是很有实用性的,也就是说它可以用来解决一些实际的大问题。

2.7.2 爬山算法

那么首先我们来看到第一种局部搜索算法叫做爬山搜索,爬山搜索就是不断地向更高点前进。

爬山搜索就像有失忆的人在浓雾中攀登珠峰。这句话就是很形象的比喻出来了爬山搜索算法的两个问题:

失忆的人,那么他是不记得他曾经到过什么地方,也就是说它只记得它自己现在处在什么位置,周边是什么样的。——只储存当前状态

浓雾中攀登珠峰,在浓雾中定就是看的不远。他只能看到他周边的地形,远处如果有更高的山峰他是看不到的。——只把局部的最值点返回

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第25张图片


例子:

人工智能学习(三):通过搜索进行问题求解——有信息搜索_第26张图片

h=互相攻击到的皇后对数

(b)虽然不是一个正确的解,但他是爬山法得出的一个局部最优解,h=1

你可能感兴趣的:(人工智能基础,学习,算法,人工智能)