我正在尝试将广度优先搜索和迭代加深搜索结合起来。这种方法在人工智能书籍《AI – A Modern Approach》的第3章(第90页)中有所提及。基本思路是从初始状态开始,运行广度优先搜索,直到达到某个常数内存限制mB,然后对边界上的每个节点进行迭代加深搜索。
这种搜索算法是合理的吗?是完整的吗?是最优的吗?
回答:
广度优先搜索本身是合理的、完整的和最优的。因此,对于任何在达到内存限制之前就能找到解决方案的问题,都不会有问题。我们只需要考虑在找到解决方案之前达到内存限制的情况,例如,你将开始对边界上的节点运行IDS的情况:
合理吗?
是的,IDS永远不会返回不正确的结果。
完整吗?
这取决于你如何实现“对边界上的每个节点进行IDS”。
如果你首先对边界上的第一个节点进行完整的IDS,然后对第二个节点进行完整的IDS,依此类推,它将不会是完整的。考虑这样一种情况:在你边界上的第一个节点下有一个无限大的搜索空间,而这个空间不包含解决方案。如果你试图首先对该节点运行“完整”的IDS,它将永远不会终止。
但是,如果你以不同的方式在边界上的节点之间分配你的IDS进程,它可以是完整的。例如,如果你首先对边界上的所有节点进行深度为1的DFS,然后对边界上的所有节点进行深度为2的DFS,依此类推,该算法将是完整的。
最优吗?
这里的考虑与完整性相同。如果你完成对边界上第一个节点的完整IDS,然后再转向第二个节点,你可能已经在边界上的第一个节点下找到了一个次优解,因此该算法将是次优的。
如果你完成对边界上所有节点的深度限制为1的DFS进程,然后再转向任何节点的深度限制为2的DFS进程,并完成所有这些,然后再转向深度限制为3的DFS,依此类推,该算法将是最优的。