# sets set P; set S; set A; set J; set H; # parameters param K {a in A, j in J}; param C {a in A, p in P}; param G {a in A, h in H}; param D {a in A}; param N {a in A, h in H}; param T {a in A, s in S}; param Q {a in A, h in H}; param R {a in A}; param I {a in A, b in A}; param j symbolic; param s symbolic; param in_nb; param m; param ca symbolic; # variables var x {a in A, p in P}, binary; var y {a in A, p in P, h in H}, binary; # maximize maximize z: sum{a in A} (R[a] * sum{p in P} x[a,p]); #constraints s.t. AvailableForDay{a in A, p in P}: x[a,p] <= K[a,j]; s.t. AvailableForSeason{a in A, p in P}: x[a,p] <= T[a,s]; s.t. MaxClient{a in A, p in P,h in H}: y[a,p,h] <= (if in_nb > N[a,h] then 0 else 1); s.t. MaxMachin{a in A, p in P,h in H}: y[a,p,h] <= (if in_nb > Q[a,h] then 0 else 1); s.t. AvailableForCategory{a in A, p in P}: x[a,p] <= C[a,p]; s.t. AvailableForStartHour{a in A, p in P,h in H}: y[a,p,h] <= G[a,h]; s.t. PreviousActivityIsFinished{ha in H, hb in H,a in A,b in A,p in P}: y[a,p,ha] + y[b,p,hb] <= (if (ha < hb + D[b]) && (ha >= hb) && a!=b then 1 else 2); s.t. IncompatibleActivity{a in A,b in A,p in P}: if I[a,b] = 0 then x[a,p] + x[b,p] <= 1; s.t. StartOfActivity{a in A,p in P}: sum{h in H} y[a,p,h] = x[a,p]; s.t. MaxNumberOfActivityPerDay{p in P}: sum{a in A} x[a,p] <= m; s.t. CastleIsMandatoryActivity{p in P}: x['castle',p] = 1; solve; printf "\n"; printf "solution\n"; printf{a in A} "%s %d %d %d \n",a,x[a,'vip'],x[a,'fun'],x[a,'history']; for {p in P} { printf "=== %s ===\n",p; for {h in H} { printf "%d",h; for {a in A} { printf " %s:%d",a,y[a,p,h]; } printf "\n"; } }