第8章盲目搜索第二部分状态空间搜索用公式表示状态空间首先,如何用公式来表示这些搜索问题;第二,必须找到隐式表示大的搜索图的方法;第三,需要用高效的算法来对这些大图进行搜索。有很多实际问题,其状态的搜索空间很大(甚至无穷大),对于这样的情况,我们面临:一个典型的例子是15数码问题,它由放在一个4×4的方阵中的15个数码构成,其中的一个单元是空的,它的周边单元中的数码可以移到该单元中。此问题的任务是找到一个数码移动序列使初始的无序数码转变为一些特殊的排列。8数码问题是一个简化版本,在一个3×3的方阵图中有8个数码。假定该问题的目标是把数码从开始状态移动到目标状态,如图所示。示例问题:2831647512384765一个给定的开始状态和一组可能的移动隐式地定义了从开始状态可到达的一个状态图。在8数码表示的状态空间中节点数是9!=362880个(8数码状态空间刚好可以分成两个独立的图;一个图中的数码不能从其他图中的状态到达)。在8数码问题中,我们可以想象有8x4个不同的移动,它们是:1上移、l下移、1左移、1右移、2上移、……,等等(当然在一个给定的状态中,并不是所有的这些移动都是可能的)。一个更精练的公式只有4个移动,即:空格左移、空格上移、空格右移和空格下移。隐式状态空间图的组成从开始状态可以到达的状态空间图部分是通过开始状态描述和可能在任何状态下采用的动作结果描述来隐式表示的。因此,从理论上讲,可以把一个图的隐式表示转换为显式表示。为此,可以产生开始节点的所有后继节点(通过那个节点应用所有可能的算子),然后再生成所有后继节点的所有后继节点,等等。有三个基本部分参与表示隐式状态空间图:1)一个标识开始节点的描述。这个描述是对环境初始状态建模的一些数据结构。2)把代表环境状态的状态描述转换成代表执行动作后状态描述的转换函数。这些函数也常被叫做算子。在agent问题中,它们是动作结果的模型。当一个算子应用到一个节点时,它产生该节点的一个后继节点。3)目标状态,可以是状态描述中的一个真假值函数,或者是和目标状态一致的状态描述的真实实例列表。我们将学习两类主要的搜索过程。其中之一,我们没有指定问题的任何推理信息,例如要搜索这一部分而不是另一部分,就像到目前为止的只要发现一条到目标的路径即可。这种过程被称为是盲目的。另一种,我们指定了要解决问题的信息以帮助集中搜索。这个过程叫启发式(heuristic)搜索。广度优先搜索由于广度优先搜索每一步将所有可能的算子应用到一个节点,因此可把它们组成一个叫后继函数(successorfunction)的函数。当把后继函数应用到一个节点时,产生一个节点集,该节点集就是把所有能应用到那个节点的算子应用到该节点而产生的。一个节点的后继函数的每一次应用称为节点的扩展(expanding)。广度优先搜索的一个特征是:当发现目标节点时,我们已经找到了到达目标的一条最短路径。然而广度优先搜索的一个缺点是它要求产生和存储一个大小是最浅目标节点深度的指数的树。相同代价搜索(uniform-costsearch)是广度优先搜索的一种变体,在该方法中,节点从开始节点顺着代价等高点向外扩展,而不是顺着相同深度等高线。如果图中所有弧的代价相同(比如说等于1),那么相同代价搜索就和广度优先搜索一致。反过来,相同代价搜索可以看作是下一章要讲的启发式搜索的一个特殊情况。广度优先和相同代价搜索方法的简要描述只给出了它们的主要思想,但是要解决其他复杂的情况则需要技术改进。比如一个节点扩展产生的节点在前面的搜索过程中已经到达过。将在下一章介绍了更一般的算法后再讨论这些方法。深度优先搜索一次对节点应用一个算子以产生该节点的一个后继。每一个节点都留下一个标记,用来指示如果需要时所必需的附加算子。对每一个节点,必须有一个决策来决定哪个算子先用,哪个次之等等。只要一个后继产生,它的下一个后继就会被生成,一直向下传下去,等等。为了防止从开始节点的搜索过程深度太深,需要一个深度约束(depthbound)。超过这个深度约束时不再产生后继(假定没有任何目标节点超过这个深度约束)。这种限制允许我们忽略搜索图的一部分,这些部分已经确定不能高效地到达目标节点。深度优先或回溯搜索深度优先算法使我们只保存搜索树的一部分,它由当前正在搜索的路径和指示该路径上还没有完全展开的节点标志构成。因此,深度优先搜索的存储器要求是深度约束的线性函数。深度优先搜索的一个缺点是当发现目标时,我们不能保证找到的路径是最短长度。另一个缺点是如果只有一个很浅的目标,且该目标位于搜索过程的后部时,也必须浏览大部分搜索空间。迭代加深一种叫做迭代加深(iterativedeepening)的技术既能满足深度优先搜索的线性存储要求,同时又能保证发现一个最小深度的目标节点(如果一个目标节点能被发现)。在迭代加深方法中,连续的深度优先搜索被引入,每一个的深度约束逐次加1,直到一个目标节点被发现。令人惊奇的是,由迭代加深搜索扩展产生的节点数并不比广度优先搜索产生的多很多。我们可以计算一个有相同分枝因子的树在最坏搜索情况下所生产的分点数,这个树的最浅目标节点在深度d处,并且是该深度最后一个生产的节点。由广度优先搜索扩展产生的节点数是:11112bbbbbNddbf为了计算由迭代加深扩展来的节点数,我们首先指出,由一个完全的深度优先搜索到第j级而扩展成的节点数是:111bbNjdfj在最坏的情况下,对深度为d的目标进行迭代加深搜索时必须实施分裂,完全的深度优先搜索直到深度为d。由所有这些搜索扩展而来的节点数之和是:djjidbbN011122)1(12bdbdbbNdid简化上式可得到:对大的d而言,Nid/Nbf的比率是b/(b—1)。对一个分枝因子为10的深度目标,迭代加深搜索只比广度优先搜索多了大约11%的扩展节点。