param m, integer, > 0; /* number of conversation partners */ param n, integer, > 0; /* number of students */ set CP := 1..m; /* set of conversation partners */ set S := 1..n; /* set of students */ set days := {'Mo','Tu','We','Th','Fr'}; /* set days :=1..2; */ set hours := 0..7; set TS := days cross hours; /* all possible times_slots */ set CPA within CP cross TS; /* conversation partners availability */ set CPUN := CP cross TS diff CPA; /* conversation partners unavailability */ set SA within S cross TS; /* students availability */ set SUN := S cross TS diff SA; /* students unavailability */ param level{i in S}, >0; /* english level of students */ param nationality{i in S}, symbolic, in {'Brazil', 'China', 'France', 'Japan', 'Korea', 'Arabia', 'Taiwan', 'Thailand', 'Tunisia', 'Turkey'}; /* nationality of students */ param limit{j in CP}, >0; /* max. number of sessions per CP per week */ var x{i in S, j in CP, (d,h) in TS} ; /* x[i,j,t]=1 means student i and conversation partner are scheduled to have a session on day d at h hours */ s.t. student_load{i in S}: sum{j in CP, (d,h) in TS} x[i,j,d,h]<=1; /* each student has exactly one conversation lesson per week */ /* s.t. student_feasible{i in S, j in CP, (i,d,h) in SUN}: x[i,j,d,h]=0; MORE COMPACT FORMLUATION: */ s.t. student_feasible{i in S}: sum{j in CP, (i,d,h) in SUN} x[i,j,d,h]=0; /* each student has no session when not available */ s.t. partner_load{j in CP}: sum{i in S, (d,h) in TS} x[i,j,d,h]<=limit[j]; /* no partner must be overloaded */ /* s.t. partner_feasible{j in CP, i in S, (j,d,h) in CPUN}: x[i,j,d,h]=0; MORE COMPACT FORMLUATION: */ s.t. partner_feasible{j in CP}: sum{i in S, (j,d,h) in CPUN} x[i,j,d,h]=0; /* partner has no session when not available */ s.t. session{j in CP, (d,h) in TS}: sum{i in S} x[i,j,d,h]<=2; /* at most two [should be exactly??] students per session */ s.t. feasible_pairs13{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==100} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==300} x[s_2,j,d,h]; s.t. feasible_pairs14{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==100} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==400} x[s_2,j,d,h]; s.t. feasible_pairs15{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==100} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==500} x[s_2,j,d,h]; s.t. feasible_pairs16{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==100} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==600} x[s_2,j,d,h]; s.t. feasible_pairs24{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==200} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==400} x[s_2,j,d,h]; s.t. feasible_pairs25{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==200} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==500} x[s_2,j,d,h]; s.t. feasible_pairs26{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==200} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==600} x[s_2,j,d,h]; s.t. feasible_pairs35{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==300} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==500} x[s_2,j,d,h]; s.t. feasible_pairs36{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==300} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==600} x[s_2,j,d,h]; s.t. feasible_pairs46{j in CP, (d,h) in TS}: 1 >= sum{s_1 in S: level[s_1]==400} x[s_1,j,d,h] + sum{s_2 in S: level[s_2]==600} x[s_2,j,d,h]; /* s.t. feasible_pairs{s_1 in S, s_2 in S, j in CP, (d,h) in TS: s_1 <> s_2}: if ((abs(level[s_1]-level[s_2])>1) or (nationality[s_1]=nationality[s_2])) then x[s_1,j,d,h]+x[s_2,j,d,h]<=1; */ /* two students in a session must be of about the same level and different nationality */ minimize sessions: sum{i in S, j in CP, (d,h) in TS} -x[i,j,d,h]; /* ***************************************************************** */ data; param m :=62; param n := 172; param level := 1 100 2 200 3 200 4 600 5 400 6 400 7 400 8 400 9 600 10 100 11 100 12 400 13 400 14 100 15 100 16 600 17 500 18 100 19 600 20 600 21 100 22 400 23 500 24 100 25 100 26 400 27 600 28 600 29 600 30 400 31 400 32 400 33 400 34 600 35 600 36 600 37 500 38 500 39 600 40 600 41 600 42 100 43 600 44 400 45 600 46 100 47 200 48 400 49 100 50 100 51 200 52 200 53 100 54 100 55 500 56 400 57 400 58 600 59 600 60 100 61 400 62 100 63 100 64 500 65 400 66 400 67 600 68 400 69 400 70 600 71 600 72 600 73 200 74 200 75 100 76 400 77 600 78 600 79 500 80 500 81 400 82 100 83 400 84 400 85 400 86 100 87 200 88 600 89 400 90 500 91 600 92 500 93 400 94 600 95 200 96 600 97 100 98 400 99 100 100 600 101 100 102 600 103 400 104 500 105 600 106 500 107 500 108 100 109 400 110 600 111 600 112 600 113 600 114 600 115 400 116 400 117 100 118 400 119 600 120 100 121 400 122 100 123 400 124 600 125 600 126 600 127 400 128 400 129 600 130 600 131 600 132 600 133 200 134 100 135 500 136 600 137 200 138 600 139 600 140 400 141 500 142 600 143 500 144 600 145 600 146 600 147 400 148 500 149 600 150 600 151 600 152 600 153 400 154 600 155 600 156 500 157 500 158 400 159 100 160 400 161 600 162 400 163 400 164 600 165 600 166 600 167 600 168 500 169 200 170 200 171 400 172 400; param nationality := 1 'Korea' 2 'Thailand' 3 'Korea' 4 'Japan' 5 'Taiwan' 6 'Japan' 7 'Japan' 8 'Japan' 9 'Korea' 10 'Korea' 11 'Japan' 12 'Korea' 13 'Japan' 14 'Korea' 15 'Japan' 16 'Korea' 17 'Korea' 18 'Korea' 19 'Japan' 20 'Korea' 21 'Korea' 22 'Japan' 23 'Taiwan' 24 'Taiwan' 25 'Japan' 26 'Korea' 27 'Korea' 28 'Japan' 29 'Japan' 30 'Korea' 31 'Japan' 32 'Japan' 33 'Korea' 34 'Korea' 35 'Japan' 36 'Korea' 37 'Korea' 38 'Korea' 39 'Japan' 40 'France' 41 'Korea' 42 'Thailand' 43 'Korea' 44 'Japan' 45 'Korea' 46 'Tunisia' 47 'Korea' 48 'Korea' 49 'Korea' 50 'Brazil' 51 'Japan' 52 'Japan' 53 'Korea' 54 'Korea' 55 'Taiwan' 56 'Korea' 57 'Japan' 58 'Korea' 59 'Korea' 60 'Japan' 61 'Korea' 62 'Thailand' 63 'Taiwan' 64 'Korea' 65 'Thailand' 66 'Japan' 67 'Taiwan' 68 'Korea' 69 'Taiwan' 70 'Korea' 71 'Taiwan' 72 'Korea' 73 'Korea' 74 'Japan' 75 'Japan' 76 'Taiwan' 77 'Korea' 78 'China' 79 'Korea' 80 'Korea' 81 'Taiwan' 82 'Taiwan' 83 'Japan' 84 'Japan' 85 'Korea' 86 'Korea' 87 'Korea' 88 'Taiwan' 89 'Korea' 90 'Korea' 91 'Korea' 92 'Korea' 93 'Taiwan' 94 'Korea' 95 'Japan' 96 'Korea' 97 'Taiwan' 98 'Korea' 99 'Japan' 100 'Korea' 101 'Korea' 102 'Korea' 103 'Japan' 104 'Japan' 105 'Korea' 106 'Japan' 107 'Korea' 108 'Japan' 109 'Taiwan' 110 'Japan' 111 'Korea' 112 'Korea' 113 'Japan' 114 'Korea' 115 'Taiwan' 116 'Japan' 117 'Korea' 118 'China' 119 'Japan' 120 'Thailand' 121 'Turkey' 122 'Korea' 123 'Taiwan' 124 'Japan' 125 'Korea' 126 'Korea' 127 'Korea' 128 'Japan' 129 'Korea' 130 'Korea' 131 'Japan' 132 'Korea' 133 'Brazil' 134 'Taiwan' 135 'Taiwan' 136 'China' 137 'Japan' 138 'Korea' 139 'Korea' 140 'Korea' 141 'Japan' 142 'Korea' 143 'Japan' 144 'Korea' 145 'Korea' 146 'Korea' 147 'Japan' 148 'Turkey' 149 'Korea' 150 'Japan' 151 'Taiwan' 152 'Japan' 153 'Japan' 154 'Arabia' 155 'Korea' 156 'Thailand' 157 'Korea' 158 'Korea' 159 'Japan' 160 'Turkey' 161 'Korea' 162 'Korea' 163 'Japan' 164 'China' 165 'Korea' 166 'Taiwan' 167 'Korea' 168 'Korea' 169 'Korea' 170 'Japan' 171 'Korea' 172 'Japan'; param limit := 1 7 2 1 3 2 4 2 5 5 6 2 7 6 8 2 9 1 10 2 11 2 12 6 13 2 14 3 15 2 16 1 17 2 18 1 19 2 20 4 21 1 22 2 23 2 24 1 25 1 26 4 27 2 28 1 29 4 30 1 31 1 32 3 33 2 34 1 35 3 36 4 37 4 38 2 39 6 40 2 41 2 42 4 43 2 44 5 45 2 46 2 47 3 48 2 49 1 50 4 51 4 52 2 53 1 54 2 55 4 56 2 57 2 58 3 59 7 60 6 61 5 62 5; set SA := 1 'We' 1 1 'We' 2 1 'We' 3 1 'We' 4 2 'We' 0 2 'We' 1 2 'We' 2 2 'We' 3 3 'Th' 1 3 'Th' 2 3 'Th' 3 3 'Th' 4 4 'Tu' 1 4 'Tu' 2 4 'Tu' 3 4 'Tu' 4 5 'Tu' 3 5 'Tu' 4 5 'Tu' 5 5 'Tu' 6 6 'Tu' 0 6 'Tu' 2 6 'Tu' 4 6 'Tu' 6 7 'Tu' 1 7 'Tu' 3 7 'Tu' 5 7 'Tu' 7 8 'We' 4 8 'We' 6 9 'Mo' 1 9 'Mo' 5 10 'We' 1 10 'We' 3 11 'Fr' 5 11 'Fr' 7 12 'We' 4 12 'We' 3 13 'We' 4 13 'We' 5 14 'Tu' 2 14 'Tu' 6 15 'Mo' 4 15 'Mo' 7 16 'Th' 2 16 'Th' 1 17 'Mo' 4 17 'Mo' 2 18 'Th' 5 18 'Th' 6 19 'We' 6 19 'We' 7 20 'Fr' 4 20 'Fr' 9 21 'Tu' 4 21 'Tu' 1 22 'Mo' 2 22 'Mo' 3 23 'Fr' 3 23 'Fr' 4 24 'Th' 3 24 'Th' 5 25 'Tu' 2 25 'Tu' 6 26 'We' 4 26 'We' 7 27 'Tu' 4 27 'Tu' 7 28 'Mo' 1 29 'We' 5 29 'We' 2 30 'Fr' 3 30 'Fr' 4 31 'Tu' 2 31 'Tu' 3 32 'Fr' 3 32 'Fr' 5 33 'Mo' 2 33 'Mo' 6 34 'We' 3 34 'We' 4 35 'Mo' 4 35 'Mo' 6 36 'Fr' 2 36 'Fr' 7 37 'Th' 4 37 'Th' 7 38 'We' 6 38 'We' 7 39 'We' 0 39 'We' 1 40 'Fr' 0 40 'Fr' 2 41 'Fr' 0 41 'Fr' 3 42 'Th' 3 42 'Th' 4 43 'Mo' 1 43 'Mo' 5 44 'Mo' 3 44 'Mo' 6 45 'Th' 5 45 'Th' 7 46 'Th' 0 46 'Th' 2 47 'Mo' 4 47 'Mo' 2 48 'Th' 3 48 'Th' 2 49 'We' 2 49 'We' 3 50 'Mo' 4 50 'Mo' 1 51 'We' 5 51 'We' 6 52 'Mo' 4 52 'Mo' 2 53 'Tu' 6 53 'Tu' 3 54 'Tu' 3 54 'Tu' 4 55 'We' 4 55 'We' 5 56 'Tu' 3 56 'Tu' 6 57 'Mo' 4 57 'Mo' 7 58 'We' 5 58 'We' 1 59 'Th' 2 59 'Th' 0 60 'Th' 3 60 'Th' 1 61 'Th' 2 61 'Th' 3 62 'Th' 0 62 'Th' 4 63 'We' 4 63 'We' 5 64 'Tu' 0 64 'Tu' 6 65 'Mo' 5 65 'Mo' 7 66 'Fr' 3 66 'Fr' 1 67 'Mo' 3 67 'Mo' 2 68 'We' 2 68 'We' 3 69 'We' 4 69 'We' 5 70 'We' 3 70 'We' 1 71 'Tu' 6 71 'Tu' 2 72 'Th' 4 72 'Th' 3 73 'Tu' 3 73 'Tu' 5 74 'We' 3 74 'We' 4 75 'Tu' 6 75 'Tu' 7 76 'We' 2 76 'We' 7 77 'We' 4 77 'We' 7 78 'Fr' 0 78 'Fr' 1 79 'We' 0 79 'We' 2 80 'We' 2 80 'We' 3 81 'We' 4 81 'We' 5 82 'Mo' 3 82 'Mo' 4 83 'Th' 3 83 'Th' 5 84 'Mo' 3 84 'Mo' 6 85 'Mo' 3 85 'Mo' 7 86 'Tu' 7 86 'Tu' 0 87 'Mo' 6 87 'Mo' 1 88 'Mo' 2 88 'Mo' 3 89 'Th' 0 89 'Th' 4 90 'Mo' 4 90 'Mo' 5 91 'Mo' 4 91 'Mo' 3 92 'We' 4 92 'We' 2 93 'Mo' 4 93 'Mo' 1 94 'Tu' 5 94 'Tu' 6 95 'Tu' 2 95 'Tu' 7 96 'Tu' 3 96 'Tu' 6 97 'Mo' 4 97 'Mo' 6 98 'Mo' 1 98 'Mo' 6 99 'Mo' 4 99 'Mo' 6 100 'Tu' 1 100 'Tu' 7 101 'We' 0 101 'We' 6 102 'We' 3 102 'We' 7 103 'We' 1 103 'We' 6 104 'We' 3 104 'We' 5 105 'Th' 3 105 'Th' 6 106 'We' 3 106 'We' 7 107 'Tu' 4 107 'Tu' 7 108 'We' 3 108 'We' 5 109 'Fr' 4 109 'Fr' 5 110 'Tu' 3 110 'Tu' 2 111 'Mo' 5 111 'Mo' 2 112 'We' 6 112 'We' 1 113 'Tu' 1 113 'Tu' 0 114 'We' 6 114 'We' 1 115 'Mo' 3 115 'Mo' 2 116 'Mo' 6 116 'Mo' 3 117 'Th' 4 117 'Th' 2 118 'Mo' 2 118 'Mo' 4 119 'Tu' 3 119 'Tu' 5 120 'Tu' 4 120 'Tu' 6 121 'Th' 4 121 'Th' 7 122 'Tu' 2 122 'Tu' 6 123 'Th' 3 123 'Th' 5 124 'Th' 3 124 'Th' 4 125 'Th' 3 125 'Th' 2 126 'Mo' 3 126 'Mo' 1 127 'Tu' 3 127 'Tu' 2 128 'We' 3 128 'We' 4 129 'Tu' 2 129 'Tu' 3 130 'Th' 4 130 'Th' 5 131 'Fr' 2 131 'Fr' 5 132 'We' 2 132 'We' 6 133 'We' 4 133 'We' 7 134 'We' 3 135 'We' 1 135 'We' 2 136 'Tu' 4 136 'Tu' 2 137 'Th' 4 137 'Th' 3 138 'Mo' 4 138 'Mo' 3 139 'Th' 3 139 'Th' 2 140 'We' 4 140 'We' 1 141 'We' 0 141 'We' 2 142 'Mo' 5 142 'Mo' 4 143 'Mo' 4 143 'Mo' 5 144 'Tu' 3 144 'Tu' 6 145 'Mo' 1 145 'Mo' 7 146 'We' 1 146 'We' 7 147 'Th' 5 147 'Th' 6 148 'Mo' 3 148 'Mo' 4 149 'Mo' 2 149 'Mo' 3 150 'Mo' 5 150 'Mo' 1 151 'Mo' 5 151 'Mo' 2 152 'Tu' 3 152 'Tu' 4 153 'Tu' 1 153 'Tu' 5 154 'Fr' 3 154 'Fr' 2 155 'Th' 4 155 'Th' 7 156 'We' 2 156 'We' 6 157 'Mo' 4 157 'Mo' 5 158 'We' 3 158 'We' 6 159 'We' 1 159 'We' 7 160 'Mo' 2 160 'Mo' 6 161 'Fr' 3 161 'Fr' 5 162 'Th' 1 162 'Th' 6 163 'Mo' 4 163 'Mo' 5 164 'We' 2 164 'We' 6 165 'Tu' 4 165 'Tu' 7 166 'We' 5 166 'We' 6 167 'Tu' 4 167 'Tu' 6 168 'Fr' 3 168 'Fr' 4 169 'We' 2 169 'We' 5 170 'Fr' 3 170 'Fr' 6 171 'We' 2 171 'We' 7 172 'Tu' 6 172 'Tu' 7; set CPA := 1 'Fr' 3 1 'Mo' 3 1 'Mo' 4 1 'Th' 3 10 'We' 0 11 'Mo' 4 12 'Mo' 6 12 'Tu' 7 12 'We' 6 13 'We' 3 14 'Th' 2 14 'Th' 3 15 'Th' 4 15 'Th' 5 16 'Fr' 0 17 'Tu' 6 18 'We' 4 19 'Fr' 0 2 'We' 4 20 'Tu' 2 20 'Tu' 3 21 'Th' 1 22 'Th' 5 23 'We' 4 24 'Th' 2 25 'Mo' 5 26 'We' 4 26 'We' 5 27 'We' 3 28 'Tu' 3 29 'Mo' 4 29 'Mo' 5 3 'Tu' 4 30 'Th' 4 31 'We' 4 32 'Mo' 3 32 'We' 2 32 'We' 3 33 'We' 3 34 'Tu' 2 35 'Mo' 3 35 'Mo' 4 36 'Mo' 3 36 'Mo' 4 37 'Tu' 6 37 'We' 6 38 'We' 1 39 'Fr' 2 39 'Mo' 4 39 'We' 4 4 'Fr' 3 40 'Tu' 1 41 'We' 5 42 'Fr' 3 42 'Th' 3 43 'Mo' 5 44 'Mo' 2 44 'Mo' 3 44 'We' 4 45 'We' 3 46 'Mo' 4 47 'Th' 4 47 'Tu' 3 48 'Th' 2 49 'We' 2 5 'Fr' 2 5 'Mo' 2 5 'We' 2 50 'Fr' 4 50 'Th' 4 51 'Tu' 3 51 'Tu' 4 52 'Fr' 3 53 'Th' 0 54 'We' 0 55 'Mo' 4 55 'Mo' 5 55 'We' 4 56 'We' 2 57 'Tu' 0 58 'Mo' 1 58 'Mo' 2 59 'Tu' 2 59 'We' 0 59 'We' 1 59 'We' 2 6 'Th' 0 60 'Th' 3 60 'Tu' 4 60 'Tu' 5 61 'Mo' 1 61 'Th' 4 61 'Tu' 3 62 'Tu' 3 62 'Tu' 4 7 'Mo' 3 7 'Mo' 4 7 'We' 2 7 'We' 3 8 'Th' 3 9 'Tu' 2; end;