this repo has no description
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 ];