如何在 MiniZinc 中准确使用谓词
How to use predicate exactly in MiniZinc
这里是 MiniZinc 新用户...我在理解计数约束的语法时遇到问题:
predicate exactly(int: n, array[int] of var int: x, int: v)
"Requires exactly n variables in x to take the value v."
我想确保我的 10r x 30c 数组中的每一列至少有一个 1,2 和 3,其余 7 行等于零。
如果我将数组声明为
array[1..10,1..30] of var 0..3: s;
我怎样才能准确地使用 predicate 来根据需要填充它?谢谢!
嗯,"exactly" 约束在这里不是很有用,因为您希望 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 做任何事情,因为定义域是 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
.
这里是 MiniZinc 新用户...我在理解计数约束的语法时遇到问题:
predicate exactly(int: n, array[int] of var int: x, int: v)
"Requires exactly n variables in x to take the value v."
我想确保我的 10r x 30c 数组中的每一列至少有一个 1,2 和 3,其余 7 行等于零。
如果我将数组声明为
array[1..10,1..30] of var 0..3: s;
我怎样才能准确地使用 predicate 来根据需要填充它?谢谢!
嗯,"exactly" 约束在这里不是很有用,因为您希望 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 做任何事情,因为定义域是 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
.