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

时间:2015-02-15 08:51:41

标签: java a-star heuristics 8-puzzle

假设我们有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)=移动的数量...... 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

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

1 个答案:

答案 0 :(得分:0)

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

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

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