为什么我的数组是 var int 类型而不是 var set of int?

Why my array is of type var int instead of var set of int?

我有以下问题:我想调用全局约束 at_most 但我收到与签名相关的错误

constraint forall(i in 0..w-1)(at_most(l_max, [board[i,j] | j in 0..l_max-1], 0..n));

第二个参数不匹配,因为它原来是 var int 而不是 var set of int 但我之前是这样定义 board 的:

set of int: VALUES = 0..n;
array[0..w-1,0..l_max-1] of var VALUES: board;

正如一条一般消息:at_most 位于不推荐使用的约束列表中:https://www.minizinc.org/doc-2.5.5/en/lib-globals.html#deprecated-constraints。 相反,您应该使用 count 约束。这些约束更加灵活,并且得到求解器的更好支持。

在这种情况下,似乎对 at_most 的作用存在误解。最多只限制单个值出现的次数。你是。但是,给它一整套值。

如果您要计算所有不同的值,则可以使用 global_cardinality_low_up。 (您可能还想查看封闭版本)。 我认为您打算编写以下约束条件。

constraint forall(i in 0..w-1)(
  global_cardinality_low_up([board[i,j] | j in 0..l_max-1], 0..n, [0 | i in 0..n], [l_max | i in 0..n])
);

此约束确保对于推导式 0..n 中的值仅出现 l_max 次。

请注意,如果您对 select 整行使用理解,那么最好使用切片表示法:board[i,..].