5x5 滑动拼图快速和低移动解决方案

5x5 Sliding Puzzle Fast & Low-Move Solution

我正在尝试找到一种方法,以编程方式在合理的时间和移动量内解决 24 块滑动拼图。这是我描述的谜题中已解决状态的示例:

我已经发现 IDA* 算法可以很好地完成 15 拼图(4x4 网格)。 IDA* 算法能够在非常合理的时间内为任何 4x4 滑动拼图找到最少的移动次数。我 运行 改编了 this 代码来测试 4x4 滑动拼图,并且能够通过使用 PyPy 进一步显着减少运行时间。不幸的是,当此代码适用于 5x5 滑动拼图时,它运行起来非常慢。我 运行 它一个多小时,最终放弃看到它完成,而它 运行 在 4x4 网格上只持续了几秒钟。我知道这是因为随着网格的增加,需要搜索的节点数量呈指数增长。但是,我并不想找到 5x5 滑动拼图的最佳解决方案,只是接近最佳的解决方案。例如,如果给定谜题的最佳解决方案是 120 步,那么我会对任何低于 150 步并且可以在几分钟内找到的解决方案感到满意。

是否有任何特定算法可以实现此目的?

已经证明找到n-Puzzle的最少步数是NP-Complete,见Daniel Ratner and Manfred Warmuth, The (n2-1)-Puzzle and Related Relocation Problems, 符号计算杂志 (1990) 10, 111-137.

Graham KendallA Survey of NP-Complete Puzzles 回顾的有趣事实,2008 年:

  • 8 字谜题可以用 A* algorithm;
  • 来解决
  • 15 题不能用 A* 算法解决,但 IDA* algorithm 可以;
  • 无法使用 IDA* 算法在合理时间内生成 24 拼图的最优解。

因此停止计算以改变方法是正确的做法。

似乎有一种可用的多项式时间算法可以找到次优解,参见Ian ParberrySolving the (n^2−1)-Puzzle with 8/3n^3 Expected Moves, 算法 2015, 8(3), 459-465。这可能是您正在寻找的。

IDA* 非常适合 最多 4x4 拼图,因为那是 'just' 16! (20,922,789,888,000) 个可能的状态。一个 5x5 的拼图有 25 个! (15,511,210,043,330,985,984,000,000) 个可能的状态,增加了 740,000 万。

你需要转换策略。 'easiest' 方法 solves the puzzle along the top row and then left column first,重复,直到你有一个 3x3 的拼图,可以使用现有技术轻松解决。

解谜涉及 3 个不同的阶段,您可以在其中交替进行:

  1. 解决第一行(将第 1 - N-2 列的棋子移动到位,然后将第 N-1 列的棋子移动到第 N 列,将第 N 列的棋子移动到第 N 列,但下面一行,完成这一行)
  2. 解决左列(将第 2 - N-2 行的棋子移动到位,然后将第 N-1 行的棋子移动到第 N 行,将第 N 行的棋子移动到第 N 行,但向右移动一列,完成列)
  3. (剩余2行3列):用A*求余数

所以阶段 1 和阶段 2 交替进行,直到您可以 运行 阶段 3;在解决了前 5 个方块(第 1 阶段)之后,您解决了其他行中最左边的 4 个方块(第 2 阶段),然后是拼图剩余部分的最上面一行(4 个方块,第 1 阶段),然后是左列( 3个地砖,第2阶段),然后解决第3阶段。第1阶段和第2阶段基本相同,只是方向不同,第2阶段第一块地砖已经到位。

第 1 阶段和第 2 阶段使用查找 table 即可轻松解决,无需搜索;您正在移动特定的图块,不关心其他任何内容:

  • 找到所需的图块
  • 获取方块旁边的空隙(这取决于移动方向哪一边最好)
  • 将方块移动到位;有标准的移动可以在任何方向移动瓷砖(垂直或水平移动 5 个,对角线移动 6 个)。

这不会为您提供解决方案的最短路径,但在没有状态搜索的情况下问题是严格限制的并且已知最坏的情况。解决一个 5x5 拼图的第一行和第一列最多需要 427 次移动,下一行和下一列需要 256 次移动。

此算法最初由 Ian Parberry, in a paper titled A real-time algorithm for the (n2 − 1)-puzzle in 1995. I think that DSolving: a novel and efficient intelligent algorithm for large-scale sliding puzzles by GuiPing Wang and Ren Li 描述,描述了一种更有效的查找方法 - table 方法仍然如此,但由于该论文尚未免费提供,我还没有研究它。

一个可能有效的两个字符的变化是将启发式算法乘以 2(或其他一些常量)。它不再是可接受的,但找到的解决方案将在最佳解决方案的 2 倍之内。这个技巧叫做Weighted A*/Static Weighting.