model OptimalPath uses "mmxprs"; !gain access to the Xpress-Optimizer solver parameters ND = 10 !numero di dipendenti NS = 6 !numero di settimane NR = 3 !numero di reparti end-parameters declarations D=1..ND S=1..NS R=1..NR !parametri W:array(D) of integer !numero della prima settimana di ferie richiesta dal dipendente d REP:array(D) of integer !reparto in cui lavora il dipendente d N:array(S,R) of integer !numero di dipendenti necessari nel reparto r durante la settimana s !variabili decisionali x:array(D,S) of mpvar !x(d,s): 1, se s è una settimana di ferie per il dipendente d, 0 altrimenti y:array(D) of mpvar !y(d): spostamento delle ferie assegnato al dipendente d (numero di settimane) t:array(D) of mpvar !t(d): 1, se al dipendente d sono state spostate le settimane di ferie, 0 altrimenti u:array(D) of mpvar !u(d): 1, se al dipendente d sono state anticipate le settimane di ferie, 0 altrimenti totS: mpvar !spostamento totale nS: mpvar !numero dipendenti per i quali sono state spostate le ferie !vincoli maxSettimane:array(D) of linctr !ad ogni dipendente si possono spostare le ferie di al più 2 settimane end-declarations forward procedure printSol W::[1, 3, 1, 2, 1, 1, 3, 4, 2, 5] REP::[1, 1, 1, 2, 2, 3, 3, 3, 3, 3] N::[ 2,2,3, 1,1,4, 2,1,3, 3,1,3, 2,1,2, 2,2,3] forall(d in D) y(d) is_integer forall(d in D) t(d) is_binary forall(d in D) u(d) is_binary !2 settimane consecutive di ferie forall(d in D) sum(s in S) s*x(d,s) is_sos2 forall(d in D, s in S) x(d,s) <= 1 forall(d in D) sum(s in S) x(d,s) = 2 !si deve assicurare che in ogni settimana si abbia a disposizione un numero minimo di dipendenti per reparto forall(s in S, r in R) sum(d in D | REP(d)=r) (1-x(d,s)) >= N(s,r) forall(d in D) do y(d) >= (sum(s in S)s*x(d,s) - (2*W(d)+1))/2 y(d) <= (sum(s in S)s*x(d,s) - (2*W(d)+1))/2 + 2*NS*u(d) y(d) >= (2*W(d)+1 - sum(s in S)s*x(d,s))/2 y(d) <= (2*W(d)+1 - sum(s in S)s*x(d,s))/2 + 2*NS*(1-u(d)) end-do forall(d in D) do y(d) <= NS*t(d) t(d) <= y(d) end-do !a ciascun dipendente si possano spostare le ferie al massimo di 2 settimane. forall(d in D) maxSettimane(d) := y(d)<=2 totS = sum(d in D) y(d) nS = sum(d in D) t(d) !setparam("XPRS_VERBOSE", true) minimize(totS) writeln("\n*************1*************\n") printSol forall(d in D) sethidden(maxSettimane(d), true) minimize(nS) writeln("\n*************2*************\n") printSol procedure printSol writeln("Spostamento totale: ", getsol(totS)) writeln("Dipendenti interessati: ", getsol(nS)) forall(d in D ) do write("Dipendente ",d,"\tsettimane richieste: ", W(d), " e ", W(d)+1,"\tspostamento: ",getsol(y(d)), "\tsettimane ottenute: ") forall(s in S | getsol(x(d,s))>=1) write(" ", s) writeln("") end-do writeln("") forall(s in S ) do d1 := sum(d in D|REP(d)=1)(1-getsol(x(d,s))) d2 := sum(d in D|REP(d)=2)(1-getsol(x(d,s))) d3 := sum(d in D|REP(d)=3)(1-getsol(x(d,s))) writeln("Settimana ",s,"\tRep 1: ", d1,"\tRep 2: ", d2,"\tRep 3: ", d3) end-do end-procedure end-model