MiniZinc 为数组中的每个 Var 分配不同的域
MiniZinc Assign Different Domain to Each Var in Array
我有一个数组: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]
?
谢谢。
没有捷径可以限制数组声明中特定元素的域。繁体版就是你上次写的:
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
.
的声明
我有一个数组: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]
?
谢谢。
没有捷径可以限制数组声明中特定元素的域。繁体版就是你上次写的:
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
.