【问题标题】:How do you expand a tree while traversing it?遍历树时如何扩展它?
【发布时间】:2015-07-26 00:06:36
【问题描述】:

我正在编写一个程序来解决一个 3-puzzle(with 3 blocks and a blank) ,这是一个 8-puzzle 的较小版本。我试图通过将与黑色相邻的块移动到空白空间来构建一棵树;因此每个状态都可以给出 2 个状态(分支因子 = 2)。我正在使用广度优先搜索来解决树,但要遍历树,首先必须制作(扩展)它。由于我不能永远继续扩展树,我必须有一些方法将树扩展到一定深度然后遍历它。所以当遍历到最后一层时,会调用expand()函数进一步展开。谁能给我一个清晰的方法或算法来实现这个想法?还是有其他方法可以解决我的问题?

【问题讨论】:

  • @tucuxi 不,我说的是3拼图,因为空间只能是一边(因为只有4个方格)。因此,该空间附近只能有 2 个方块。
  • (删除了我之前的评论——你是对的)

标签: tree breadth-first-search


【解决方案1】:

保留所有不同董事会状态的set。如果两个棋盘状态在任何位置有不同的棋子(空白算作棋子),则它们是不同的。您可以通过使用一致的顺序连接所有数字来构建一个字符串来描述状态;大多数语言/库直接支持字符串集。

您应该只 expand() 未访问过的棋盘状态。每当您第一次访问某个州时,都应将其添加到“已访问的州”set。在扩展任何状态之前,请检查它是否已经存在。

完整的算法(对于一般的广度优先、无重复搜索)是:

place initial state into "pending" (a queue)
place initial state into "visited" (a set)
while "pending" is not empty,
   extract its first state, called "next"
   if it is not present in "visited",
      if it is the goal, report success, ending the algorithm
      otherwise, add all its children at the end of "pending"    
if you reach this point, there is no way to reach a goal state from a start state

【讨论】:

  • 如何扩展树?当一个状态在树中没有子节点时,我是否应该简单地将当前状态 t 传递给 expand(state t) 函数来为该节点创建 2 个新子节点?还是一次展开最后一层的所有节点会更好?
  • 为您的每个州提供一个“父”字段(不用于比较州平等)。每当您将子状态添加到队列时,请将当前状态指定为其父状态。您将在探索树时按照您的意愿构建树。要找到到达目标的最佳路径,只需从目标状态跟随父节点链(直到到达没有父节点的起始节点)。
猜你喜欢
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多