Java寻路益智游戏

时间:2017-11-12 23:56:15

标签: java algorithm

我需要一些建议,我可能需要采取一种方法来解决游戏问题,这是一个拼图(NxN),拼图由正数组成并存储在二维数组中。出于简单的原因,我将列出一个简单的例子

2 1 2 2
1 3 2 1
1 0 2 1
3 1 2 0

所以起点是(0,0)=&gt; 2和目标位置是(3,3)=&gt; 0 数组位置中的数字告诉您移动的距离。 (0,0)=&GT; 2可以移动到(0,2)或(2,0)等等(允许向左,向右,向上或向下移动) 所以你最终得到这样的解决方案,例如(0,2)=&gt;(2,2)=&gt;(2,0)=&gt;(3,0)=&gt;(3,3)。< / p>

所以我的问题是我应该研究什么样的算法以及你们中是否有人做过类似的事情?

3 个答案:

答案 0 :(得分:1)

这里有很多解决方案:

前两个将为您提供最佳解决方案(如果存在)。如果启发式选择良好,A *通常比Dijkstra快。广度优先还将为您提供最佳实施。 Depth-first可能会在这个问题上为您提供非最佳解决方案。

A *和Djisktra之间的主要区别在于A *定义了一个启发式,即一个试图估计移动是否优于另一个移动的函数。

深度优先和广度优先的主要区别在于他们探索解决方案空间的顺序。广度优先将首先查找长度为1的所有解,然后是长度为2的所有解,等等,深度优先将完全探索整个路径,直到它不能再进一步或找到解决方案。

A *和Dijkstra通常以命令式的方式实现,可能比其他两种更复杂,尤其是A *。广度优先也自然地以命令式的方式表达。深度优先通常以递归方式表示,如果您的解决方案可以超过数千次移动的长度(根据堆栈的大小,您通常只能在获得之前进行7-10k递归调用),这可能是一个问题。 StackOverflowError)。

总结一下:

  • A *通常是下面列出的最有效的算法
  • A *是最难实施的
  • Dijkstra是A *的特例,性能相似但效率可能不高
  • 广度优先易于实施,并且对长期解决方案具有弹性
  • Depth-first直接实现,但如果以递归方式实现,它会受到最长路径长度的限制
  • 除深度优先之外的所有这些算法都保证了最佳解决方案

代码示例:

我在其中一个存储库中找到了这个{* 3}的A *。可能有帮助。

答案 1 :(得分:1)

我在Object Pascal(Delphi)中实现了一些网格搜索算法(Best-First,广度优先,深度优先),如果这是经典的网格搜索,您可以很容易地适应Java:

https://github.com/Zoomicon/GridSearchDemo/tree/master/Object%20Pascal/algorithms

您可以在这里尝试使用GridSearchDemo应用程序来查看这些算法在具有起点和目标点的网格中搜索时的行为以及各种网格单元格中的障碍物(您可以设置它们):

https://github.com/Zoomicon/GridSearchDemo/releases

一般来说,我更喜欢A *算法,它是Best-First算法的一个例子(https://en.wikipedia.org/wiki/Best-first_search

在你的情况下,这不是一个网格,而是一个图表,因为你似乎有跳转链接到其他单元格(或者至少这是你如何解释你的问题中的数字,虽然你称之为“多远“起初”

答案 2 :(得分:0)

我用java编写了一个程序来解决这个问题。它使用A *算法和启发式函数Manhatten和hamming。这取决于人是否使用汉明或曼哈顿距离,但曼哈顿更好。

以下是我在java中的代码:8-puzzle

这不是一个简单的方法,很多问题都无法解决。

相关问题