2017-05-05 50 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來聲明。

相關問題