2017-05-05 6 views
0

配列を持っています:array[backpacks] of int: capacity各バックパックの容量を指定しています。MiniZincは、配列内の各変数に異なるドメインを割り当てます。

今、制約ソルバーが満たす必要がある変数の配列を作成したいと思います。私は各変数がドメイン1の値を取るようにしたい。容量は上記の配列で指定された容量に対応する。

この作品は次のようなものですか?array[backpacks] of var capacity: bagcapsarray[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 intの代わりにvar 1..max(capacity)を使用して宣言を使用することをおすすめします。

関連する問題