我一直在阅读迭代深化,但我不明白它与深度优先搜索的区别。
我知道深度优先搜索越来越深入。
在迭代深化中,您建立一个级别的值,如果该级别没有解决方案,则递增该值,然后从头开始(根)。
这不会与深度优先搜索相同吗?
我的意思是你会继续递增和递增,直到找到解决方案。我认为这是同样的事情!我会走同一个分支,因为如果我从头开始,我会像以前一样走下同一个分支。
答案 0 :(得分:78)
在深度优先搜索中,您从图表中的某个节点开始,不断深入探索图表,同时找到尚未到达的新节点(或直到找到解决方案)。每当DFS耗尽动作时,它就会回溯到可以做出不同选择的最新点,然后从那里进行探索。如果您的图形非常大并且只有一个解决方案,这可能是一个严重的问题,因为您可能最终沿着一个DFS路径探索整个图形,只能在查看每个节点后找到解决方案。更糟糕的是,如果图形是无限的(例如,您的图形可能包含所有数字),搜索可能不会终止。此外,一旦找到了您正在寻找的节点,您可能没有最佳路径(您可以在整个图表中循环寻找解决方案,即使它恰好位于起始节点旁边!)
解决此问题的一个可能方法是限制DFS采用的任何一条路径的深度。例如,我们可能会进行DFS搜索,但如果我们采用长度大于5的路径,则停止搜索。这可以确保我们永远不会从起始节点探索任何距离大于5的节点,这意味着我们永远不会探索无限地或(除非图形非常密集)我们不搜索整个图形。但是,这确实意味着我们可能找不到我们正在寻找的节点,因为我们不一定会探索整个图。
迭代深化背后的想法是使用第二种方法,但要不断增加每个级别的深度。换句话说,我们可能尝试使用长度为1的所有路径,然后是长度为2的所有路径,然后是长度为3的路径等,直到我们找到所讨论的节点为止。这意味着我们永远不会沿着无限的死端路径探索,因为每个路径的长度在每一步都有一定长度。这也意味着我们找到了到达目标节点的最短路径,因为如果我们没有在深度d找到节点但是确实在深度d + 1找到它,那么就不会有长度为d的路径(或者我们我会采取它,所以长度d + 1的路径确实是最佳的。
这与DFS的不同之处在于,它永远不会遇到图形周围需要非常长且迂回的路径而不会终止的情况。路径的长度总是有限,所以我们永远不会最终探索不必要的分支。
这与BFS的不同之处在于,在BFS中,您必须同时将所有边缘节点保存在内存中。这需要存储器O(b d ),其中b是分支因子。将其与迭代加深中的O(d)内存使用情况进行比较(以保持当前路径中每个d节点的状态)。当然,BFS从不会多次探索相同的路径,而迭代加深可能会多次探索任何路径,因为它会增加深度限制。但是,渐近地,两者具有相同的运行时。在考虑距离d处的所有O(b d )节点之后,BFS在O(b d )步骤中终止。迭代加深使用每个级别的O(b d )时间,总计为O(b d ),但具有更高的常数因子。
简而言之:
希望这有帮助!
答案 1 :(得分:2)
wikipedia就此有一个不错的页面。
我认为你错过的基本思想是迭代加深主要是启发式。当一个解决方案可能被发现接近根时,迭代加深会发现它相对较快,而直接深度优先搜索可能会做出“错误”的决定并花费大量时间在一个没有结果的深分支上。
(当搜索树可以无限时,这一点尤其重要。在这种情况下,它们甚至更不等同,因为DFS可以永远卡住,而BFS或迭代加深肯定会在某一天找到答案如果它存在)
答案 2 :(得分:1)
只是添加到已经存在的内容,但这里有来自丹佛大学移动人工智能实验室的一些视频,显示了差异。
你可以在他们的例子中看到当目标很浅时(解决方案深度3,树深度)并且解决方案在右边时迭代加深胜利,但无论解决方案是在最后一行,DFS都会获胜。
我进入了关于国际象棋编程的阅读,接下来我正在考虑quiescence search如果你想了解更多关于人工智能编程的搜索策略的话。