我在Golfers問題中設置了一組數組(每週都應該組成一個組,一次,每個人都確切地扮演着每星期一次):Minizinc「var set of int:x」,而不是「set of int:x」
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.我不能在「var set of int:x」上使用min,我應該在「set of int:x」上使用它。不幸的是,我不明白這兩者之間的區別(從我讀過的內容來看,這可能與定義每組的大小有關,但我不確定)。
有人可以向我解釋這個問題並提出解決方案嗎?我會非常感激。謝謝!
嗨:)謝謝你的答案。 如果我們限制所有的數字,我們不僅會刪除對稱性,還會刪除「好」的解決方案。通過制定我想在周羣組排列中擺脫的約束條件。 例如,如果我們得到一個包含{1,2,6} {3,4,5} {7,8,9}組的星期,那麼條件將不會被滿足。我不明白,爲什麼它不應該。 – Kuba