【问题标题】:Give a part of chessboard of 15-puzzle, how to get all of the state of the the part chessboard using BFS?给出15-puzzle棋盘的一部分,如何使用BFS获取该部分棋盘的所有状态?
【发布时间】:2021-04-17 17:04:50
【问题描述】:

板子是这样的:

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

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

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

【问题讨论】:

  • 你知道有 10461394944000 (=16!/2) 种可能的状态吗?每个状态仅存储 1 个字节意味着大约 10 TB。
  • @Henry,有 7 个点,是 C(16, 7) * A(7, 7)
  • 对,我正在计算完整的谜题。

标签: java breadth-first-search sliding-tile-puzzle


【解决方案1】:

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

方法 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 页

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多