【问题标题】:8 puzzle solving using A*: a child node repeating its ancestor's state8 使用 A* 解谜:重复其祖先状态的子节点
【发布时间】:2015-04-15 23:05:49
【问题描述】:

假设我们有一个 8 拼图问题,空的瓷砖用零标记。 目标状态是:

  • 1 2 3
  • 4 5 6
  • 7 8 0

初始状态为:

  • 0 1 3
  • 8 2 4
  • 7 6 5

...我的问题是,A* 树中的孩子是否可以“复制”或与其祖先具有相同的状态?或者“f(n) = g(h) + h(n)” [其中 g(h) = 移动数 ... h(n) = 每个图块的曼哈顿距离之和] 已经使这成为不可能并且因此我不需要担心这个?..例如,从初始状态:

  • 0 1 3
  • 8 2 4
  • 7 6 5

然后发生以下状态,从而在 A* 树中产生更多的子节点

(动作:向上)

  • 8 1 3
  • 0 2 4
  • 7 6 5

动作:左

  • 8 1 3
  • 2 0 4
  • 7 6 5

动作:向下

  • 8 0 3
  • 2 1 4
  • 7 6 5

动作:正确

  • 0 8 3
  • 2 1 4
  • 7 6 5

动作:向上

  • 2 8 3
  • 0 1 4
  • 7 6 5

...然后动作:左,下,右,上,左,下,右发生...因此将状态返回到初始状态:

  • 0 1 3
  • 8 2 4
  • 7 6 5

这在 8 谜题的 A* 搜索中是否可行?还是 f(n) 会解决这个问题?感谢那些愿意回答的人,任何帮助将不胜感激!

【问题讨论】:

    标签: java a-star heuristics sliding-tile-puzzle


    【解决方案1】:

    您不必担心您在问题中描述的情况。初始状态在 A* 的第一次迭代中扩展,这导致算法将该节点包含在 CLOSED 列表中,并带有相关成本(为零,因为它是初始状态)。如果您再次找到该状态作为任何其他状态的后继状态,则该算法将在 CLOSED 列表中以较低的成本找到该状态,并且不会再次展开该状态,从而丢弃搜索树中的该分支。

    如果您打算在 Java 中实现这个问题,也许您会发现使用像 Hipster 这样的启发式搜索库很有用。这个库是开源的(参见Github)并且已经解决了some examples 的搜索问题。包括8-puzzle problem solved with A*

    希望我的回答对你有帮助,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多