this repo has no description
at develop 1.2 kB view raw
1include "partition_set.mzn"; 2int: weeks; set of int: WEEK = 1..weeks; 3int: groups; set of int: GROUP = 1..groups; 4int: size; set of int: SIZE = 1..size; 5int: ngolfers = groups*size; 6set of int: GOLFER = 1..ngolfers; 7 8array[WEEK,GROUP] of var set of GOLFER: Sched; 9 10% constraints 11constraint 12 forall (i in WEEK, j in GROUP) ( 13 card(Sched[i,j]) = size 14 /\ forall (k in j+1..groups) ( 15 Sched[i,j] intersect Sched[i,k] = {} 16 ) 17 ) /\ 18 forall (i in WEEK) ( 19 partition_set([Sched[i,j] | j in GROUP], GOLFER) 20 ) /\ 21 forall (i in 1..weeks-1, j in i+1..weeks) ( 22 forall (x,y in GROUP) ( 23 card(Sched[i,x] intersect Sched[j,y]) <= 1 24 ) 25 ); 26% symmetry 27 constraint 28 % Fix the first week % 29 forall (i in GROUP, j in SIZE) ( 30 ((i-1)*size + j) in Sched[1,i] 31 ) /\ 32 % Fix first group of second week % 33 forall (i in SIZE) ( 34 ((i-1)*size + 1) in Sched[2,1] 35 ) /\ 36 % Fix first 'size' players 37 forall (w in 2..weeks, p in SIZE) ( 38 p in Sched[w,p] 39 ); 40 41solve satisfy; 42 43output [ show(Sched[i,j]) ++ " " ++ 44 if j == groups then "\n" else "" endif | 45 i in WEEK, j in GROUP ];