前置知识:A* 算法迭代加深搜索

本页面将简要介绍 IDA* 算法。IDA* 就是采用了迭代加深算法的 A* 算法。

过程

IDA* 算法是迭代加深搜索的一种变形。迭代加深搜索在每次 DFS 中限制搜索深度,而 IDA* 则限制单次 DFS 的路径成本。

在一次迭代中,算法从起点 开始进行 DFS,记录到达当前结点 的实际成本 ,并利用它到终点的最小成本估计 进行剪枝。如果沿着当前路径到达终点的总成本估计

超过阈值 ,则停止对该分支的搜索。

阈值 在迭代间动态更新。初始阈值取为起点的总成本估计值 。在一次迭代中,每当因超过阈值而停止时,就记录所有尚未访问的后继结点的总成本估计的最小值。迭代结束后,将阈值更新为这一最小值,继续下一轮搜索。

性质

由于使用了和 A* 算法一样的剪枝策略,所以对 A* 算法性质的讨论对 IDA* 算法也适用。

和 A* 算法相比,IDA* 算法有如下优点:

  • 不需要判重,不需要排序,利于深度剪枝。
  • 空间需求减少。每次迭代都是一个深度优先搜索,但是对搜索中的路径成本有限制,使用 DFS 可以减小空间消耗。

同时,它也有缺点:

  • 重复搜索。即使前后两次搜索相差微小,每次放宽限制都要再次从头搜索。

实现

是一个合适的估价函数, 为搜索起点。完整的算法流程大致如下所示:

例题

在古埃及,人们使用互不相同的单位分数(即 )的和表示一切有理数。例如,,但不允许 ,因为在加数中不允许有相同的单位分数。

对于一个分数 ,表示方法有很多种。规定:同一个分数的不同表示方法中,加数少的比加数多的好;如果加数个数相同,则最小的分数越大越好。例如, 是最佳方案。

输入整数 ),试编程计算最佳表达式。

习题