我是 Minizinc 的新手,我想解决以下问题。
我有一个给定的 6x6 单元格矩阵。行编号从 1..6,列编号从 A..B。所有单元格都应按照某些规则用从 1..9 的数字填充:
- 矩阵中所有 9 位数字都恰好出现了 4 次。
- 行或列中的直接邻居不能具有相同的值。
- 同一行中的所有单元格和同一列中的所有单元格都应具有不同的值。
- (3) 有一些例外:a) 第 2 行有两个“6”。b) 第 3 行有两个“3”。c) 第 4 行有两个“5”。d) 第 5 行有三个“7”。e) 第 6 行有两个“8”。f) B 列有两个“3”。g) D 列有两个“8”。h) F 列有两个“9”。
- 第 1 行所有数字的总和 >= 38。
- E列所有数字的总和为= 21。
- 第 2 行不包含“1”。
- 第 4 行不包含“4”。
- 第 5 行不包含“2”。
- 第 6 行不包含“3”。
- C 列不包含“2”。
- B列除两个“3”外,只有偶数数字。
- A 列具有升序或降序序列,例如“234567”或“987654”。
我在Minzinc中构建模型时最头疼的就是那些“矛盾的”约束:
- 同一行或同一列中的所有数字必须不同。
- 但有时这条规则也有例外。
这如何实现呢?
提前致以最诚挚的谢意。Guenther
我很好奇如何使用Clingo ASP以简洁的方式对这个问题进行建模,作为 minizinc 的替代方案。它不是约束编程,但与之相关且非常具有声明性,因此它可能会给你一些想法:
(实际上,minizinc也通过flatzingo支持相关的求解器。)
输出:(复制粘贴代码即可在线运行)
作为矩阵的唯一解:
更新:
我将 OP 的另一个解决方案添加到模型中,以便在两个方向上进行验证:
…输出结果如下:
暗示:
感谢所有提示!看起来很完美。
另一个解决方案在这里:
再次感谢并致以最诚挚的问候,
冈瑟
这是一段minizinc 代码片段,使用all_different_except()和count()强制第 2 行具有除 2x 6 之外的不同数字:
输出:
好的,伙计们。这是我的 MiniZinc 模型,给出了正确的结果。
我确信有些代码部分可以写得更优雅。但我很高兴今天在 MiniZinc 中构建了我的第一个解决方案。
感谢您的所有意见!