为什么我的数组是 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,..]
.
我有以下问题:我想调用全局约束 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,..]
.