8 使用 A* 解决难题:一个重复其祖先状态的子节点



假设我们有一个8谜题问题,并且空瓦片用ZERO标记。目标状态为:

  • 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?。。例如,从初始状态:

  • 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

这在A*搜索8个谜题时可能吗?还是f(n)会处理这个问题?感谢那些愿意回答的人,任何帮助都将不胜感激!

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

如果您打算在Java中实现这个问题,也许您会发现使用像Hipster这样的启发式搜索库很有用。这个库是开源的(见Github),有一些用它解决搜索问题的例子。包括用A*解决的8个难题。

我希望我的答案能有所帮助,

最新更新