可以将Dancing Links应用于此CSP吗?

时间:2009-11-29 06:55:20

标签: algorithm lisp artificial-intelligence constraints

可以使用Knuth算法X的Dancing Links实现来解决this CSP吗?在这个游戏中,第一个和最后一个数字总是已经在董事会中,我相信每个精心设计的问题只有一个解决方案。

2 个答案:

答案 0 :(得分:3)

假设我们要解决这个Hidato:

+---+   +---+
|   |   | 6 |
+---+---+---+
|   |   |
+---+---+
| 1 |   |
+---+---+

首先,让我们用字母a,b,c,d:

命名空单元格
+---+   +---+
| d |   | 6 |
+---+---+---+
| b | c |
+---+---+
| 1 | a |
+---+---+

我们需要为X Algorithm的每个解决方案行表达3种约束:

  • 使用数字(因此相同的数字不会使用两次)
  • 使用一个单元格(因此相同的单元格不会使用两次)
  • 下一个单元格受到约束(因此下一个单元格只能在相邻单元格中选择)。最后一个约束不需要精确覆盖,因此它只能用作DLX术语中的辅助列

结果问题矩阵是:

1 2 3 4 5 6 a b c d   2a 2b 2c 2d     3a 3b 3c 3d     4a 4b 4c 4d     5a 5b 5c 5d
1                              1
  1         1         1               1        1
  1           1          1               1
  1             1           1               1
  1               1            1      1        1
    1       1                         1               1        1
    1         1                          1               1
    1           1                           1               1
    1             1                            1      1        1
      1     1                                         1               1        1
      1       1                                          1               1
      1         1                                           1               1
      1           1                                            1      1        1
        1   1                                                         1
        1     1                                                          1
        1 1     1                                                           1
        1         1                                                            1

例如,第二行(不计算标题行)可以读作:此行在单元格中设置数字 2 (第一个) a (第二个1)。它也受 2a 光约束的约束。并且它还限制3不在 3a 3d ,因为它们不与单元格 a 相邻。

所有行都以这种方式阅读,除了:

  • 第一行仅列出对数字 2 的约束。
  • 5 行(最后4行),它们还嵌入了与 6 相邻的约束。

实施留给读者练习......

答案 1 :(得分:0)

没有

约束求解器当然可以解决这类问题,但似乎不太可能是最快的方法。另外,似乎很难告诉求解器“路径不能跨越自己”,这是一个有用的提示。