【问题标题】:Algorithm X to Solve the Exact Cover: Fat Matrices求解精确覆盖的算法 X:脂肪矩阵
【发布时间】:2014-07-30 23:38:16
【问题描述】:

当我阅读有关 Knuth 的算法 X 以解决确切的覆盖问题时,我想到了一个需要澄清的极端情况。

这是我的假设:

  1. 给定一个矩阵 A,算法 X 的“目标是选择行的一个子集,以便数字 1 在每一列中恰好出现一次。”
  2. 如果矩阵为空,则算法成功终止,然后解决方案是在该点之前记录在部分解决方案中的行的子集。
  3. 如果有一列是 0,算法将失败终止。

供参考:http://en.wikipedia.org/wiki/Algorithm_X

考虑矩阵 A: [[1 1 0] [0 1 1]]

我采取的步骤:

给定矩阵 A:

1. Choose a column, c, with the least number of 1's. I choose: column 1

2. Choose a row, r, that contains to a 1 in column c. I choose: row 1

3. Add r to the partial solution.

4. For each column j such that A(r, j) = 1:

       For each row i such that A(i, j) = 1:

           delete row i

       delete column j

5. Matrix A is empty. Algorithm terminates successfully and solution is allegedly: {row 1}.

但是,这显然不是这种情况,因为第 1 行仅包含 [1 1 0] 并且显然不包含第 3 列。

我会假设算法应该在某个时候将矩阵减少到只有一个 0 并且终止失败的程度。

有人可以解释一下吗?

【问题讨论】:

  • 您考虑过使用最大流量吗?例如对于每一列都有一个节点,其容量为 1 的边缘通向接收器。
  • 我没有考虑最大流量,因为我只是特别关注这个算法。更具体地说,我想将此算法应用于数独游戏,这种方法是更广为人知/最佳解决方案之一。谢谢你的建议。

标签: algorithm matrix linear-algebra sudoku


【解决方案1】:

我认为这里的混淆只是在使用术语空矩阵。如果您阅读 Knuth 的原始论文(链接在您引用的 Wikipedia 文章中),您可以看到他将行和列视为双向链表。他说矩阵是空的,并不是说它没有条目,他的意思是所有的行和列对象都被删除了。

为了澄清,我将用小写字母标记行,用大写字母标记列,如下所示:

   | A | B | C
---------------
 a | 1 | 1 | 0
---------------
 b | 0 | 1 | 1

该算法表明您可以确定地选择一列(使用您希望使用的任何规则),他建议选择 1 数量最少的列。因此,我们将按照您的建议继续并选择列 AA 列中唯一带 1 的行是 a 行,因此我们选择 a 行并将其添加到可能的解决方案 { 一个 }。现在,行 a 在列 AB 中有 1,所以我们必须删除这些列,以及这些列中包含 1 的所有行,即是,行 ab,就像你做的那样。生成的矩阵只有一列 C 并且没有行:

   | C
-------

这不是一个空矩阵(它还剩下一列)。但是,列 C 中没有 1,所以我们没有成功终止,如算法所示。

这可能看起来很奇怪,但如果我们打算对Exact Cover Problem 使用关联矩阵,这是一个非常重要的情况,因为列表示我们希望覆盖的集合 X 的元素,而行表示 X 的子集。所以有一些列但没有行的矩阵代表了确切的覆盖问题,其中可供选择的子集集合为空(但仍有点需要覆盖)。

如果此描述导致您的实现出现问题,有一个简单的解决方法:只需在每个问题中包含空集。空集(不包含 X 点)由一行全零表示。它永远不会被您的算法选择为解决方案的一部分,永远不会与任何其他选定的行发生冲突,但始终确保矩阵是非空的(至少有一行),直到所有列都被删除,这就是你的全部关心,因为您需要确保每一列都被某行覆盖。

【讨论】:

  • 在阅读了 Knuth 的舞蹈链接实现之后,它变得更有意义了。通过直接使用矩阵,我没有考虑标题行的列。这意味着为了使矩阵为空,标题行也必须为空。这听起来正确吗?感谢您澄清这一点!
  • 是的,您可以采用任何一种方式:在标题行中特殊处理的列,或者您只需在矩阵的某处插入一行全零。
猜你喜欢
  • 2012-05-19
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
相关资源
最近更新 更多