搜索的形式化结构:状态空间、动作、初始状态、目标、启发式方法、解
搜索的重要特征:完备性、最优性、时间复杂度、空间复杂度
盲目搜索
特点:
- 采用固定的规则来选择下一个的状态
- 不会随着要搜索解决的问题的变化而变化
- 不考虑任何与要解决的问题领域相关的信息
宽度优先:把新扩展的后继状态放在边界的最后。在状态树中按照层数依次遍历每个状态。
- 具有完备性和最优性
- 时空复杂度 $O(\text{next state}^{\text{depth} + 1})$
- 空间需求是瓶颈
深度优先:把新扩展的后继状态放在边界的最前面。
- 不具备完备性(例如存在无限的路径),不具备最优性(最先发现的不一定最优)
- 时间复杂度 $O(\text{next state}^{\text{depth}})$,空间复杂度 $O(\text{next state}·\text{depth})$
- 通常比宽度优先更快地找到可行解
一致代价:维护边界中的路径按照成本升序排列,每次拓展成本最低的路径。
- 当每个动作的成本一样时,等同于宽度优先。
- 具备完备性(在有限时间内能找到最短路径)、具备最优性(最先发现的一定最优)
- 时空复杂度 $O(\text{next state}^{\text{depth} + 1})$
深度受限:预先限制搜索的深度 $L$,在深度优先的过程中始终保持深度 $\le L$
- 避免了路径无限的问题
- 只有解路径长度 $\le L$ 时才能找到解
- 不具备完备性(例如存在无限的路径),不具备最优性(最先发现的不一定最优)
- 时间复杂度 $O(\text{next state}^{L})$,空间复杂度 $O(\text{next state}·L)$
迭代加深:预先限制 $L = 0$,每次迭代地增加深度限制,对于每个深度限制进行深度受限搜索,直到找到解时停止增加深度限制。
- 具有完备性和最优性
- 时间复杂度 $O(\text{next state}^{\text{depth}})$,空间复杂度 $O(\text{next state}·\text{depth})$
- 比宽度优先的空间小,相比深度优先具有完备性和最优性
双向搜索:同时从初始状态向前与目标状态向后进行搜索,直至状态在中间相遇
- 具有完备性、最优性(每个动作成本一致的前提下)
- 时空复杂度均为 $O(\text{next state}^{\text{depth} / 2})$
- 不适用于向后搜索具有很大难度或者代价很高的问题
Conclusion:


路径检测:每次执行动作的时候,检测拓展的节点和祖先节点均不相等时才扩展,不能出现重复节点。
环检测:每次执行动作的时候,检测拓展的节点和之前扩展的所有节点均不相等时才扩展,不能出现重复节点。
- 对于一致代价搜索,使用环检测仍能找到最优解。因为如果动作代价都是非负的,那么对于同一节点,后搜索到的路径代价一定比先搜索到的路径代价小。
- 对于启发式搜索,使用环检测不一定能找到最优解,因为会受到估价函数的印象,对于同一节点,不一定最先找到的路径一定是最优的。
启发式搜索
启发式搜索:
- 构造一个启发式函数 $h(n)$,用于估计节点 $n$ 到目标节点的成本。
- 启发式函数随着问题的不同而不同。
启发式函数的例子:直线距离、曼哈顿距离、逆序对数量、错位数量
贪心最好优先搜索:使用启发式函数对边界上的节点进行排序
- 忽略了初始状态到节点 $n$ 的成本,可能错误进入实际成本很高但 $h(n)$ 很小的节点
- 不具有完备性,不具有最优性
评价函数:对边界上的节点进行排序的指标 $f(n)$,用于决策下一个扩展的节点。
- 对于贪心最好优先搜索,$f(n) = h(n)$.
A 搜索:将评价函数改为 $f(n) = g(n) + h(n)$,其中 $g(n)$ 是当前路径的代价,$h(n)$ 是启发式函数,每次扩展评价函数最小的节点。
- 同时考虑了历史代价与未来可能的代价
- 如果对于 $h(n)$ 的估计不符实际,或者太大而使得 $g(n)$ 无关紧要,那么将会使得 A 搜索退化为贪心最好优先搜索
- 不具有完备性和最优性,关键在于设计 $h(n)$.
可采纳启发函数:对于启发函数的估计 $h(n)$,必须不能超过实际的从节点到目标的实际代价 $h^*(n)$,即 $h(n) \le h^*(n)$,我们称这样的启发函数是可采纳的。
- 采用可采纳启发函数的 A 算法是 $\mathbf{A^*}$ 算法。
迭代加深 $\mathbf{A^*}$ 搜索($\mathbf{IDA^*}$):类似于迭代加深,但是用 $f(n)$ 来划定搜索的界限,每次划定的界限单调上升。
- 时间复杂度 $O(\text{next state}^{\text{depth} + 1})$,空间复杂度 $O(\text{next state} · \text{depth})$
- 解决 $A^*$ 算法空间复杂度过大的问题
- 当启发函数是可采纳的时候,该算法满足最优性。
启发式函数的性质
可采纳启发函数:对于启发函数的估计 $h(n)$,必须不能超过实际的从节点到目标的实际代价 $h^*(n)$,即 $h(n) \le h^*(n)$,我们称这样的启发函数是可采纳的。
- 如果 $h(n) < h^*(n)$,那么可能会扩展更多的节点,使得搜索速度变慢,但是不会错过最优解。
- 如果 $h(n) > h^*(n)$,那么将会使得搜索算法出现误导即跳过了最优点,不能保证总能找到最优解。
- 当 $h(n) = 0$ 或 $h(n) \ll g(n)$,则算法退化为一致代价搜索 $f(n) = g(n)$。
- 当 $h(n) \to \infty$ 或 $h(n) \gg g(n)$,则算法退化为贪婪最佳优先搜索 $f(n) = h(n)$。
- 时空复杂度 $O(\text{next state}^{\text{depth} + 1})$
- 使用可采纳性启发函数的 A 算法($A^*$ 算法)一定满足最优性,因为最优解一定在所有成本大于 $C^*$ 的路径之前被拓展到,并且成本 $\le C^*$ 的数量是有限的。
一致性/单调性启发函数:对于启发函数 $h(n)$。如果任意两节点 $n_1, n_2$,均有 $h(n_1) \le c(n_1 \to n_2) + h(n_2)$,其中 $c(n_1 \to n_2)$ 指的是从 $n_1$ 到 $n_2$ 的真实最短路代价,那么我们称 $h(n)$ 具有一致性/单调性。
- 满足一致性的启发函数一定也满足可采纳性:$$h(n_k) = 0,, h(n_{i - 1}) \le c(n_{i - 1} \to n_i) + h(n_i) \le c(n_{i - 1} \to n_i) + h^*(n_i) = h^*(n_{i - 1})$$
- 大部分 可采纳的启发式函数也满足一致性
- 典型例子:路网最短路下采用直线距离为估价函数
- 环检测的影响:只有具备单调性的启发函数,在进行环检测后仍能保持最优性
构造启发式函数的方法是,建立一个 松弛问题:通过考虑一个比原问题的条件更宽松的问题,将 $h(n)$ 设置为简单问题中到达目标的成本。
- 定理:松弛问题中的成本是原问题的 可采纳 的启发式函数值。
- 证明:原问题的可行解集一定是松弛问题的可行解集的子集,所以松弛问题的最优解一定比原问题的最优解代价更小。
启发式函数的支配:对于同一问题的两个 可采纳 的启发式函数 $h_1(n) ,, h_2(n)$,如果 $\forall n ,, h_1(n) \le h_2(n)$,那么我们称 $h_2(n)$ 支配了 $h_1(n)$(或者称 $h_2$ 比 $h_1$ 拥有更多的信息)
- 定理:若 $h_2(n)$ 支配了 $h_1(n)$,那么在 $A^*$ 算法中,$h_2$ 扩展到的节点,$h_1$ 也会扩展到