model FunEGo uses "mmxprs"; !gain access to the Xpress-Optimizer solver parameters NF = 4 !tipologie di funghi NS = 8 !numero di settimane NR = 4 !numero di settimane di resa CAPFRIGO = 200 !capacità massima del frigo (kg) CAPSERRA = 220 !capacità massima della serra (numero di ballette) end-parameters declarations F=1..NF S=1..NS S0=0..NS R=1..NR !parametri RESA:array(F,R) of integer !produzione in kg di una balletta di tipo f, r settimane dopo l'acquisto DOMANDA:array(F,S) of integer !domanda in kq di fungo f prevista nella settimana s SETTIMANEFRIGO:array(F) of integer !numero di settimane in cui funghi di tipo f possono stare in frigo prima della vendita !variabili decisionali x:array(F,S0) of mpvar !x(f,s): nummero di ballette di tipo f acquistate nella settimana s y:array(F,S0) of mpvar !y(f,s): kg di fungo f prodotti nella settimana s z:array(F,S0) of mpvar !z(f,s):, kg di fungo f avanzati nella settimana s e disponibili per la vendita nella settimana successiva n:array(F,S0) of mpvar !n(f,s): nummero di ballette attive di tipo f ospitate nella serra nella settimana s end-declarations forward procedure printSol RESA::[ 10,7,4,1, 5,4,2,0, 8,7,5,1, 6,4,2,0] DOMANDA::[ 300,300,320,320,350,350,400,500, 200,200,200,200,200,250,250,250, 300,300,200,200,100,0,0,0, 0,100,200,300,350,350,300,300] SETTIMANEFRIGO::[0,2,1,1] forall(f in F, s in S0) do x(f,s) is_integer y(f,s) is_integer z(f,s) is_integer n(f,s) is_integer end-do !la settimana 0 è la prima settimana in cui si possono acquistare ballette, la produzione è ancora nulla forall(f in F) do y(f,0) = 0 z(f,0) = 0 n(f,0) = x(f,0) end-do forall(f in F, s in S) do !kg di fungo f prodotti nella settimana s y(f,s) = sum(r in R | s-r >=0) x(f, s-r)*RESA(f,r) !kg di fungo f avanzati nella settimana s e disponibili per la vendita nella settimana successiva z(f,s) <= y(f,s) + z(f,s-1) - DOMANDA(f,s) z(f,s) <= sum( t in S0 | t < SETTIMANEFRIGO(f) ) y(f, s-t) !numero di ballette attive di tipo f ospitate nella serra nella settimana s n(f,s) = sum(r in R | s-r+1 >=0 AND RESA(f,r) > 0 ) x(f, s-r+1) end-do !Fun&Go ha una serra capace di ospitare 220 ballette contemporaneamente forall(s in S0) sum(f in F) n(f,s) <= CAPSERRA nB:= sum(f in F, s in S0) x(f,s) setparam("XPRS_MIPRELSTOP", 0.01) !setparam("XPRS_VERBOSE", true) minimize(nB) writeln("\n*************1*************\n") printSol !l frigo può contenere al massimo 200kg di prodotti ogni settimana forall(s in S0) sum(f in F) z(f,s) <= CAPFRIGO minimize(nB) writeln("\n*************2*************\n") printSol procedure printSol writeln("Totale ballette acquistate : ", getobjval ) forall(s in S0 ) do writeln("Settimana ", s, ":") forall(f in F ) do writeln("Fungo ",f,"\tballette acquistate: ", getsol(x(f,s)), "\t\t prodotti: ",getsol(y(f,s)),"kg\t\t refrigerati: ",getsol(z(f,s)),"kg", if(s>0, "\t\tdomanda: " + DOMANDA(f,s), "")) end-do writeln("numero di ballette: ", sum(f in F) getsol(n(f,s)), "\n") end-do end-procedure end-model