2017-05-05 46 views
0

我有一个数组:array[backpacks] of int: capacity指定每个背包的容量。MiniZinc为阵列中的每个Var分配不同的域

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

会是这样的工作:array[backpacks] of var capacity: bagcaps

还是我必须做的是这样:array[backpacks] of var 1..MAX: bagcaps

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

谢谢。

回答

1

没有捷径来限制数组声明中特定元素的域。传统的版本是你写的最后一个:

但是,你可以以此为谓词(并将其放置在一个单独的文件,然后导入模型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来声明。