用A *算法解决8难题

时间:2010-11-22 23:29:09

标签: java algorithm

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

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


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

4  3  6
1  2  5
7  8  

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

4 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

A *与Djikstra的算法非常相似,只不过它包含一个启发式算法。您可能希望阅读wiki或阅读有关单源最短路径算法的信息。

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

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

答案 3 :(得分:0)

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

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

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

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