model ModelName uses "mmxprs"; !gain access to the Xpress-Optimizer solver forward procedure printSolution declarations FIS = 1..4 ! fisioterapisti H = 1..8 ! ore lavorative della giornata maxTurno = 5 ! durata massima di un turno numLocali = 3 ! numero di locali dello studio DPaz: array(H) of integer ! numero di pazienti per ora CostF: array(FIS) of real ! costo fisso per la chiamata del fisioterapista f CostH: array(FIS) of real ! costo orario del fisioterapista f maxPazServ: array(FIS)of integer ! numero massimo di pazienti serviti dal fisioterapista f in un'ora x: array(FIS, H) of mpvar ! 1 se il fisioterapista f lavora nell'ora h ! 0 altrimenti y: array(FIS, H) of mpvar ! 1 se il fisioterapista f inizia il turno nell'ora h ! 0 altrimenti z: array(FIS) of mpvar ! 1 se il fisioterapista f viene chiamato a lavorare ! 0 altrimenti end-declarations DPaz::[8, 12, 10, 13, 15, 9, 12, 7] CostF::[50, 60, 40, 40] CostH::[25, 20, 18, 22] maxPazServ::[8, 6, 4, 6] forall(f in FIS) do z(f) is_binary forall(h in H) do x(f,h) is_binary y(f,h) is_binary end-do end-do forall(f in FIS) do sum(h in H) y(f,h) = z(f) ! ogni fisioterapista, se chiamato a lavorare, inizia in una sola ora il turno sum(h in H) x(f,h) <= maxTurno ! ogni fisioterapista non pu� avere un turno di durata maggiore della durata massima end-do forall(h in H) do sum(f in FIS) x(f,h) <= numLocali ! non pu� lavorare contemporaneamente un numero di fisioterapisti maggiore del numero di locali disponibili nello studio sum(f in FIS) x(f,h)*maxPazServ(f) >= DPaz(h) ! ogni ora i fisioterapisti in servizio devono soddisfare la domanda di pazienti end-do forall(f in FIS, h in H) do x(f,h) <= sum(t in 1..h) y(f,t) ! se un fisioterapista lavora nell'ora h allora il suo turno deve essere iniziato in un ora precedente o uguale ad h end-do cost:= sum(f in FIS)(z(f)*CostF(f) + sum(h in H)(x(f,h)*CostH(f))) writeln("Begin running fisrt model \n\n") !setparam("XPRS_VERBOSE", true) minimize(cost) printSolution writeln("\n\nEnd running first model") writeln("Begin running second model \n\n") forall(h in H) x(2,h) + x(3,h) <= 1 ! f2 e f3 non possono lavorare contemporaneamente forall(h in 1..2) x(1,h)=0 ! f1 non � disponibile le prime due ore della giornata forall(f in FIS, h in H | h+1 in H) do !continuit� del turno ! le variabili decisionali x devono essere monotone decrescenti a meno che il turno non sia gi� iniziato x(f,h) >= x(f,h+1) - y(f, h+1) end-do minimize(cost) printSolution writeln("\n\nEnd running second model") procedure printSolution writeln("costo totale: " + getsol(cost)) write("H: \t") forall(h in H) do write("" + h + "("+ DPaz(h) +")\t") end-do write("\n") forall(f in FIS) do write("F" + f + "\t") forall(h in H) do write(if(getsol(x(f,h))=1, "X("+ maxPazServ(f) +")", " ") + "\t") end-do write("\n") end-do end-procedure end-model