第三章 知情搜索
知情搜索(informed search,也称有信息搜索)利用启发式方法,通过限定搜索的深度或宽度来缩小问题空间。
3.0 引言
3.2 节~3.4 节将描述 3 种“永不回头看”的搜索算法,它们分别是:
- 爬山法(hill climbing)
- 最佳优先搜索(best-first search)
- 集束搜索(beam search)
在状态空间中,它们的路径完全由到目标的剩余距离的启发式评估值(近似值)来引导。
如果想要某个启发式方法有用的话,就应该低估(underestimate)剩余距离。搜索中启发式方法的这个性质被称为可容许性或可采纳性(admissibility)。
**单调性(monotonicity)**则要求更加严格。这个性质要求在向前搜索时,剩余距离的启发式评估值应该持续减小。
3.1 启发式方法
3.1.1 启发式方法的一些定义:
- 它是提高复杂问题求解效果的一种实用策略。
- 它引导程序沿着一条最可能的路径到达最终解,而忽略那些最没有希望的路径。
- 它应该能够避免去检查“死路径”,并且只使用已收集到的数据
我们可以将启发式信息以如下方式添加到搜索中。
- 决定接下来要扩展的节点,而不是严格按照广度优先或深度优先的方式进行扩展。
- 在生成节点的过程中,决定生成哪个或哪些后继节点,而不是一次性生成所有可能的后继节点。
- 确定哪些节点应该从搜索树中丢弃或裁剪
3.1.2 启发式方法的目的:
大幅度度减少到达目标状态所要考虑的节点数目,在减少必须检查的对象数目
3.1.3 较为适用的范围:
解决组合复杂度(combinatorial complexity)快速增长的问题
3.1.4 实现目的的方法:
通过知识、信息、规则、见解、类比和简化,再加上一系列其他的技术
3.1.5 启发式方法的效果:
使用启发式方法可以通过修改策略来达到一个准最优(非最优)解,同时代价得以显著降低
3.1.5 启发式方法的局限:
使用启发式信息增加了获得结果的不确定性……这是由非正式知识(规则、规律、直觉等)的使用造成的,而这些知识的有用性从未得到充分证明。因此,应在算法给出不满意的结果或不能保证给出任何结果的情况下采用启发式方法
知情搜索(第一部分)——找到任一解
3.2.1 爬山法
该搜索算法背后的概念:在爬山过程中,即使可能更接近顶部的目标节点,也可能无法从当前位置到达目标/目的地。最简单形式的爬山法是一种贪心算法。
3.2.2 最陡爬山法
**最陡爬山法(steepest-ascent hill climbing)**是简单爬山法的一个变体,它加入了上述有关决策的考虑。
相较于简单爬山法,这种方法在选择优于当前状态的第一状态时有所不同。与仅仅选择一个优于当前状态的“一步”不同,这种方法是在所有给定的可能状态集合中选择“最优”的一步(此时选择的是得分最高的一步)
1.山丘问题
爬山法是一种贪心算法,对过去和未来都没有意识,因此它可能会陷入局部最大值(local maximum),这意味着虽然最终解或目标状态似乎可达(甚至可以看到),但是并不能从当前位置到达,即使当前所在山丘的顶部是可见的。对于真实的山脉而言,虽然山顶本身(全局最大值)也可能是可见的,但是并不能从当前位置到达
解决方法:回溯到前面的节点,并尝试不同的方向。考虑那些很可能选择的路(尤其是在最陡爬山法中),如果这条路是死路,那就考虑另一条路。
2.平台问题
即状态空间中存在一个相对平坦的区域,使得相邻的状态都具有相同的值。一个较大幅度的跳跃往往才能离开这个平坦的区域。随着我们在这个区域内移动,目标函数的变化非常小。
解决方法:通过多次应用相同的规则,尝试到达搜索空间的新区域。用这种方式就可以产生新的极端的值。
3.山脊问题
在这个问题中,不管向下往哪个方向移动,山脊上的任何一点都看起来像山峰顶点,因为任何方向的移动都是向下的
解决方法:通过同时应用几个规则并在多个方向上进行搜索
3.3 最佳优先搜索
最佳优先搜索是我们讨论的第一个为到达目标而考虑探索哪些节点以及探索多少个节点的智能搜索算法。它维护着与深度优先搜索及广度优先搜索一样的开放节点及封闭节点列表。
- 开放节点:**搜索边缘(fringe)**上的节点
- 封闭节点:那些不再探索的节点
二者将构成解的基础。
在开放列表中,节点按照它们接近目标状态的启发式估计值大小进行排列。因此,每次迭代搜索时,都会考虑开放列表中最有希望的节点,从而将最佳状态放在开放列表的前端。重复状态(例如,可以通过多条路径到达的状态,但是具有不同的开销)不会被保留。相反,开销最低、最有希望以及在启发式方法下最接近重复节点的目标状态的节点则被保留。
3.4 集束搜索
概念:在集束搜索中,探索通过搜索树逐层扩展,但是每层只有最好的 W 个节点才会得到扩展,如同形成一种薄的、聚焦的“光束”,因此这种算法被称为集束搜索
集束宽度:W
特点:其将搜索树深度的指数级内存开销降低到线性开销,虽然使用广度优先搜索建立搜索树,但是搜索树的每一层被分成至多W个状态组成的切片
过程:每一层切片(宽度为 W)的数目被限制为 1。当集束搜索扩展一层时,生成当前层状态的所有后继节点,将它们按照启发值递增的顺序(从左到右)排序,并将它们切分为多个切片(每个切片最多包含 W 个状态),然后只存储第一个切片,并扩展节点。当生成目标状态或内存不足(如前所述)时,集束搜索终止。
3.5 搜索算法的其他指标
在问题有解的情况下:
如果某个搜索算法总是可以找到解,就称该搜索算法是完备的。
如果搜索空间的分支因子是有限的,那么广度优先搜索是完备的。
如果某搜索算法能从所有可能的解中返回开销最小的路径,就称该搜索算法是最优的。
- f(n):从 S 经过节点 n 到 G 的路径的精确开销,具有两个分量:g(n)和 h*(n)。
- g(n):从 S 到节点 n 的实际距离
- h*(n) :节点 n 经最短路径到达 G 的剩余距离
即f (n) = g(n) + h*(n)
对于所有的节点 n,必须有 h(n)≤h*(n)。 在这种情况下,h(n)被称为可接受的启发值(admissible heuristic)。
3.6 知情搜索(第二部分)——找到最优解
许多搜索算法都使用了对目标剩余距离的启发式估计值。现在,我们将注意力转向一个“向后看”的搜索算法集合。“向后看”是指到起始节点的距离[也就是前面提到的 g(n)],既不是整条路径的估计值,也不是其中的主要部分。通过将 g(n)包含在总的路径开销估值 f (n)中,就可以降低搜索到次优路径的可能性。
3.6.1 分支定界法
别名:统一开销搜索或统一代价搜索(uniform-cost search)
概念:该算法会按照递增的开销—更精确地说是按照非递减的开销来寻找路径的。路径开销估计方法很简单:f (n) = g(n)
分支定界法与BFS的相似之处:都首先访问最靠近起始节点的节点
分支定界法与BFS的主要区别:BFS 努力找到通往目标的某条路径,而分支定界 法努力找到一条最优路径。分支定界法的开销值可以假定为任何正实数值。
分支定界法的特点:一旦找到一条通往目标的路径,这条路径很可能就是最优的。为了确保这条找到的路径确实是最优的,分支定界法继续生成部分路径,直到每条路径的开销都大于或等于当前所找到的最优路径的开销为止
步骤:自己看书,懒得画图
NP 完全(NP-complete)问题:NP 是一类问题的缩写,如果允许猜测的话,那么这类问题可以在多项式时间内解决。
3.6.2 使用低估计启发值的分支定界法
3.6.3 采用动态规划的分支定界法
这个算法给出的建议如下:如果两条或更多的路径到达一个公共节点,那么只有到达该公 共节点且具有最小开销的路径才应该被存储(删除其他路径!)。
3.6.4 A*搜索
3.7 知情搜索(第三部分)——高级搜索算法
3.7.1 约束满足搜索
问题简化:在对更大或更复杂的问题进行求解时,可以识别出其中更小的可处理的子问题,这些子问题通过较少的步骤就可以解决。
3.7.2 与或树
目的是通过应用以下规则,在给定的树中找到解的路径:
- 如果满足以下条件,那么节点是可解的。
- 它是一个终止节点(一个基元问题)。
- 它是一个非终止节点,并且其后继节点都是可解的与(AND)节点。或者
- 它是一个非终止节点,后继节点是或(OR)节点,在这些或节点中,至少有一个可解。
- 类似地,在下列条件下,节点是不可解的。
- 它是一个没有后继节点的非终止节点(没有运算符可应用的非基元问题)。
- 它是一个非终止节点,后继节点是与(AND)节点,在这些与节点中,至少有一个不可解。或者
- 它是一个非终止节点,后继节点是或(OR)节点,并且这些或节点都是不可解的。
3.7.3 双向搜索
前面介绍的前向搜索被认为是一个开销巨大的过程,开销可能会指数级增长。双向搜索 (bidirectional search)的想法是在向前搜索目标状态的同时,从已知的目标状态向后搜索到起始状态,以找到解的路径。