【问题标题】:Time complexity of Sudoko solver and relation to NP-completeness数独求解器的时间复杂度和与 NP 完备性的关系
【发布时间】:2019-12-23 04:40:47
【问题描述】:

基本上,我对“解决 N×N 数独难题的一般问题是 NP 完全问题”的真正含义感到困惑。 这是否意味着如果我有一个将 NxN 数独板作为输入并解决它的算法,那么该算法在时间复杂度上必须是指数的 N? 还是“普遍问题”是找到所有 NxN 数独板,它们都是有效的谜题?

我问的原因是因为我有一个算法可以在多项式时间内解决 NxN 数独板,因此我对“数独的一般问题”的真正含义感到困惑。

算法本身相当简单,将 NxN 数独板上的所有位置视为未知变量(因此我们有 N^2 个变量),然后为所有这些变量建立一个方程组,将其写成矩阵形式我们得到一个只有 1 和 0 的 N^2 x 3N 矩阵,表示数独游戏中的行、列和框的哪些位置应该加在一起。现在我们有了 Ax = b 形式的数独问题,其中 A 是我们的大矩阵,x 是我们想要找到的向量,b 是所有值之和的向量(例如 9x9 上的 45数独板)。 不是用数字(例如 1 到 9)表示数独板上的值,而是用 one-hot 编码表示(所以 4 是 [0,0,0,1,0,0,0,0,0]等等)。因此方程中的 x 和 b 成为“向量的向量”(注意,不是矩阵,我们仍然将 Ax 视为 x 是标量,因此 A 中的每个元素缩放 x 中的整个向量,所以不是矩阵乘法)。 b 向量成为所有 one-hot 编码向量的总和,即只有一个向量。

现在我们只需将 A 矩阵中与已知棋盘位置相对应的元素设置为零并减去 b 向量中的值(单热编码)来计算数独棋盘上的已知值。然后我们只是使用高斯消元来求解系统,因此我们仍然可以将 b 向量中的 one-hot 编码视为只是被加/减和缩放的标量。 一旦我们完成了高斯消除,我们就得到了 b 向量中的解。由于数独是唯一的,我们应该只有一个解决方案,并且由于 one-hot 编码,我们还可以检查数独是否有效,因为如果 b 向量包含除 1 和 0 之外的任何内容,则它不是一个有效的谜题。高斯消元法还告诉我们是否有多个解或没有解,因为最后一行将完全为 0 或 0 = 1 无解。 one-hot 编码的另一个好处是,当系统不确定时,您可以轻松找到解决方案。由于您知道所有 x 值只有一个,因此消除了许多可能的解决方案。考虑 A 矩阵有一行 [3,1,2,0,0,0] 并且对应的 b 值为 [0,0,2,0,3,1] 的情况。然后您知道 3、2 和 1 都配对,因为这是您可以使用 x 上的 one-hot 编码值获得此结果的唯一方法。当您有一个只有 1 和 0 的欠定 A 矩阵时,可以使用相同的原理快速求解哪个 x 对应哪个 b 值。

就矩阵的大小而言,高斯消元的时间复杂度是三次方,就数独板的大小而言,矩阵的大小是 N^2,这个算法的时间复杂度是 N^6电路板尺寸。

我很可能忽略了一些事情或误解了一般数独问题的 NP 完整性,但这就是我问这个问题的原因:)

【问题讨论】:

  • 您可以在多项式时间内针对某些特定大小的网格求解,但这并不意味着您可以针对所有网格大小以这种方式求解
  • @mangusta 所以你是说我的算法不适用于更大的电路板?或者你的意思是我需要一个算法来在相同的多项式时间内解决所有的棋盘尺寸?
  • 如果板的大小是一个变量(不是静态的),则必须在复杂性中加以考虑。如果你忽略棋盘的大小,你的算法的复杂性可能是多项式的
  • @mangusta 但是板子的大小是一个变量。我可以给它一个 3x3 板、2x2 板或 100x100 板,它可以在多项式时间内解决关于板尺寸的问题。我觉得我在这里误解了一些东西:S
  • 你确定你的算法不管大小都能在多项式时间内解决它吗?

标签: complexity-theory sudoku np-complete


【解决方案1】:

在获取 x 时,我的算法出现了错误。我只在小型数独上尝试过,问题简化为 2-SAT 问题,因此我错误地假设它也将是大型数独的 2-SAT 问题,但它很快变成了 3-SAT 甚至更大。

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2013-02-25
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多