DFS 如何通过非循环状态空间中的不同路径多次扩展同一个状态?

人工智能 搜索 状态空间 诺维格罗素 深度优先搜索 状态空间搜索
2021-11-16 21:29:28

我正在阅读Stuart Russell 和 Peter Norvig的《人工智能:一种现代方法》(第 4 版)一书,遇到了关于深度优先搜索的这句话(第 79 页,第 12 行):

对于非循环状态空间,它最终可能会通过不同的路径多次扩展相同的状态,但会(最终)系统地探索整个空间。

我的问题是:这怎么可能?你能告诉我一些例子吗?

1个回答

首先,请注意要扩展的动词在这种情况下具有特定含义:当您扩展节点/状态时s, 你尝试每一个动作一个1,,一个n可从s,以及这些动作中的每一个一个一世导致另一个状态。

其次,如果图是DAG,那么边有方向,没有圈;所以,如果你沿着边缘走,你将永远不会回到你已经在的节点。但是,这不足以理解该陈述以及为什么或何时为真。

第三,仅当您使用深度优先搜索的树搜索版本时,该陈述才是正确的,即您不跟踪您已经探索过的节点。换句话说,您不使用graph search,它是一种树搜索,但它会跟踪一个名为explored set(或closed list)的集合中已经展开的节点,以避免再次展开它们。所以,在这里,如果你探索了一个节点/状态s,您已将其添加到explored set,因此您不会再次扩展它。

那么,为什么在 DFS 的树搜索版本中可以多次展开一个节点呢?好吧,你没有跟踪你已经扩展的节点,所以如果你从另一个路径再次遇到它,你可能会再次扩展它。鉴于它是一个 DAG(并假设它是有限的),那么您最终将尝试所有可能的路径,因此您会找到目标。

现在,这是一个在 DFS 的树搜索版本中多次展开节点的示例。

假设我们有这个搜索空间,你从哪里开始一个目标是.

A -> B -> C -> D
A -> C -> D  
A -> E

如果节点的深度相同,假设您按字母顺序展开它们;所以,在上面的搜索空间,你先展开接着C, 因为来之前C(在英文字母表中)。

现在,注意我们可以直接去C一个或者我们可以去C首先去.C有一个孩子。当你展开C,基本上,您尝试从C. 在这种情况下,只有一个动作,即去D.

所以,在不跟踪你扩展的情况下C, 当你从, 在你从D第一次,您将再次尝试扩展C. 在图搜索中,这是不可能的,因为我们第一次展开C,我们将它添加到explored set中,所以我们不再展开它。