观点数独

时间:2016-03-14 14:59:13

标签: prolog sudoku constraint-programming

我正在寻找替代视点来使用约束编程解决数独问题。

经典观点是使用有限域(行,列)变量,这些变量可以从1到9取值。这是一个很好的观点,并且很容易定义约束它。例如:(1,2)变量值为4表示4表示第2列第1行。

但很难提出其他观点。我尝试并提出了采用二进制值的三维矩阵的观点。例如,变量(1,2,7) 1 作为值意味着第2列中的第1行中有7个。但是使用二进制值应该是转到if所有其他观点都无法提供良好的约束。

还有其他好的观点吗?

编辑:良好观点应该允许简洁地表达约束。我更喜欢允许使用尽可能少的约束来描述问题的观点,只要这些约束具有有效的算法。

定义观点: 视点是一对X,D,其中X = {x1 ,. 。 。 ,xn}是一组变量, 和D是一组域;对于每个xi∈X,关联域Di是一组 x的可能值。必须有可能将变量和值赋予意义 在问题P方面的CSP,以及在视点中说什么分配 X,D旨在用P表示。

2 个答案:

答案 0 :(得分:1)

您提供的视点是数据构建的关系(行,列,数字)的位置编码的同态映射。

另一种方法是编码限制集(行[1-9],列[1-9],正方形[ul,um,ur,ml,mm,mr,ll,lm,lr]或任何限制申请)以及是否放置了某个数字。这可能会 在定义约束方面很糟糕。 (所以我猜它被认为是不好的)。它要求将限制集之间的关系编码为"已知"分开。

E.g。经典观点中的a(2,5,7)在这个替代方案中意味着(第2,7栏),(第5栏)和(第7段)。

如您所见,问题在于逻辑位置与各种约束之间关系的编码。 经典的vieport建立在对位置数据进行编码的基础上,并对可能的位置应用约束。 (解释和接触sudoko以解决问题的方式。)替代方案是使用约束集作为视点,并且需要将定位作为约束来解决。

但正常人可能会从这种表现中得到一个结。 (而且我并没有自愿解决这些限制......)

答案 1 :(得分:0)

一种可能的其他观点如下:

让我们首先将一个数字与每个3x3区域相关联(左上角为1,顶部为2等),并在每个区域内为其中的所有9个方格组成一个数字(左上角)是1,顶部是2,等等。

X = {X i,j | i∈1..9,j∈1..9}其中X i,j 具有域1..9并且指定区域j中的数字i的位置。区域约束已使用此模型进行编码,其余两个是行和列约束。

这是行约束: for each number i ∈ 1..9 for each (a,b,c) ∈ {(1,2,3),(4,5,6),(7,8,9)} (Xi,a,Xi,b,Xi,c) ∈ {(1,4,7),(1,4,8),(1,4,9),(1,5,7),(1,5,8),(1,5,9),(1,6,7),(1,6,8),(1,6,9),(2,4,7),(2,4,8),(2,4,9),(2,5,7),(2,5,8),(2,5,9),(2,6,7),(2,6,8),(2,6,9),(3,4,7),(3,4,8),(3,4,9),(3,5,7),(3,5,8),(3,5,9),(3,6,7),(3,6,8),(3,6,9)}

列约束类似,但(a,b,c)∈{(1,4,7),(2,5,8),(3,6,9)}。

此视图是基于区域的,但基于行和列存在另外两个类似的视图。

存在其他视图,例如,您可以使用X = {X i,j | i∈1..9,j∈1..9}∪{Y i,j | i∈1..9,j∈1..9}其中X i,j 是区域j中的数字i的行(从1到3),Y i,j < / sub>它的专栏。您需要做的就是弄清楚如何表达约束。