迭代深化与深度优先搜索

Posted

技术标签:

【中文标题】迭代深化与深度优先搜索【英文标题】:Iterative deepening vs depth-first search 【发布时间】:2011-11-15 19:06:07 【问题描述】:

我一直在阅读有关迭代深化的文章,但我不明白它与深度优先搜索有何不同。

我知道深度优先搜索会越来越深入。

在迭代深化中,您建立一个级别的值,如果在该级别没有解决方案,则增加该值,然后从头开始(根)。

这和深度优先搜索不一样吗?

我的意思是你会不断增加和增加,更深入,直到找到解决方案。我认为这是同一件事!我会走同样的分支,因为如果我从头开始,我会像以前一样走同样的分支。

【问题讨论】:

在深度优先搜索中,您会完全探索您输入的每个分支,然后再从它回溯并转到下一个分支。在迭代深化中,您不会低于当前深度,因此在回溯之前不要完全探索您访问的每个分支。 【参考方案1】:

在深度优先搜索中,您从图表中的某个节点开始,不断深入地探索图表,同时您可以找到尚未到达的新节点(或直到找到解决方案)。每当 DFS 用完移动时,它就会回溯到可以做出不同选择的最新点,然后从那里开始探索。如果您的图非常大并且只有一个解决方案,这可能是一个严重的问题,因为您最终可能会沿着一条 DFS 路径探索整个图,只是在查看每个节点后才找到解决方案。更糟糕的是,如果图是无限的(例如,您的图可能包含所有数字),搜索可能不会终止。此外,一旦找到要查找的节点,您可能没有最佳路径(即使它就在起始节点旁边,您也可能在整个图上循环寻找解决方案!)

解决此问题的一个潜在方法是限制 DFS 采用的任何一条路径的深度。例如,我们可能会进行 DFS 搜索,但如果我们采用长度大于 5 的路径,则停止搜索。这确保我们永远不会探索距离起始节点大于 5 的任何节点,这意味着我们永远不会探索无限或(除非图形非常密集)我们不搜索整个图形。但是,这确实意味着我们可能找不到我们正在寻找的节点,因为我们不一定要探索整个图。

迭代深化背后的想法是使用第二种方法,但要不断增加每个级别的深度。换句话说,我们可能会尝试使用所有长度为 1 的路径进行探索,然后使用所有长度为 2 的路径,然后是长度为 3 的路径,等等,直到我们最终找到有问题的节点。这意味着我们永远不会沿着无限的死胡同探索,因为每条路径的长度在每一步都有一定的长度。这也意味着我们找到了到目标节点的最短路径,因为如果我们在深度 d 处没有找到节点,但在深度 d + 1 处找到了它,就不可能有长度为 d 的路径(或者我们会采取它),所以长度为 d + 1 的路径确实是最优的。

这与 DFS 不同的原因在于,它永远不会遇到这样的情况:在图上绕​​着非常长且迂回的路径而不会终止。路径的长度总是有上限的,所以我们永远不会探索不必要的分支。

这与 BFS 不同的原因在于,在 BFS 中,您必须一次将所有边缘节点保存在内存中。这需要内存 O(bd),其中 b 是分支因子。将此与迭代深化的 O(d) 内存使用情况进行比较(以保持当前路径中每个 d 节点的状态)。当然,BFS 永远不会多次探索同一条路径,而迭代深化可能会多次探索任何路径,因为它会增加深度限制。但是,渐近地两者具有相同的运行时间。在考虑距离 d 处的所有 O(bd) 个节点后,BFS 以 O(bd) 个步骤终止。迭代深化每个级别使用 O(bd) 时间,总和为 O(bd),但常数因子更高。

简而言之:

DFS 不能保证找到最佳路径;迭代深化是。 DFS 可能会在找到目标节点之前探索整个图;仅当开始节点和结束节点之间的距离是图中的最大值时,迭代加深才会这样做。 BFS 和迭代深化都在 O(bd) 时间内运行,但迭代深化可能具有更高的常数因子。 BFS 使用 O(bd) 内存,而迭代深化仅使用 O(d)。

希望这会有所帮助!

【讨论】:

谢谢!我错过了迭代深化会考虑所有长度为 x 的路径的概念。 一个小点是,即使 IDDFS 做了更多的节点扩展,它甚至可能比 BFS 更快,因为使用更少的内存意味着更好的局部性和缓存一致性。 感谢您的详细回答。但是,如果与每条路径相关的成本相同,迭代深化不会是最优的。因此当成本不同时不是最优的?在那种情况下,是否存在与迭代深化相关的始终最优的算法?例如,对于 BFS,我们有统一的成本搜索。 @NicolásCarlo- 没错;迭代深化确实假设了统一的成本。当边缘有权重时,可以使用IDA*(迭代加深A*)。 @user2023370 好收获!固定。【参考方案2】:

wikipedia 上有一个关于此的不错的页面。

我认为您错过的基本想法是迭代深化主要是一种启发式。当可能在接近根的地方找到解决方案时,迭代深化会相对较快地找到它,而直接的深度优先搜索可能会做出“错误”的决定,并在没有结果的深层分支上花费大量时间。

(当搜索树可以是无限的时,这一点尤其重要。在这种情况下,它们的等价性更低,因为 DFS 可能会永远卡住,而 BFS 或迭代深化总有一天会找到答案如果存在)

【讨论】:

【参考方案3】:

只是在已有内容的基础上进行补充,但这里有一些来自丹佛大学移动 AI 实验室的视频,展示了这些差异。

http://movingai.com/dfid.html

您可以在他们的示例中看到,当目标较浅(解决方案深度 3,树深度)且解决方案位于右侧时,迭代深化获胜,但无论解决方案位于最后一行,DFS 都会获胜。

我阅读了有关国际象棋编程的文章,接下来我正在考虑quiescence search,如果您想了解更多有关 AI 编程搜索策略的信息,请查看。

【讨论】:

以上是关于迭代深化与深度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

迭代加深搜索[codevs1004 四子连棋]

深度优先搜索:错误的迭代 DFS 结果顺序

没初看上去那么慢的迭代加深(Iterative Deepening)搜索

深度优先搜索法自己的理解

数据结构与算法图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )

深度优先搜索小结