depth-first-search - 关于广度优先完整性与深度优先不完整性的问题

标签 depth-first-search breadth-first-search

根据 AIMA(人工智能:现代方法)中的 Norvig 的说法,深度优先算法并不完整(不会总是产生解决方案),因为在某些情况下,下降的子树将是无限的。

另一方面,如果分支因子不是无限的,则广度优先方法被认为是完整的。但这不是与 DFS 中子树无限的情况有些相同的“事物”吗?

如果树的深度是有限的,就不能说 DFS 是完整的吗?那么 BFS 是完整的而 DFS 不是完整的,因为 BFS 的完整性依赖于分支因子是有限的!

最佳答案

一棵树可以是无限的,而没有无限的分支因子。例如,考虑魔方的状态树。给定立方体的配置,移动的次数是有限的(我相信是 18 次,因为一次移动包括选择 9 个“平面”中的一个并将其旋转到两个可能的方向之一)。然而,树是无限深的,因为它完全有可能例如只来回交替旋转同一平面(永远不会有任何进展)。为了防止 DFS 这样做,通常会缓存所有访问过的状态(有效地修剪状态树)——您可能知道。但是,如果状态空间太大(或实际上无限大),这将无济于事。

我没有广泛研究人工智能,但我认为说 BFS 是完整的而 DFS 不是(毕竟,完整性只是一个在某处定义的术语)的基本原理是无限深的树比无限深的树更频繁地出现分支因子(因为具有无限分支因子意味着您有无限多的选择,我认为这并不常见 - 游戏和模拟通常是离散的)。即使对于有限树,BFS 通常会表现得更好,因为 DFS 很可能从错误的路径开始,在到达目标之前探索树的大部分。尽管如此,正如您所指出的,在有限树中,如果存在,DFS 最终会找到解决方案。

关于depth-first-search - 关于广度优先完整性与深度优先不完整性的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5067904/

相关文章:

python - DFS遍历有什么问题?

c++ - 将 boost::depth_first_search 与访客一起使用

c++ - 迭代 DFS 与递归 DFS 和不同的元素顺序

python - 将社区结构(列表)转换为邻接表

java - 俄罗斯方 block AI - 理解广度优先搜索的问题

java - 通过 HashSet 与链接哈希集进行迭代

graph-algorithm - BFS为什么要求最短路径?

java - 我如何使用深度优先搜索来解决这个难题?

tree - 树边缘和前边缘之间的区别

Python深度优先搜索与字典