2010-11-22 54 views
11

我想用Java中的A *算法解决/实现8拼图问题。我问是否有人可以帮我解释我必须遵循的步骤来解决它。我已经在网上读过A *如何工作,但我不知道如何开始在Java中的实现。用A *算法解决8拼图

如果你们能帮助我并给我指导,以便我可以用Java自己实现它,我将不胜感激。我真的想要做到能够理解它,所以我只需要开始准则。


我将使用优先级队列,并会从一个文本文件,它看起来像例如该读初始配置:

4 3 6 
1 2 5 
7 8 

指向其它网站的更多解释/教程欢迎。

回答

7

我会从决定如何表示游戏板状态开始,然后执行操作员(例如,移动(空白)平铺,向下移动(空白)平铺,...)) 。 通常情况下,您将拥有一个数据结构来表示已打开的列表(即,那些已发现但尚未开发的状态(即与目标状态相比较)的 和另一个用于关闭列表的状态(即发现和探索的那些状态成为目标状态) 您以开始状态种子开放列表,并且从开放列表中反复取出“下一个”状态到 ,将运算符应用到它以生成新的可能状态 等等。 ..

有一个教程,我很多年前在准备:

http://www.cs.rmit.edu.au/AI-Search/

它虽然远离关于状态空间搜索的权威性词语,但它仅仅是这个概念的新品牌的教育工具。

+0

您需要登录的链接。 – Uttam 2018-02-27 10:40:31

1

A *与Djikstra算法很相似,除了它包含启发式算法。您可能想要阅读wiki或阅读有关单源最短路径算法的一般信息。

很多基本的东西很重要,但很明显。您需要代表电路板,并创建一个方法来生成可能的下一个状态。

任何职位的基本分数显然将成为实际移动的最小数量。对于A *的工作,您需要一种启发式方法,可以帮助您选择可能的下一个状态的最佳选项。一种启发式可能是正确位置上的件数。

0

您将需要选择一种方式来表示游戏状态。 8-puzzle问题的状态可以用3x3网格,9元素整数数组,9元素字符数组,字符串或只是一个整数表示(436125780可以表示您的示例中的状态),空白单元格被表示为0.仅使用一个整数将是最节省空间的,并且支持非常有效的集插入/成员资格检查(用于实现闭集)。但是,寻找继承国将会更加困难。使用9元素的字符数组将使查找后继状态变得更容易。我建议你使用两者。使用char数组表示后继查找和使用闭集的整数表示。

然后,您将需要选择启发式功能。对于8难题,可以使用曼哈顿距离,这是一致的启发式并且保证A *图搜索算法的最优性。

解决A *问题需要找到一种方法来表示状态,生成状态的后继者并选择启发式功能。算法的其余部分可以视为黑盒子。

我写了一篇关于A *搜索算法后,用A *和曼哈顿距离作为启发式这里所提供的N-拼图问题的Python实现:A* search explanation and N-puzzle python implementation

+0

该链接全面解决了这个问题,所以我认为这就足够了。现在我已经添加了足够的详细信息来回答问题,并保留链接仅作为参考。 – 2013-12-28 18:22:04