我正在寻找使用约束编程解决sudoku问题的其他观点。
经典的观点是使用有限域(行,列)变量,它可以取1到9的值。这是一个很好的观点,很容易为它定义约束。例如:(1, 2 )值为4的变量意味着4位于第2列的第1行。
但是很难找到其他的观点。我尝试并提出了一个三维矩阵的观点,它采用二进制值。例如,变量(1, 2 ,7)以1为值意味着第2列的第1行中有7,但如果其他所有视点都不能提供良好的约束,则应该使用二进制值。
还有其他好的观点吗?
编辑:一个好的观点应该允许简洁地表达约束。我更喜欢允许使用尽可能少的约束来描述问题的观点,只要这些约束有有效的算法。
定义视点:视点是一对X,D,其中X= {x1,。。。,xn}是一组变量,D是一组域;对于每个xi∈X,相关联的域Di是x的可能值集。
发布于 2016-03-14 15:34:03
您给出的观点是由(行、列、数字)构建的sudoku关系的位置编码的同态映射。
另一种方法是编码限制集(第1-9行,第1-9列,正方形领事,嗯,呃,毫升,毫升,毫米,mr,11,lm,lr,或任何适用的限制),以及是否有某个数字在其中。在定义约束方面,这可能是可怕的。(因此,我认为这是不好的)。它要求将约束集之间的关系编码为“已知”。
例如,经典观点中的a (2,5,7)将意味着(第2,7行),(col5,7)和(嗯,7)在这一备选方案中。
正如您所看到的,问题在于对逻辑位置和各种约束之间的关系进行编码。经典的vieport是建立在对位置数据进行编码的基础上,并对可能的位置应用约束。(对sudoko的解释和解决方法。)另一种方法是使用约束集作为视点,并需要将定位作为约束来处理。
不过,正常人可能会因为这种表现而在大脑中打个结。(我也不会自愿去找出这些约束.)
https://stackoverflow.com/questions/35990953
复制相似问题