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

Java 8使用*解决难题:子节点重复其祖先的状态,java,a-star,heuristics,sliding-tile-puzzle,Java,A Star,Heuristics,Sliding Tile Puzzle,假设我们有一个8字谜问题,空磁贴被标记为零。 目标状态为: 1 2 3 4 5 6 7 8 0 初始状态为: 0 1 3 8 2 4 7 6 5 。。。我的问题是,a*树中的孩子是否可能复制或拥有其祖先的相同状态?或者fn=gh+hn[其中gh=移动的次数…hn=每个瓷砖的曼哈顿距离之和]已经使得这不可能了,因此我不需要担心这个?。。例如,从初始状态: 0 1 3 8 2 4 7 6 5 然后发生以下状态,从而在A*树中产生更多的子节点 行动:起来 8 1 3 0 2 4 7 6 5 动作:左

假设我们有一个8字谜问题,空磁贴被标记为零。 目标状态为:

1 2 3 4 5 6 7 8 0 初始状态为:

0 1 3 8 2 4 7 6 5 。。。我的问题是,a*树中的孩子是否可能复制或拥有其祖先的相同状态?或者fn=gh+hn[其中gh=移动的次数…hn=每个瓷砖的曼哈顿距离之和]已经使得这不可能了,因此我不需要担心这个?。。例如,从初始状态:

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*搜索中可能吗?还是fn会处理这个问题?感谢那些愿意回答的人,任何帮助都将不胜感激

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

如果您打算用Java实现这个问题,也许您会发现使用一个启发式搜索库很有用,比如。此库是开源的,请参阅,并使用它解决了许多搜索问题。包括

我希望我的回答有帮助