簡體   English   中英

MiniZinc為數組中的每個Var分配不同的域

[英]MiniZinc Assign Different Domain to Each Var in Array

我有一個數組: array[backpacks] of int: capacity指定每個背包的容量。

現在,我想創建約束求解器必須滿足的變量數組。 我希望每個變量取域1..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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM