新的MiniZinc用户在这里......我在理解计数约束的语法时遇到了问题:
predicate exactly(int: n, array[int] of var int: x, int: v)
"在x中正好需要n个变量来取值v。"
我想确保10r x 30c数组中的每列至少有1,2和3中的每一列,其余7行等于零。
如果我将我的数组声明为
array[1..10,1..30] of var 0..3: s;
如何根据需要使用谓词来填充它?谢谢!
答案 0 :(得分:1)
好吧,“完全”约束在这里没有用,因为你想要至少出现一次1,2和3.最好使用例如count
函数:
include "globals.mzn";
array[1..10,1..30] of var 0..3: s;
solve satisfy;
constraint
forall(j in 1..30) (
forall(c in 1..3) (
count([s[i,j] | i in 1..10],c) >= 1
)
)
;
output [
if j = 1 then "\n" else " " endif ++
show(s[i,j])
| i in 1..10, j in 1..30
];
由于域为0..3并且所有非1,2或3的值必须为0,因此您无需执行任何操作。
另一个约束是“at_least”,请参阅https://www.minizinc.org/2.0/doc-lib/doc-globals-counting.html。
如果您还没有阅读MiniZinc
教程(https://www.minizinc.org/downloads/doc-latest/minizinc-tute.pdf),我强烈建议您这样做。本教程教你如何思考约束编程 - 当然 - MiniZinc
。