0

私は、ゴルファーの問題に一連のセットを持っています (各週に、2 人のプレーヤーが 2 回以上一緒にプレーせず、全員が毎週 1 回だけプレーするように、グループを形成する必要があります)。

int: gr; %number of groups
set of int: G=1..gr;
int: sz; %size of groups
set of int: S=1..sz;
int: n=gr*sz; %number of players
set of int: P=1..n;
int: we; % number of weeks
set of int: W=1..we;

include "globals.mzn";

array[G,W] of var set of P: X; %X[g,w] is the set of people that form group g in week w

私の制約は次のとおりです(すべてが正しく機能するかどうかはまだわかりません):

constraint forall (g in G, w in W) (card (X[g,w]) = sz); %Each group should have size sz

constraint forall (w in W, g,h in G where g > h) (disjoint(X[g,w], X[h,w])); % Nobody plays twice in one week

constraint forall (w,u in W where w > u) (forall (g,h in G) (card(X[g,w] intersect X[h,u]) <= 1 )); % Two players never meet more than once

constraint forall (w in 2..we) (w+sz-1 in X[1,w] /\ 1 in X[1,w]); %Symmetries breaking: week permutations

constraint forall (w in W, g in 1..gr-1) ( min(X[g,w]) < min(X[g+1,w]) ); %Symmetries breaking: group permutations

constraint forall (g in G, s in S) ( s+sz*(g-1) in X[g,1]);

solve satisfy;

output [ show(X[i,j]) ++ if j == we then "\n" else " " endif | i in 1..gr, j in 1..we ];

私の問題は、制約番号 5 にあります。「int の var セット: x」で min を使用することはできません。「int のセット: x」で使用する必要があります。残念ながら、私はこれら2つの違いを理解していません(私が読んだことから、これは各セットのサイズの定義に関連している可能性がありますが、よくわかりません)。

誰かが私に問題を説明し、解決策を提案してもらえますか? とても感謝しています。ありがとう!

4

2 に答える 2

0

私は解決策を見つけました。この場合、最大関数を可能にするためにセットの要素の配列を作成する必要があります。

constraint forall (w in 2..we) ( max([i | i in X[1,w-1]]) < max([i | i in X[1,w]])); %Symmetries breaking: week permutations

constraint forall (w in W, g in 1..gr-1) ( min([i | i in X[g,w]]) < min([i | i in X[g+1,w]]));% Symmetries breaking: group permutations (I have been trying to speed up the constraint above, but it does not work with var set of int..)
于 2016-11-10T17:47:48.003 に答える
0

まず、Avarは決定変数です。すべての Minizinc プログラムの目標は、すべての決定変数の値を決定することです。値が何であるかがわからず、値を見つけようとしています。でないものは、var単に既知の数です。(セットの使用は無視)

min(X[g,w])決定変数 ( ) の処理は、 Minizincvarには実装されていません。その理由はX[g,w] < X[g+1,w]、min なしで使用する方が理にかなっているからです。すべての数値の代わりに、両方のセットで最小の数値のみを制約するのはなぜですか。つまり {1,3,5} < {1,4} の代わりに1 < 1

(MiniZinc が < on セットであることを願っているので、嘘をつきません。よくわかりません)

于 2016-11-05T19:31:27.113 に答える