model ModelName uses "mmxprs"; !gain access to the Xpress-Optimizer solver !optional parameters section !parameters ! SAMPLEPARAM1="c:\test\" ! SAMPLEPARAM2=false !end-parameters !sample declarations section ! Nota il costo degli straordinari è sempre inferiore a quello ordinario ! Non serve quindi vincolare ultreriormente che è obbligatorio usare ! tutti gli straordinari declarations NumMesi=5 Mesi = 1..5 MesiFrom2To4 = 2..4 !NON SERVE - LC ****************** Prod = 1..2 MesiMag = 0..5 !AGGIUNTO - LC ************* rt: array(Mesi) of integer ot: array(Mesi) of integer venduto: array(Prod, Mesi) of integer costoRT: array(Prod, Mesi) of integer costoOT: array(Prod, Mesi) of integer costoMag: array(Prod, Mesi) of integer ! unità da produrre per ogni tipo di prodotto e mese prodotto: array(Prod, Mesi) of mpvar prodottoOrd:array(Prod, Mesi) of mpvar prodottoStra:array(Prod, Mesi) of mpvar ! il magazzino (contenuto per ogni mese) mag: array(Prod, MesiMag) of mpvar ! ... Objective:linctr end-declarations rt::[10, 8, 10, 12, 6] ot::[3, 2, 3 ,4, 5] venduto::[7,5,5,8,3, 4,4,7,4,5] costoRT::[15,17,19,13,18, 16,15,17,15,16] costoOT::[18,20,22,17,22, 20,18,22,20,19] costoMag::[1,2,3,2,0, 2,1,2,4,0] ! Vincoli forall(m in Mesi) do !non è possibile superare il numero complessivo (ordinario+straord) !di prodotti ogni mese sum(p in Prod) prodotto(p, m) <= rt(m)+ot(m) sum(p in Prod) prodottoOrd(p, m) <= rt(m) sum(p in Prod) prodottoStra(p, m) <= ot(m) end-do forall(p in Prod, m in Mesi) do ! La produzione deve soddisfare le richieste. ! Deve essere superiore o uguale a zero. ! Ci si può però avvalere del contenuto del magazzino in quel mese prodotto(p, m) + mag(p, m-1) >= venduto(p, m) !**** MODIFICATO - LC ! vincoli prodotto(p, m) = prodottoOrd(p, m) + prodottoStra(p, m) (!prodotto(p, m) >= 0 prodottoOrd(p, m) >= 0 prodottoStra(p, m) >= 0 QUESTI VINCOLI NON SERVONO - LC ********************** !) end-do !forall(p in Prod, m in MesiFrom2To4) do forall(p in Prod, m in 1..4) do ! il primo mese il magazino è vuoto ! gli altri vale il contenuto del mese precedente, più (o meno) la ! differenza tra produzione e vendita del mese precedente mag(p, m) = mag(p, m-1) + (prodotto(p, m) - venduto(p, m)) !***MODIFICATO - LC**** ! il magazzino deve sempre essere ovviamente maggiore o uguale a zero ! mag(p, m) >= 0 NON SERVE - LC ************************* end-do forall(p in Prod) do ! mag(p, 1) = 0 ELIMINATO - LC ******************** mag(p, 0) = 0 !AGGIUNTO - LC ************************* mag(p, NumMesi) = 0 end-do ! alla fine il magazzino deve essere vuoto !forall(p in Prod)mag(p, NumMesi) = 0 è ripetuto LC **************** ! il costo di magazzino è relativo a ciò che è stato prodtto in più ! determiniamo prima il costo di magazzino, poi gli altri cMag := sum(p in Prod, m in Mesi) mag(p, m)*costoMag(p, m)*1000 ! costo di produzione cRT := sum(p in Prod, m in Mesi) prodottoOrd(p,m)*costoRT(p, m)*1000; cOT := sum(p in Prod, m in Mesi) prodottoStra(p,m)*costoOT(p, m)*1000; cost := cMag+cRT+cOT minimize(cost) writeln("Begin running model") writeln("Costo totale di produzione: ", getobjval) writeln(" "); forall(m in Mesi) do writeln("ProdTot di tipo A e B per il mese ", m, ":", getsol(prodotto(1, m)), " ", getsol(prodotto(2, m))) writeln("ProdOrd di tipo A e B per il mese ", m, ":", getsol(prodottoOrd(1, m)), " ", getsol(prodottoOrd(2, m))) !AGGIUNTO- LC ****************** writeln("ProdStr di tipo A e B per il mese ", m, ":", getsol(prodottoStra(1, m)), " ", getsol(prodottoStra(2, m))) !AGGIUNTO- LC ****************** writeln("ProdMag di tipo A e B per il mese ", m, ":", getsol(mag(1, m)), " ", getsol(mag(2, m))) !AGGIUNTO- LC ****************** writeln("**************************") !AGGIUNTO- LC ****************** end-do writeln("End running model") end-model