MiniZinc为阵列中的每个Var分配不同的域

时间:2017-05-05 02:14:17

标签: arrays constraints constraint-programming minizinc

我有一个数组:array[backpacks] of int: capacity指定每个背包的容量。

现在我想创建一个约束求解器必须满足的变量数组。我希望每个变量在域1..capacity中取值,其中capacity对应于上面数组中指定的值。

这类似的工作:array[backpacks] of var capacity: bagcaps

或者我必须执行以下操作:array[backpacks] of var 1..MAX: bagcaps

然后添加约束:constraint forall(i in backpacks) bagcaps[i] <= capacity[i]

谢谢。

1 个答案:

答案 0 :(得分:1)

没有捷径限制数组声明中特定元素的域。传统版本是你上次写的那个:

constraint forall(i in backpacks) bagcaps[i] <= capacity[i]);

但是,您可以将其设置为谓词(并将其放在单独的文件中,然后使用include将其导入模型中)。例如。这样的事情:

set of int: backpacks = 1..6;
array[backpacks] of int: capacity = [10,4,3,7,5,3];
array[backpacks] of var 1..max(capacity): bagcaps;

solve satisfy;

predicate restrict_domains(array[int] of var int: x, array[int] of int: d) =
        forall(i in index_set(x)) ( x[i] <= d[i] );

constraint
     % forall(i in backpacks) ( bagcaps[i] <= capacity[i] ) % original
     restrict_domains(bagcaps,capacity)
;

% output [];

请注意,您仍必须使用restrict_domains作为约束。我建议您始终尽可能地限制声明中的域名,即使用var 1..max(capacity)代替var int使用声明。