model Trasloco uses "mmxprs"; !gain access to the Xpress-Optimizer solver parameters NO = 10 !numero di oggetti NR = 3 !numero di stanze NC = 9 !numero di contenitori end-parameters declarations O=1..NO !oggetti R=1..NR !stanze C=1..NC !contenitori !parametri W:array(O) of integer !peso dell'oggetto o H:array(O) of integer !altezza dell'oggetto o ROOM:array(O) of integer !stanza associata all'oggetto o WMAX:array(C) of integer !peso massimo che riesce a sopportare il contenitore c HMAX:array(C) of integer !altezza del contenitore c COST:array(C) of integer !costo fisso per l'impiego del contenitore c PEN:array(C) of integer !penalità per unità di altezza in eccesso per il contenitore c TYPE:array(C) of integer !tipologia del contenitore c !variabili decisionali x:array(C) of mpvar !x(c): 1, se nel trasloco è stato impiegato il contenitore c, 0 altrimenti z:array(C,R) of mpvar !z(c,r): 1, se il contenitore c è stato utilizzato per contenere oggetti della stanza r, 0 altrimenti y:array(C,O) of mpvar !y(c,o): 1, se l'oggetto o è stato riposto nel contenitore c hPlus:array(C) of mpvar !hhPlus(c): differenza tra l'altezza dell'oggetto più alto contenuto nel contenitore c e quella del contenitore c nel caso in cui questa sia positiva, 0 altrimenti end-declarations forward procedure printSol W::[ 23, 4, 14, 17, 8, 12, 15, 19, 12, 17] H::[ 10, 15, 18, 12, 10, 5, 16, 19, 22, 29] ROOM::[1, 1, 1, 1, 2, 2, 2, 3, 3, 3] WMAX::[20, 20, 20, 20, 40, 40, 40, 60, 60] HMAX::[15, 15, 15, 15, 10, 10, 10, 12, 12] COST::[100, 100, 100, 100, 200, 200, 200, 250, 250] PEN::[20, 20, 20, 20, 15, 15, 15, 30, 30] TYPE::[1, 1, 1, 1, 2, 2, 2, 3, 3] forall(c in C) do x(c) is_binary forall(o in O) y(c,o) is_binary forall(r in R) z(c,r) is_binary end-do !l'oggetto o può essere inserito nel contenitore c se il contenitore c è impiegato nel trasloco forall(c in C, o in O) y(c,o) <= x(c) !ogni oggetto deve essere inserito in un contenitore forall(o in O) sum(c in C) y(c,o) = 1 !il contenitore c viene impiegato nel trasloco se e solo se c contiene oggetti di una e una sola stanza r forall(c in C) x(c) = sum(r in R) z(c,r) !hPlus(c): massima altezza degli oggetti o contenuti nel contenitore c forall(c in C, o in O) hPlus(c) + HMAX(c) >= H(o)*y(c,o) !se un contenitore c contiene oggetti della stanza r non può contenere oggetti di altre stanze forall(c in C, r in R) sum(o in O | ROOM(o)<>r ) y(c,o) <= NO*(1-z(c,r)) !la somma dei pesi degli oggetti o contenuti dal contenitore c non deve eccedere il peso massimo sopportato da c forall(c in C) sum(o in O) W(o)*y(c,o) <= WMAX(c) totCost:= sum(c in C) (x(c)*COST(c) + PEN(c)*hPlus(c)) !setparam("XPRS_MIPRELSTOP", 0.01) !setparam("XPRS_VERBOSE", true) minimize(totCost) writeln("\n**************************************************\n") printSol procedure printSol writeln("Costo totale : ", getobjval, "\n") forall(c in C | getsol(x(c)) = 1) do writeln("Contenitore di tipo ", TYPE(c), " ( WMAX=", WMAX(c), ", HMAX=", HMAX(c), ", hPlus=", getsol(hPlus(c)),")") forall(o in O | getsol(y(c,o)) = 1) do writeln("Oggetto ", o, " ( w=", W(o), ", H=", H(o), ")") end-do writeln("") end-do end-procedure end-model