盲目搜索

我们将学习两类主要的搜索过程。其中之一,我们没有指定问题的任何推理信息,例如要搜索这一部分而不是另一部分,就像到目前为止的只要发现一条到目标的路径即可。这种搜索是盲目的。另一种,我们指定了要解决问题的信息以帮助集中搜索。这个过程叫启发式搜索。本章讨论盲目搜索,下一章再讨论启发式搜索过程。

用公示表示状态空间

很多实际问题的搜索空间是非常大的,以至于他们不能通过显示图来表示。这里我们关心下面几个问题:

  • 如何用公式来表示这些搜索问题。

  • 找到隐式来表示大的搜索图的方法。

  • 我么需要用高效的算法来对这些大图进行搜索。

除了agent堆积木问题外,数码问题也常被用来演示如何在状态空间中生成动作序列。考虑到多样化,在本章和下一章用到这个问题。一个典型的例子是8数码问题,在一个3*3的方阵中有8个数码。假定该问题的目标是把数码从初始状态移动到目标状态,如下图所示。

一般来讲,我们在构造一个问题的状态空间时我们有一些代表性的选择。在8数码问题中,我们可以想象有8*4个不同的移动,分别是:1上移,1下移,1左移,1右移,2上移,2下移,2左移,2右移……,等等。一个更精炼的公式只有4个移动,即:空格上移,空格下移,空格左移,空格右移。一个给定的开始状态和一组可能的移动隐式的定义了从开始状态可到达的的一个状态图。在8数码问题表示的状态空间中节点数是9!=362880个。

隐式状态空间图的组成

从理论上来讲,可以把一个图的隐式表示转换成显示表示,为此可以产生开始节点的所有后继节点(通过那个节点应用所有算子),然后在省城所有后继节点的所有后继节点,等等。

有三个基本部分参与表示隐式状态空间图:

  • 一个标识开始节点的描述。这个描述是对环境初始状态建模的一些数据结构。

  • 把代表环境状态的状态描述转换为代表动作后状态描述的转换函数。这些函数也常被叫做算子。在agent问题中,它们使动作结果的模型。当一个算子应用到一个节点时,他产生该节点的一个后继节点。

  • 目标状态,可以是状态描述中的一个真假值函数,或者是和目标状态一致的状态描述的真实实例列表。

广度优先搜索

最简单的盲目搜索过程就是广度优先搜索(breadth-first search)。该过程把所有的算子应用到开始节点以产生一个显示的状态空间图,再把所有可能的算子应用到开始节点的所有直接后继,再到后继的后继,等等。搜索过程一律从开始节点向外扩展。把所有可能的算子称为后继函数。当把后继函数应用到一个节点时,产生一个节点集。一个后继函数的每一次应用称为节点的扩展。

上图显示了8数码问题经广度优先搜索所产生的节点集。标出开始和目标节点,在扩展一个节点时,按空格左上右下的顺序应用算子。尽管每个移动都是可逆的,但删去了从后继到双亲的弧。如我们所看到的,广度优先搜索的的特征是:当发现目标节点时,我们已经找到了到达目标的一条最短路径,然而它的一个缺点是要求产生和储存一个大小是最浅目标节点深度的指数的数。

深度优先或回溯搜索

深度优先搜索一次对节点应用一个算子以产生该节点的一个后继。每个节点都留下一个标记,用来指示如果需要时所必需的的附加算子。对每一个节点,必须有一个决策来决定哪个算子先用,哪个次之等等。只要一个后继产生,它的下一个后继就会被生成,一直传下去,等等。为了防止从开始节点的搜索过程深度太深,需要一个深度约束(depth bound)。超过这个深度约束时不再产生后继(假定没有任何目标节点超过这个约束深度)。这种限制允许我们忽略搜索图的一部分,这些部分已经确定不能高效的到达目标节点。

 

深度优先算法使我们只保存搜索树的一部分,它由当前正在搜索的路径和指示该路径上还没有完全展开的节点标志构成。因此,深度优先搜索的存储器要求是深度约束的线性函数。深度优先搜索的一个缺点是当发现目标时,我们不能保证找到的路径是最短路径。另一个缺点是如果只有一个很浅的目标,且该目标位于搜索过程的后部时,也必须浏览大部分搜索空间。

迭代加深

一种叫做迭代加深的技术既能满足深度优先搜索的线性存储要求,同时又能保证发现一个最小深度的目标节点。在迭代加深方法中,连续的深度优先搜索被引入,每一个深度约束逐次加1,知道一个目标节点被发现。下图说明迭代加深是如何在一个简单树上工作的。

由迭代加深搜索扩展产生的节点数并不比广度优先搜索产生的多很多。我们可以计算一个有相同分支的数在最坏情况下产生的节点数,这个树的最浅目标在深度d处,并且是该深度最后一个生产的节点。有广度优先搜索扩展产生的节点数是:

 

版权声明:本文为Cccccz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Cccccz/p/11156000.html