问题 用A *算法求解8拼图


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

如果你们能帮助我并给我指导,我将非常感激,以便我可以用Java自己实现它。我真的想这样做才能理解它,所以我只需要开始指导。


我将使用优先级队列,并将从文本文件中读取初始配置,例如:

4  3  6
1  2  5
7  8  

欢迎访问其他网站以获取更多解释/教程。


5291
2017-11-22 23:29


起源



答案:


我首先决定你想如何代表游戏板状态, 然后实现运算符(例如,向上移动(空白),向下移动(空白)向下,...)。 通常,您将拥有一个数据结构来表示打开列表(即那些状态 发现但尚未探索(即与目标状态相比),另一个发现 封闭清单(即发现和探索并发现不是目标国家的那些状态)。 您使用起始状态对打开的列表进行播种,并重复执行“下一个”状态 从开放列表中进行探索,将运算符应用于它以生成新的可能状态 等等 ...

我多年前准备的教程是:

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

它远不是关于状态空间搜索的权威性词汇,它只是那些全新概念的教育工具。


7
2017-11-22 23:36



您需要登录该链接。 - Uttam


答案:


我首先决定你想如何代表游戏板状态, 然后实现运算符(例如,向上移动(空白),向下移动(空白)向下,...)。 通常,您将拥有一个数据结构来表示打开列表(即那些状态 发现但尚未探索(即与目标状态相比),另一个发现 封闭清单(即发现和探索并发现不是目标国家的那些状态)。 您使用起始状态对打开的列表进行播种,并重复执行“下一个”状态 从开放列表中进行探索,将运算符应用于它以生成新的可能状态 等等 ...

我多年前准备的教程是:

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

它远不是关于状态空间搜索的权威性词汇,它只是那些全新概念的教育工具。


7
2017-11-22 23:36



您需要登录该链接。 - Uttam


检查 http://olympiad.cs.uct.ac.za/presentations/camp1_2004/heuristics.pdf 它描述了解决这个问题的方法。


3
2017-11-23 08:05





A *与Djikstra的算法非常相似,除了它包含启发式算法。你可能想读一下 维基 或阅读一般的单源最短路径算法。

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

任何位置的基本分数显然是到达它的实际动作的最小数量。要使A *起作用,您需要一种启发式方法,可以帮助您选择可能的下一个状态的最佳选项。一个启发式可能是正确位置的件数。


1
2017-11-23 01:32





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

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

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

我写了一篇关于A *搜索算法的文章,并提供了使用A *和曼哈顿距离作为启发式的N-puzzle问题的python实现: A *搜索解释和N-puzzle python实现


0
2017-12-28 17:41



这个链接全面地解决了这个问题,所以我认为这就足够了。现在我已经添加了足够的细节来回答问题,并仅将链接作为参考。 - Kartik Kukreja