给出15拼图的一部分棋盘,如何使用BFS获取该部分棋盘的所有状态?

问题描述

板子是这样的:

1 2 3 4
5 6 7 0
0 0 0 0
0 0 0 0

'0' 表示为空,我们可以将非零数字移动到 '0'。 那么如何使用 BFS 获取电路板的所有状态?

例如,棋盘有两种状态:

1 2 3 4
0 0 0 0
5 6 7 0
0 0 0 0

1 2 3 0
4 0 0 0
5 0 0 0
6 7 0 0

我问这个问题的原因是我需要使用 disjoint 模式数据库处理所有的 15-puzzle 状态,以在 1 分钟内解决 15-puzzle 几乎最困难的状态。

15 14 13 12
11 10 9 8
7 6 5 4
3 1 2 0

解决方法

我需要处理所有的 15-puzzle 状态 [..] 以在 1 分钟内解决几乎最难的 15-puzzle 状态

方法 1 - 使用数据库并存储所有状态

由于 Henry 给出的原因以及 [1] 的支持,使用数据库解决这个问题需要生成整个 A_15 ,存储所有它,然后找到最短路径,或给定状态和已解决状态之间的某些路径。这将需要大量空间和大量时间。有关此方法的概述,请参阅 this discussion

方法 2 - 使用专门的深度优先搜索算法

Here is an implementation 这个使用 IDA algorithm 的搜索策略。

方法 3 - 使用计算群论

在更短的时间内处理这个问题的另一种方法是使用 GAP(它实现了 Schreier-Sims 的变体),以便将给定的单词分解为生成器的乘积。有is an example in the docs展示了如何使用它来解决魔方,它也可以适应15-puzzle [2]。


[1] Permutation Puzzles - A Mathematical Perspective by Jamie Mulholland - 有关可解性标准,请参见第 103 页和第 104 页,状态空间为 |A_15| ~ 653 billion

[2] link2 - 第 37 页