A*,IDDFS 和 IDA*

发布时间 2023-10-09 15:50:09作者: wnsyou

$$\texttt{A}^*$$

\(A^*\) 搜索算法,简称 \(A^*\)(A-star),是一种在图形平面上,对于有多个节点的路径求出最低通过成本的算法,属于图的遍历+最佳优先搜索,也是 BFS 的改进。

过程

首先给出起点和终点,定义从起点开始的距离函数 \(f(x)\) 和距离终点的估价函数 \(g(x)\),那么整体的估价函数就是 \(c(x)=f(x)+g(x)\)

为了尽量让答案更优,肯定优先选择 \(c(x)\) 最小的元素,这个明显可以用优先队列维护,每次取出队头,然后更新相邻元素状态。

整体来看,\(A^*\) 属于 BFS 的改良版且改良之后形态类似 dijkstra。

$$\texttt{IDDFS}$$

迭代加深搜索 IDDFS,是一种每次限制搜索深度的 DFS,本质还是深搜,但每次搜索前首先规定一个最大深度 \(d\),搜索时深度不能超过 \(d\),一般用于寻找最优解。如果在当前深度下没有找到答案就将 \(d\)\(1\),继续搜索。

对比

同是找最优解,为啥不用 BFS 呢?

因为 BFS 需要使用队列,而队列复杂度不低,空间消耗也会比较大,当状态数多了之后 BFS 的劣势也就显出来了。

迭代加深搜索本质为深搜,空间耗费相对较小,而且当搜索树分叉较多时,每增加一次深度搜索的复杂度都会出现指数级增长,那么重复搜索所带来的消耗几乎可以不记,所以它时间复杂度是可以近似看成 BFS 的。

过程

初始时规定一个深度 \(d\)(设为一个极小值),每次搜索的深度不能超过 \(d\),超过了就返回。

在当前深度内寻找目标状态,如果找到了就回溯,退出外层的深度规定;否则将 \(d\) 加一,继续找。


srds,在大部分题目里 BFS 还是方便些的,因为它很容易判重。

但如果空间比较极限,再加上找最优解的话,还是可以考虑使用 IDDFS 的。

$$\texttt{IDA}^*$$

顾名思义,\(IDA^*\) 就是迭代加深搜索+\(A^*\),通过限制深度来减少一定情况下的复杂度,优点:

  • 不需要判重,不需要排序,利于深度剪枝。
  • 空间需求减少:每个深度下实际上是一个深度优先搜索,不过深度有限制,使用 DFS 可以减小空间消耗。

缺点:

  • 重复搜索了一部分。