Sei sulla pagina 1di 119

Linguaggio GAMS

Il GAMS è un linguaggio algebrico per la


lettura da parte del calcolatore e per la
soluzione di modelli di:
programmazione lineare,
programmazione lineare intera,
programmazione non lineare,
programmazione non lineare intera
Codifica GAMS

Da internet dal sito:


www gams.com
è possibile scaricare gratuitamente:
-la versione ridotta di GAMS
-la guida completa di GAMS, di cui può
essere interessante il Tutorial (breve)

In questa sede (MOODLE) si forniranno le


regole generali per la programmazione
lineare e lineare intera e molti esercizi.
Codifica GAMS
Struttura di un codice

Dichiarazione degli indici SETS


Dati scalari SCALAR
Dati vettoriali PARAMETERS
Dati matriciali TABLE
Dichiarazione di variabile VARIABLE
Dichiarazione di equazioni EQUATIONS
Espressione delle equazioni nome equazione
Dichiarazione del modello MODEL
Opzioni sul solutore OPTIONS
Comando di soluzione SOLVE
Comando di uscita dei risultati DISPLAY
Codifica GAMS
Sintassi dei comandi

Dichiarazione degli indici:


SETS
nome-indice-1/valori assunti da indice-1/,
nome-indice-2/valori assunti da indice-2/,
…;
Esempio:
SETS i/i1,i2,i3,i4/,j/ja,jb,jc/;
Per indici con cifra si può ridurre così:
SETS i/i1*i4/,j/ja,jb,jc/;
Codifica GAMS
Sintassi dei comandi

Dichiarazione degli indici:


Se lo stesso indice è usato più volte nella
stessa equazione in posizioni diverse,
bisogna assegnargli più nomi diversi con il
comando:
ALIAS (primo-nome, secondo-nome);

Esempio
ALIAS (i,j);
Codifica GAMS
Sintassi dei comandi

Dati scalari (se presenti):


SCALAR nome del dato-1/valore del dato-1/,
nome del dato-2/valore del dato-2/, … ;

Esempio:
SCALAR a/227/,pp3/21/;
Codifica GAMS
Sintassi dei comandi

Dati vettoriali (se presenti, dopo che sono stati


dichiarati gli indici relativi):
PARAMETERS
nome-vettore-1(nome-indice-1)
/sequenza-di-coppie-separate-da-virgole: valore-
indice-1 spazio valore-del-vettore-1-
corrispondente)/,
nome-vettore-2(nome-indice-2)
/sequenza-di-coppie-separate-da-virgole: valore-
indice-2 spazio valore-del-vettore-2-
corrispondente), … ;
Codifica GAMS
Sintassi dei comandi

Dati vettoriali (se presenti, dopo che sono stati


dichiarati gli indici relativi): esempio

PARAMETERS gh(i)/i1 3,i2 5,i3 42,i4 15/,


ff(j)/ja 157,jb 345,jc 121/;
Codifica GAMS
Sintassi dei comandi
Dati matriciali (se presenti, dopo che sono stati
dichiarati gli indici relativi):
TABLE nome-matrice(nomi-indici-separati-
da-virgole)
valori-indici-di-colonna-spaziati
valori-
indici- valori-corrispondenti-in-matrice
di-riga

(l’allineamento è richiesto)
Codifica GAMS
Sintassi dei comandi
Dati matriciali (se presenti, dopo che sono stati
dichiarati gli indici relativi): esempio
TABLE mat(i,j)
ja jb jc
i1 5 71 42
i2 1 1 8
I3 15 43 12
i4 11 3 4 ;

(il comando va ripetuto per ogni matrice)


Codifica GAMS
Sintassi dei comandi

Dichiarazione delle variabili:

Le variabili possono essere vettoriali, ossia


avere un indice o più indici:

VARIABLES nome-variabile-1(indice-1),
nome-variabile-2(indice-21,indice-22),
nome-variabile-3, … ;
Codifica GAMS
Sintassi dei comandi

Le variabili possono essere dichiarate:


POSITIVE non negative
NEGATIVE non positive
INTEGER intere fra 0 e 100
BINARY intere fra 0 e 1
FREE (default) senza vincoli

La variabile che esprime la funzione


obiettivo da massimizzare o minimizzare
deve essere FREE
Codifica GAMS
Sintassi dei comandi

Dichiarazione delle variabili:esempio

VARIABLES spesa, x(i), y(i,j), z;


POSITIVE VARIABLE x;
INTEGER VARIABLE y;
BINARY VARIABLE z;
Codifica GAMS
Sintassi dei comandi

Range delle variabili: di ogni variabile si


può imporre il valore massimo e minimo
(utile spesso per le variabili INTEGER che
per default sono comprese fra 0 e 100)
nome-della-variabile.up(indici-della-
variabile) = valore massimo
nome-della-variabile.lo(indici-della-
variabile) = valore minimo
Codifica GAMS
Sintassi dei comandi

Range delle variabili: il valore massimo e


minimo valgono per tutte le componenti
delle variabili; se si vuole che valgano solo
per una, si deve mettere il nome dell’indice
relativo fra apici
Codifica GAMS
Sintassi dei comandi

Range delle variabili: esempio

x.lo(i) = 15

y.up(‘i1’,’ja’) = 3
Codifica GAMS
Sintassi dei comandi

Dichiarazione di equazioni (e disequazioni):


Il nome della equazione (o disequazione) può
contenere indici, in tal caso il calcolatore ripete
l’equazione al suo interno per ogni valore
dell’indice o della combinazione di indici
EQUATIONS nome-equazione-1,nome-
equazione-2(i,j), … ;

Esempio
EQUATIONS cost, vinc1(i,j), vinc2;
Codifica GAMS
Sintassi dei comandi

Espressione delle equazioni


(o disequazioni):
nome-equazione..espressione-equazione

Il nome e l’espressione della equazione


possono contenere indici, in tal caso il
calcolatore ripete al suo interno l’equazione
per ogni valore dell’indice o della
combinazione di indici
Codifica GAMS
Sintassi dei comandi

Espressione delle equazioni


(o disequazioni):
I due membri della equazione (o
disequazione) sono separati da:

=e= (equal) che significa =


=g= (greater than) che significa ≥
=l= (less than) che significa ≤
Codifica GAMS
Sintassi dei comandi
Espressione delle equazioni (o disequazioni):
I due membri della equazione possono contenere
somme per indici con la regola:
sum(indice,espressione-dell’addendo-con- indice-
fra-parentesi)
(per un solo indice)
sum((indici-separati-da-virgole),espressione-
dell’addendo-con-indici-fra-parentesi)
(per più di un indice)

Ogni indice o combinazione di indici vale solo per


la somma relativa
Codifica GAMS
Sintassi dei comandi
Espressione delle equazioni
(o disequazioni): esempio

cost..spesa =e= sum(i,gh(i)*x(i));


vinc1(i,j)..y(i,j) =l= pp3;
vinc2..sum((i,j),mat(i,j)*y(i,j))/a =g= z;

Attenzione: gli indici dell’equazione non


possono essere usati come indici delle
somme (in tal caso usare l’ALIAS)
Codifica GAMS
Sintassi dei comandi
Dichiarazione del modello:
Dichiara il nome del modello ed elenca le
equazioni che fanno parte di esso:
MODEL nome-del-modello/nome-delle-
equazioni-senza-indici-separate-da-
virgole/;
Le dichiarazioni di modello possono essere
più di una, se si considerano più modelli.
Codifica GAMS
Sintassi dei comandi
Dichiarazione del modello
Se il modello è uno solo e tutte le equazioni
vi fanno parte, si può scrivere
MODEL nome-del-modello/all/;

Dichiarazione del modello: esempi


MODEL prova/cost,vinc1,vinc2/;

MODEL prova/all/;
Codifica GAMS
Sintassi dei comandi

Opzioni sul solutore


Indica il metodo risolutivo e il solutore usato.
OPTIONS metodo-usato=solutore;

Metodi: lp (linear programming)


mip (mixed integer programming)
……….

Nel nostro caso (PL) il comando è:


OPTIONS lp=cplex;
Codifica GAMS
Sintassi dei comandi

Comando di soluzione
SOLVE nome-del-modello USING nome-del-
metodo MAXIMIZING (oppure MINIMIZING)
nome-della-variabile;
I comandi SOLVE possono essere più di
uno.

Comando di soluzione: esempio


SOLVE prova USING lp MINIMIZING cost;
Codifica GAMS
Sintassi dei comandi
Comando di uscita dei risultati:
fornisce i valori delle variabili nella soluzione
(level) o i valori marginali delle stesse (marginal):

DISPLAY nome-della-variabile1-senza-indici.l,
nome-della-variabile1-senza-indici.m,
nome-della-variabile2-senza-indici.l,
nome-della-variabile2-senza indici2.m,
…;

Comando di uscita dei risultati: esempio

DISPLAY cost.l, cost.m, y.l, x.m;


Programmazione Lineare
Esempio agendine
Due dimensioni (allocazione di risorse)

Una officina costruisce agendine sportive


ed eleganti, vendute rispettivamente a 3 e 5
Euro l’una. Le ore di lavoro a disposizione
ogni giorno permettono di costruire 800
agendine sportive oppure 400 agendine
eleganti, o una miscela dei due tipi; il
materiale a disposizione ogni giorno
permette di costruire 600 agendine di
qualsiasi tipo. Programmare la produzione
che permette di ottenere il massimo ricavo.
Programmazione Lineare
Esempio agendine

Dati del problema:

sportive eleganti disponib.


lavoro 1 uni/age 2 uni/age 800 uni
materiali 1 uni/age 1 uni/age 600 uni
ric/age 3 €/age 5 €/age
Programmazione Lineare
Esempio agendine

MAX 3x1 + 5x2

x1 + 2x2 ≤ 800
x1 + x2 ≤ 600
x1 , x 2 ≥ 0
Programmazione Lineare
Esempio agendine – sol. grafica

MAX 3x1 + 5x2

x1 + 2x2 ≤ 800

x1 + x2 ≤ 600

x1 , x 2 ≥ 0
Codifica GAMS
Esempio di un codice (agendine)
SETS tipo/sport,eleg/,risorse/lavoro,mater/;
PARAMETERS quantita(risorse)/lavoro 800,mater 600/,
ricavo(tipo)/sport 3,eleg 5/;
TABLE coeff(risorse,tipo)
sport eleg
lavoro 1 2
mater 1 1;
VARIABLES x(tipo),ricavtot; POSITIVE VARIABLE x;
EQUATIONS obiet,vinc(risorse);
obiet..ricavtot =e= sum(tipo,ricavo(tipo)*x(tipo));
vinc(risorse)..sum(tipo,coeff(risorse,tipo)*x(tipo)) =l= quantita(risorse);
MODEL age/all/;
OPTIONS lp=cplex;
SOLVE age USING lp MAXIMIZING ricavtot;
DISPLAY x.l,ricavtot.l;
Programmazione Lineare
Esempio porte-finestre
Due dimensioni (allocazione di risorse)
Una officina costruisce porte vetrate di alluminio
e finestre di legno, che vende rispettivamente a
300 e 500 Euro l’una. L’officina ha tre reparti, il
reparto alluminio, che dispone di 4 ore
settimanali, il reparto legno, che dispone di 12 ore
settimanali e il reparto vetro, che dispone di 18
ore settimanali. Ogni porta richiede 1 ora al
reparto alluminio e 3 ore al reparto vetro per la
fabbricazione, ogni finestra richiede 2 ore al
reparto legno e 2 ore al reparto vetro.
Programmare la produzione che permette di
ottenere il massimo ricavo settimanale.
Programmazione Lineare
Esempio porte-finestre

Dati del problema:

porte finestre disponib.


rep. 1 allum. 1 h/pz 0 h/pz 4h
rep. 2 legno 0 h/pz 2 h/pz 12 h
rep. 3 vetro 3 h/pz 2 h/pz 18 h
ricavo/pz 300 €/pz 500 €/pz
Programmazione Lineare
Esempio porte-finestre – sol. grafica

MAX 300x1 + 500x2

x1 ≤ 4
2x2 ≤ 12
3x1 + 2x2 ≤ 18

x1 , x 2 ≥ 0
Programmazione Lineare
Esempio porte-finestre
SETS prodotto/porte,finestre/,reparto/allum,legno,vetro/;
PARAMETERS ore(reparto)/allum 4,legno 12,vetro 18/,
ricavo(prodotto)/porte 300,finestre 500/;
TABLE coeff(reparto,prodotto)
porte finestre
allum 1 0
legno 0 2
vetro 3 2;
VARIABLES x(prodotto),ricavtot;POSITIVE VARIABLE x;
EQUATIONS obiet,vinc(reparto);
obiet..ricavtot =e= sum(prodotto,ricavo(prodotto)*x(prodotto));
vinc(reparto)..sum(prodotto,coeff(reparto,prodotto)*x(prodotto)) =l=
ore(reparto);
MODEL portefin/all/;
OPTIONS lp=cplex;
SOLVE portefin USING lp MAXIMIZING ricavtot;
DISPLAY x.l,ricavtot.l;
Programmazione Lineare
Esempio cinture
Due dimensioni (allocazione di risorse)
Una officina costruisce cinture sportive ed
eleganti, vendute rispettivamente a 15 e 25 Euro
l’una. Le ore di lavoro a disposizione ogni giorno
permettono di costruire 1000 cinture sportive
oppure 500 cinture eleganti, o una miscela dei
due tipi; il cuoio a disposizione ogni giorno
permette di costruire 800 cinture di qualsiasi tipo.
Le fibbie a disposizione permettono di costruire
700 cinture sportive e 400 cinture eleganti.
Programmare la produzione che permette di
ottenere il massimo ricavo.
Programmazione Lineare
Esempio cinture

Dati del problema:

sportive eleganti disponib.


lavoro 1 uni/cint 2 uni/cint 1000 uni
materiali 1 uni/cint 1 uni/cint 800 uni
max 700 cint 400 cint
ric/cint 15 €/cint 25 €/cint
Programmazione Lineare
Esempio cinture

MAX 15x1 + 25x2

x1 + 2x2 ≤ 1000
x1 + x2 ≤ 800
x1 ≤ 700
x2 ≤ 400
x1 , x 2 ≥ 0
Programmazione Lineare
Esempio cinture
SETS cin/sp,el/,ris/la,cu,fs,fe/;
PARAMETERS ric(cin)/sp 15,el 25/,qu(ris)/la 1000,cu 800,fs 700,fe
400/;
TABLE co(ris,cin)
sp el
la 1 2
cu 1 1
fs 1 0
fe 0 1;
VARIABLES x(cin),w;POSITIVE VARIABLE x;
EQUATIONS ob,vinc(ris);
ob..w =e= sum(cin,ric(cin)*x(cin));
vinc(ris)..sum(cin,co(ris,cin)*x(cin)) =l= qu(ris)
MODEL cinture/all/;OPTIONS lp=cplex;
SOLVE cinture USING lp MAXIMIZING w;
Programmazione Lineare
Esempio lavatrici
Due dimensioni (allocazione di risorse)

Una officina costruisce lavatrici di modello


LAVAMAT e LAVALUX, vendute rispettivamente a
1,5 e 2,5 KEuro l’una e lavorate in 4 diversi reparti,
che hanno rispettivamente 155, 200, 240 e 400 ore
di lavoro a disposizione ogni mese. Ogni lavatrice
LAVAMAT richiede rispettivamente 1, 1.5, 3 e 2.5
ore ai 4 reparti, mentre ogni lavatrice LAVALUX
richiede rispettivamente 2.5, 2.5, 3 e 4 ore.
Programmare la produzione che permette di
ottenere il massimo ricavo.
Programmazione Lineare
Esempio lavatrici

Dati del problema:

lavamat lavalux disponib.


Rep. 1 1 ore/lav 2.5 ore/lav 155 ore
Rep. 2 1.5 ore/lav 2.5 ore/lav 200 ore
Rep. 3 3 ore/lav 3 ore/lav 240 ore
Rep. 4 2.5 ore/lav 4 ore/lav 400 ore
ric/lav 1.5 K€/lav 2.5 K€/lav
Programmazione Lineare
Esempio lavatrici

MAX 1.5x1 + 2.5x2

x1 + 2.5 x2 ≤ 155
1.5 x1 + 2.5 x2 ≤ 200
3 x1 + 3 x2 ≤ 240
2.5 x1 + 4 x2 ≤ 400
x1 , x2 ≥ 0
Programmazione Lineare
Esempio lavatrici
SETS lav/mat,lux/,rep/r1*r4/;
PARAMETERS ric(lav)/mat 1.5,lux 2.5/,disp(rep)/r1 155,r2 200,r3 240,r4
400/;
TABLE co(rep,lav)
mat lux
r1 1 2.5
r2 1.5 2.5
r3 3 3
r4 2.5 4;
VARIABLES x(lav),w;POSITIVE VARIABLE x;
EQUATIONS ob,vinc(rep);
ob..w =e= sum(lav,ric(lav)*x(lav));
vinc(rep)..sum(lav,co(rep,lav)*x(lav)) =l= disp(rep);
MODEL lavatrici/all/;OPTIONS lp=cplex;
SOLVE lavatrici Using LP maximizing w;
DISPLAY x.l,w.l;
Programmazione Lineare
Esempio pastificio
Due dimensioni (allocazione di risorse)
Un reparto di un’azienda alimentare produce pasta sotto
forma di farfalle e rigatoni, con un guadagno netto rispettivo
di 280 e 250 Euro a tonnellata. Ogni tonnellata di farfalle
richiede 1 ora per la macinazione, 4 ore per la produzione e 3
ore per la confezione, mentre ogni tonnellata di rigatoni
richiede 1 ora per la macinazione, 3 ore per la produzione e 4
ore per la confezione. Il reparto ha a disposizione 40 ore di
macchinario per la macinazione, 144 ore di macchinario per
la produzione e 180 ore di macchinario per la confezione.
Determinare il piano di lavoro che rende massimo il profitto
totale.

Risultati: x’ = [24, 16] ; profitto totale = 10720


Programmazione Lineare
Esempio pastificio
Due dimensioni (allocazione di risorse)
MAX 280 x1 + 250 x2
x1 + x2 ≤ 40
4 x1 + 3 x2 ≤ 144
3 x1 + 4 x2 ≤ 180
x1 , x2 ≥ 0

Risultati: x’ =[24, 16] ; profitto totale = 10720


Programmazione Lineare
Esempio dieta vitelloni
Due dimensioni (dieta)
In un allevamento bovino i vitelloni vengono
alimentati con fieno di medica e con silo di mais,
che costano rispettivamente 150 e 40 Euro/ton.
Ogni vitellone necessita di 10 Kg di proteine, 25
Kg di zuccheri e 9 Kg di grassi. Il contenuto di 1
ton di fieno medica è di 100 Kg di proteine, 50 Kg
di zuccheri e 45 Kg di grassi, mentre il contenuto
di 1 ton di silo mais è di 20 Kg di proteine, 200 Kg
di zuccheri e 36 Kg di grassi. Definire la dieta più
conveniente ossia a minimo costo.
Programmazione Lineare
Esempio dieta vitelloni

Dati del problema:

f. m. s. m. necessità
proteine 100 Kg/ton 20 Kg/ton 10 Kg
zuccheri 50 Kg/ton 200 Kg/ton 25 Kg
grassi 45 Kg/ton 36 Kg/ton 9 Kg
costo 150 €/ton 40 €/ton
Programmazione Lineare
Esempio dieta vitelloni

MIN 150x1 + 40x2

100x1 + 20x2 ≥ 10
50x1 + 200x2 ≥ 25
45x1 + 36x2 ≥ 9
x1 , x2 ≥ 0

Soluzione: x1 = 1/15 , x2 = 1/6 , z = 50/3


Programmazione Lineare
Esempio dieta vitelloni
SETS cibi/fm,sm/,pn/pr,zu,gr/;
PARAMETERS costo(cibi)/fm 150,sm 40/,rich(pn)/pr 10,zu 25,gr 9/;
TABLE cont(pn,cibi)
fm sm
Pr 100 20
zu 50 200
gr 45 36;
VARIABLES x(cibi),z;POSITIVE VARIABLE x;
EQUATIONS costot,vinc(pn);
costot..z =e= sum(cibi,costo(cibi)*x(cibi));
vinc(pn)..sum(cibi,cont(pn,cibi)*x(cibi)) =g= rich(pn);
MODEL dietavit/all/;OPTIONS lp=cplex;
SOLVE dietavit USING lp MINIMIZING z;
DISPLAY x.l,z.l;
Programmazione Lineare
Esempio dieta 2 (2 dimensioni)
Si vuole trovare la dieta giornaliera a
minimo costo formata da due alimenti, A1 e
A2, di costo unitario rispettivo di 7 e 5
Euro/kg, che fornisca almeno 600 g di
proteine e 1200 g di zuccheri. Un kg di A1
contiene 100 g di proteine e 300 di zuccheri,
un kg di A2 contiene 200 g di proteine e 400
g di zuccheri.
Programmazione Lineare
Esempio dieta 2
MIN 7 x1 + 5 x2
100 x1 + 200 x2 ≥ 600
300 x1 + 400 x2 ≥ 1200
x1, x2 ≥ 0

Soluzione: x = (0,3), z = 15
Programmazione Lineare
Esempio dieta 2
SETS alim/a1,a2/,princ/prot,zucc/;
PARAMETERS costo(alim)/a1 7,a2 5/,rich(princ)/prot 600,zucc 1200/;
TABLE cont(princ,alim)
a1 a2
prot 100 200
zucc 300 400;
VARIABLES costot,x(alim);POSITIVE VARIABLE x;
EQUATIONS ob,minforn(princ);
ob..costot =e= sum(alim,costo(alim)*x(alim));
minforn(princ)..sum(alim,cont(princ,alim)*x(alim)) =g= rich(princ);
MODEL dieta2/all/;OPTIONS lp=cplex;
SOLVE dieta2 USING lp MINIMIZING costot;
DISPLAY x.l,costot.l;
Programmazione Lineare
Esempio telefonate
Due dimensioni (dieta)
Un’azienda pubblicitaria deve svolgere un’indagine
telefonica, per la quale necessita di almeno 150
risposte da donne sposate, 110 da donne non
sposate, 120 da uomini sposati e 100 da uomini non
sposati. Le telefonate fatte di giorno costano 1 € l’una
e danno probabilità di risposta del 30% di donne
sposate, 10% di donne non sposate, 10% di uomini
sposati e 10% di uomini non sposati, mentre quelle
fatte di sera costano 1,6 € l’una e danno probabilità di
risposta del 30% di donne sposate, 20% di donne non
sposate, 30% di uomini sposati e 15% di uomini non
sposati. Decidere quante telefonate effettuare per
minimizzare il costo dell’indagine.
Programmazione Lineare
Esempio telefonate

Dati del problema:

g s necessità
d.s. 0.3 0.3 150
d.n.s. 0.1 0.2 110
u.s. 0.1 0.3 120
u.n.s. 0.1 0.15 100
costo 1 1.6
Programmazione Lineare
Esempio telefonate

MIN x1 + 1.6x2

0.3x1 + 0.3x2 ≥ 150


0.1x1 + 0.2x2 ≥ 110
0.1x1 + 0.3x2 ≥ 120
0.1x1 + 0.15x2 ≥ 100
x1 , x2 ≥ 0
Programmazione Lineare
Esempio telefonate
SETS t/g,s/,r/ds,dns,us,uns/;
PARAMETERS costo(t)/g 1,s 1.6/,nec(r)/ds 150,dns 110,us 120,uns
100/;
TABLE p(r,t)
g s
ds 0.3 0.3
dns 0.1 0.2
us 0.1 0.3
uns 0.1 0.15;
VARIABLES z,x(t);POSITIVE VARIABLE x;
EQUATIONS costot,vinc(r);
costot..z =e= sum(t,costo(t)*x(t));
vinc(r)..sum(t,p(r,t)*x(t)) =g= nec(r);
MODEL tel/all/;OPTIONS lp=cplex;
SOLVE tel USING lp MINIMIZING z;
DISPLAY x.l,z.l
Programmazione Lineare
Esempio officina
Due dimensioni (misto)
Un’officina deve produrre 130 lotti di un certo
articolo, che può essere lavorato o sulla
macchina Ma al costo di 110 Euro per lotto e alla
velocità di 12 lotti per ora, o sulla macchina Mb al
costo di 90 Euro per lotto e alla velocità di 8 lotti
per ora. L’officina dispone di 8 ore di lavoro per
ogni macchina. Si pianifichi la lavorazione in
modo da minimizzare la spesa.
 
Risultati: x’ = [66, 64] ; spesa totale = 13020
Programmazione Lineare
Esempio officina
Due dimensioni (misto)
Dati del problema:
macch. costo velocità disponibilità
Ma 110 €/l 12 l/h 8 h => 96 l
Mb 90 €/l 8 €/h 8 h => 64 l

Variabili decisionali:
x1 = lotti prodotti dalla macchina Ma
x2 = lotti prodotti dalla macchina Mb
Programmazione Lineare
Esempio officina

MIN 110 x1 + 90 x2
x1 + x2 = 130
x1 ≤ 96
x2 ≤ 64
x1 , x2 ≥ 0

Risultati: x’ = [66, 64] ; spesa totale = 13020


Programmazione Lineare
Esempio officina
SETS mac/ma,mb/;
SCALAR totlotti/130/;
PARAMETERS costo(mac)/ma 110,mb 90/,vel(mac)/ma
12,mb 8/,disp(mac)/ma 8,mb 8/;
VARIABLES x(mac),costot;POSITIVE VARIABLE x;
EQUATIONS ob,somlot,maxprod(mac),sind;
ob..costot =e= sum(mac,costo(mac)*x(mac));
somlot..sum(mac,x(mac)) =e= totlotti;
maxprod(mac)..x(mac) =l= vel(mac)*disp(mac);
MODEL lottodiv/all/;OPTIONS lp=cplex;
SOLVE lottodiv USING lp MINIMIZING costot;
DISPLAY x.l,costot.l;
Programmazione Lineare
Esempio lamiere
Due dimensioni (misto)
Un’officina vende due prodotti, P1 e P2, ottenuti
da lavorazione di lamiere, al prezzo rispettivo di
500 e 1850 € al pezzo. P1 richiede 1 ton di lamiera
e 4 ore di lavoro a pezzo e riesce a vendere un
massimo di 6 pezzi a settimana; P2 richiede 3 ton
di lamiera e 5 ore di lavoro a pezzo ed ha una
ordinazione, cui deve far fronte, di 5 pezzi a
settimana; si hanno a disposizione 18 ton di
lamiera a settimana e si vogliono saturare 40 ore
di lavoro. Determinare la produzione più
conveniente
Programmazione Lineare
Esempio lamiere
MAX 500x1 + 1850x2

x1 + 3x2 ≤ 18
4x1 + 5x2 ≥ 40
x1 ≤ 6
x2 ≥ 5
x1 , x 2 ≥ 0
Programmazione Lineare
Esempio lamiere
SETS pezzi/p1*p2/;SCALAR totlam/18/,oresat/40/;
PARAMETERS lam(pezzi)/p1 1,p2 3/,lav(pezzi)/p1 4,p2 5/,
prezzo(pezzi)/p1 500,p2 1850/;
VARIABLES ricavo,x(pezzi);POSITIVE VARIABLE x;
x.up('p1')=6;x.lo('p2')=5;
EQUATIONS ob,maxlam,minlav;
ob..sum(pezzi,prezzo(pezzi)*x(pezzi)) =e= ricavo;
maxlam..sum(pezzi,lam(pezzi)*x(pezzi)) =l= totlam;
minlav..sum(pezzi,lav(pezzi)*x(pezzi)) =g= oresat;
MODEL lamiere/all/;OPTIONS lp=cplex;
SOLVE lamiere USING lp MAXIMIZING ricavo;
DISPLAY ricavo.l,x.l;
Programmazione Lineare
Esempio investimenti
Due dimensioni (misto)
Un investitore considera due investimenti, A
e B, la cui resa rispettiva è 30 e 25 € per
pacchetto di titoli. Per imposizione di
mercato il numero di pacchetti acquistati di
B deve essere compreso fra il numero di
pacchetti acquistati di A meno 3 e il doppio
del numero di pacchetti acquistati di A più 2.
Determinare la combinazione di acquisti che
permette di ottenere la massima resa.
Programmazione Lineare
Esempio investimenti

MAX 30x1 + 25x2

x1 - x2 ≤ 3
-2x1 + x2 ≤ 2
x1 , x2 ≥ 0

Infinitamente migliorabile
Programmazione Lineare
Esempio investimenti
SETS pac/p1,p2/,vi/v1,v2/;
PARAMETERS resa(pac)/p1 30,p2 25/,tn(vi)/v1 3,v2 2/;
TABLE coef(vi,pac)
p1 p2
v1 1 -1
v2 -2 1;
VARIABLES resatot,x(pac);POSITIVE VARIABLE x;
EQUATIONS ob,vinc(vi);
ob..resatot =e= sum(pac,resa(pac)*x(pac));
vinc(vi)..sum(pac,coef(vi,pac)*x(pac)) =l= tn(vi);
MODEL invest/all/;Options lp=cplex;
SOLVE invest USING lp MAXIMIZING resatot;
DISPLAY x.l,resatot.l;
Programmazione Lineare
Esempio miscela mat sfusi (2 dim)
Un commerciante acquista due materiali sfusi, MA e MB, li
mescola e vende la miscela ottenuta. Puo’ acquistare un
massimo di 12 ton al giorno di MA al prezzo di 290
Euro/ton ed un massimo di 21 ton al giorno di MB al
prezzo di 220 Euro/ton. Le sue apparecchiature devono
miscelare almeno 40 ton al giorno per essere redditizie. Il
costo di miscelazione e’ pari a 20 Euro/ton ed il prezzo di
vendita della miscela pari a 350 Euro/ton. Si richiede che
la miscela contenga almeno il 40% di MA. Pianificare le
quantita’ di MA e di MB da acquistare e miscelare al
giorno per ottenere il massimo guadagno totale. Ripetere
il problema nel caso in cui le sue apparecchiature devano
miscelare almeno 30 ton al giorno per essere redditizie.
Programmazione Lineare
Esempio miscela materiali sfusi
MAX 40 x1 + 110 x2
x1 ≤ 12
x2 ≤ 21
x1 + x2 ≥ 40 (30)
-0.6 x1 + 0.4 x2 ≤ 0
x1, x2 ≥ 0

Se il termine noto del terzo vincolo è 40, non c’è


soluzione.

Se il termine noto del terzo vincolo è 30, la soluzione


è:
x = (12, 18), w = 2460
Programmazione Lineare
Esempio miscela materiali sfusi
SETS mat/a,b/,vinc/v1*v4/;
PARAMETERS tn1(vinc)/v1 12,v2 21,v3 -40,v4 0/,
tn2(vinc)/v1 12,v2 21,v3 -30,v4 0/,
gua(mat)/a 40,b 110/;
TABLE coef(vinc,mat)
a b
v1 1 0
v2 0 1
v3 -1 -1
v4 -0.6 0.4;
VARIABLES x(mat),guatot;POSITIVE VARIABLE x;
EQUATIONS ob,vincolo1(vinc),vincolo2(vinc);
ob..guatot =e= sum(mat,gua(mat)*x(mat));
vincolo1(vinc)..sum(mat,coef(vinc,mat)*x(mat)) =l= tn1(vinc);
vincolo2(vinc)..sum(mat,coef(vinc,mat)*x(mat)) =l= tn2(vinc);
MODEL miscmatsfu1/ob,vincolo1/;OPTION lp=cplex;
SOLVE miscmatsfu1 USING lp MAXIMIZING guatot;
DISPLAY x.l,guatot.l;
MODEL miscmatsfu2/ob,vincolo2/;OPTION lp=cplex;
SOLVE miscmatsfu2 USING lp MAXIMIZING guatot;
DISPLAY x.l,guatot.l;
Programmazione Lineare
Esempio produzione
Tre dimensioni (risorse)
Un’officina lavora tre prodotti, P1, P2 e P3, che
richiedono rispettivamente 2, 1 e 3 ore della
macchina M a lotto e rispettivamente 1, 4 e 5 ore
dell’operatore O a lotto. Il guadagno unitario dei
tre prodotti è rispettivamente 35, 42 e 50 €, la
disponibilità della macchina M di 18 ore
settimanali e la disponibilità dell’operatore O di 23
ore settimanali. Determinare la produzione che
comporta il massimo guadagno settimanale
totale.
Programmazione Lineare
Esempio produzione
Mac Op guadagno
P1 2 h/l 1 h/l 35 €/l
P2 1 h/l 4 h/l 42 €/l
P3 3 h/l 5 h/l 50 €/l
disp. 18 h 23 h

MAX 35x1 + 42x2 + 50x3


2x1 + x2 + 3x3 ≤ 18
x1 + 4x2 + 5x3 ≤ 23 7
x1, x2, x3 ≥ 0 x* = 4 w*=413
0
Programmazione Lineare
Esempio produzione
SETS ris/ma,op/,pro/p1,p2,p3/;
PARAMETERS totore(ris)/ma 18,op 23/,gua(pro)/p1 35,p2 42,p3 50/;
TABLE ore(ris,pro)
p1 p2 p3
ma 2 1 3
op 1 4 5;
VARIABLES x(pro),guatot;POSITIVE VARIABLE x;
EQUATIONS ob,maxore(ris);
ob..guatot =e= sum((pro),gua(pro)*x(pro));
maxore(ris)..sum(pro,ore(ris,pro)*x(pro)) =l= totore(ris);
MODEL promacop/all/;OPTIONS lp=cplex;
SOLVE promacop USING lp MAXIMIZING guatot;
DISPLAY x.l,guatot.l;
Programmazione Lineare
Esempio produzione2
Un’officina lavora tre prodotti, P1, P2 e P3, per materiale
sfuso. Ogni prodotto deve essere lavorato su entrambe le
macchine Ma e Mb. Ogni tonnellata di P1 richiede 1 ora di
lavoro su Ma e 3 ore su Mb; ogni tonnellata di P2 richiede
4 ore di lavoro su Ma e 2 ore su Mb; ogni tonnellata di P3
richiede 5 ore di lavoro su Ma e 4 ore su Mb. La macchina
Ma è disponibile per 50 ore a settimana e la macchina Mb
per 39 ore a settimana. Il mercato assorbe i prodotti P1 e
P3 in quantità illimitata, il prodotto P2 in quantità massima
pari a 9 ton a settimana. Il profitto netto per tonnellata
ammonta a 240 € per P1, 360 € per P2 e 500 € per P3.
Determinare la produzione settimanale che rende
massimo il profitto totale.
Programmazione Lineare
Esempio produzione2
Dati del problema:

P1 P2 P3 disponib.
Ma 1 ore/ton 4 ore/ton 5 ore/ton 50 ore
Mb 3 ore/ton 2 ore/ton 4 ore/ton 39 ore
Prof 240 €/ton 360 €/ton 500 €/ton
Max 9 ton
Programmazione Lineare
Esempio produzione2
Variabili decisionali: x1, x2, x3
(tonnellate di P1, P2, P3)
variabili non negative

Obiettivo: Massimo profitto

Vincoli:
- Ore disponibili di Ma,
-Ore disponibili di Mb,
-Massimo numero di ton. vendibili di P2
Programmazione Lineare
Esempio produzione2
Modello matematico:
MAX 240x1+ 360x2+ 500x3
x1+ 4x2+ 5x3 ≤ 50
3x1+ 2x2+ 4x3 ≤ 39
x2 ≤ 9
x1, x2, x3 ≥ 0

Soluzione: x' = [ 49/11, 9, 21/11 ] ,


w = 57400/11
Programmazione Lineare
Esempio produzione2: Codifica GAMS
SETS prodotto/p1*p3/,vincolo/v1*v3/;
PARAMETERS profitto(prodotto)/p1 240,p2 360,p3 500/,risorse(vincolo)/v1
50,v2 39,v3 9/;
TABLE coeftec(vincolo,prodotto)
p1 p2 p3
v1 1 4 5
v2 3 2 4
v3 0 1 0;
VARIABLES proftot,x(prodotto);POSITIVE VARIABLE x;
EQUATIONS obiettivo,massimo(vincolo);
obiettivo..proftot =e= sum(prodotto,profitto(prodotto)*x(prodotto));
massimo(vincolo)..sum(prodotto,coeftec(vincolo,prodotto)*x(prodotto)) =l=
risorse(vincolo);
MODEL esempiopl/all/;
OPTIONS lp=cplex;
SOLVE esempiopl USING lp MAXIMIZING proftot;
DISPLAY x.l,proftot.l;
Programmazione Lineare
Esempio agricoltura
Tre dimensioni (risorse)
Un agricoltore possiede 30 ettari di terreno
e dispone di 90 metri cubi di acqua al
giorno. Può seminare i prodotti P1, P2 e P3,
che richiedono rispettivamente 3, 6 e 15
metri cubi di acqua al giorno e che rendono
rispettivamente 200, 300 e 500 € a ettaro per
anno. Determinare quanto seminare di ogni
prodotto per avere la massima resa totale.

Soluzione: 30, 0, 0 ha con resa 6000 €


Programmazione Lineare
Esempio agricoltura
occup. acqua resa
P1 1 ha 3 mc/g 200 €/ha
P2 1 ha 6 mc/g 300 €/ha
P3 1 ha 15 mc/g 500 €/ha
disp. 30 h 90 mc/g
MAX 200x1 + 300x2 + 500x3
x1 + x2 + x3 ≤ 30
3x1 + 6x2 + 15x3 ≤ 90 30
x1, x2, x3 ≥ 0 x* = 0
0
w = 6000
Programmazione Lineare
Esempio agricoltura
SETS ris/sup,acqua/,pro/p1,p2,p3/;
PARAMETERS quant(ris)/sup 30,acqua 90/,
resa(pro)/p1 200,p2 300,p3 500/;
TABLE consumo(ris,pro)
p1 p2 p3
sup 1 1 1
acqua 3 6 15;
VARIABLES x(pro),resatot;POSITIVE VARIABLE x;
EQUATIONS ob,disp(ris);
ob..resatot =e= sum((pro),resa(pro)*x(pro));
disp(ris)..sum(pro,consumo(ris,pro)*x(pro)) =l= quant(ris);
MODEL agri/all/;OPTIONS lp=cplex;
SOLVE agri USING lp MAXIMIZING resatot;
DISPLAY x.l,resatot.l;
Programmazione Lineare
Esempio agricoltura2
Un’azienda agricola dispone di 22 ettari di terreno
su cui può seminare tre prodotti: P1 che rende
400 Euro all’ettaro e richiede 2 ore all’ettaro per la
semina, P2 che rende 560 Euro all’ettaro e
richiede 3 ore all’ettaro per la semina, P3 che
rende 850 Euro all’ettaro e richiede 4.5 ore
all’ettaro per la semina. L’azienda dispone di una
seminatrice per un totale di 63 ore, di seme di P1
per 9 ettari e di seme di P2 e P3 in quantità
illimitata. Determinare il piano di semina che
rende massimo il profitto totale.
Programmazione Lineare
Esempio agricoltura2
MAX 400 x1 + 560 x2 + 850 x3
x1 + x2 + x3 ≤ 22
2 x1 + 3 x2 + 4.5 x3 ≤ 63
x1 ≤ 9
x1, x2, x3 ≥ 0

Soluzione: x = 9 w = 12100
0
10
Programmazione Lineare
Esempio agricoltura2
SETS ris/sup,semin,seme/,pro/p1,p2,p3/;
PARAMETERS quant(ris)/sup 22,semin 63,seme 9/,resa(pro)/p1 400,p2
560,p3 850/;
TABLE consumo(ris,pro)
p1 p2 p3
sup 1 1 1
semin 2 3 4.5
seme 1 0 0;
VARIABLES x(pro),proftot;POSITIVE VARIABLE x;
EQUATIONS ob,disp(ris);
ob..proftot =e= sum((pro),resa(pro)*x(pro));
disp(ris)..sum(pro,consumo(ris,pro)*x(pro)) =l= quant(ris);
MODEL agri2/all/;OPTIONS lp=cplex;
SOLVE agri2 USING lp MAXIMIZING proftot; DISPLAY x.l,proftot.l;
Programmazione Lineare
Esempio asilo, tre dimens. (dieta)
I bambini di un asilo vengono alimentati
con latte, che contiene 60 grammi di
proteine e 30 unità di vitamine per litro e
costa 0,9 € per litro, carne, che contiene
180 grammi di proteine e 20 unità di
vitamine per kg e costa 6 € per kg, e infine
frutta, che contiene 45 grammi di proteine e
60 unità di vitamine per kg e costa 1 € per
kg. Ogni bambino richiede almeno 300
grammi di proteine e 240 unità di vitamine
al giorno. Determinare la dieta a minimo
costo.
Programmazione Lineare
Esempio asilo
prot. vit. costo
latte 60 g/l 1 un/l 0.9 €/l
carne 180 g/kg 4 un/kg 6 €/kg
frutta 45 g/kg 5 un/kg 3 €/kg
rich. 300g 240 un
Programmazione Lineare
Esempio asilo
MIN 0.9x1 + 6x2 + x3
60x1 + 180x2 + 45x3 ≥ 300
30x1 + 20x2 + 60x3 ≥ 240
x1, x2, x3 ≥ 0

Soluzione: 3.2, 0, 2.4 kg/g con costo 5.28 €


Programmazione Lineare
Esempio asilo
SETS cibi/latte,carne,frutta/,principi/proteine,vitamine/;
PARAMETERS costo(cibi)/latte 0.9,carne 6,frutta 1/,
richiesta(principi)/proteine 300,vitamine 240/;
TABLE contenuti(principi,cibi)
latte carne frutta
proteine 60 180 45
vitamine 30 20 60;
VARIABLES x(cibi),z;POSITIVE VARIABLE x;
EQUATIONS costot,vinc(principi);
costot..z =e= sum(cibi,costo(cibi)*x(cibi));
vinc(principi)..sum(cibi,contenuti(principi,cibi)*x(cibi)) =g=
richiesta(principi);
MODEL asilo/all/;OPTIONS lp=cplex;
SOLVE asilo USING lp MINIMIZING z;
DISPLAY x.l,z.l;
Programmazione Lineare
Esempio tigri, tre dimens. (dieta)
Le tigri di un circo vengono alimentate con
carne di bue, che contiene 150 grammi di
proteine e fornisce 2500 calorie per kg e
costa 3 € per kg, carne di cavallo, che
contiene 200 grammi di proteine e fornisce
2000 calorie per kg e costa 4 € per kg, e
infine pastone, che contiene 50 grammi di
proteine e fornisce 800 calorie per kg e
costa 0.5 € per kg.. Ogni tigre richiede
almeno 1000 grammi di proteine e 12500
calorie al giorno. Determinare la dieta a
minimo costo.
Programmazione Lineare
Esempio tigri
prot. calorie costo
bue 150 g/kg 2500 ca/kg 3 €/l
cavallo 200 g/kg 2000 ca/kg 4 €/kg
pastone 50 g/kg 800 ca/kg 0.5 €/kg
rich. 1000 g 12500 ca
Programmazione Lineare
Esempio tigri
MIN 3 x1 + 4 x2 + 0.5 x3
150 x1 + 200 x2 + 50 x3 ≥ 1000
2500 x1 + 2000 x2 + 800 x3 ≥ 12500
x1, x2, x3 ≥ 0

Soluzione:
x1 = 0, x2 = 0, x3 = 20, costo = 10
Programmazione Lineare
Esempio tigri
SETS cibi/bue,cavallo,pastone/,principi/proteine,calorie/;
PARAMETERS costo(cibi)/bue 3,cavallo 4,pastone 0.5/,
richiesta(principi)/proteine 1000,calorie 12500/;
TABLE contenuti(principi,cibi)
bue cavallo pastone
proteine 150 200 50
calorie 2500 2000 800;
VARIABLES x(cibi),z;POSITIVE VARIABLE x;
EQUATIONS costot,vinc(principi);
costot..z =e= sum(cibi,costo(cibi)*x(cibi));
vinc(principi)..sum(cibi,contenuti(principi,cibi)*x(cibi)) =g=
richiesta(principi);
MODEL tigri/all/;OPTIONS lp=cplex;
SOLVE tigri USING lp MINIMIZING z;
DISPLAY x.l,z.l;
Programmazione Lineare
Esempio omogeneizzato
Tre dimensioni (misto)
Un omogeneizzato di frutta viene ottenuto
miscelando i frutti F1, che contiene 2 unità di
vitamina A e 4 unità di vitamina C per kg e costa
0.40 € per kg, F2, che contiene 1 unità di vitamina
A e 3 unità di vitamina C per kg e costa 0.35 € per
kg, F3, che contiene 3 unità di vitamina A e 2 unità
di vitamina C per kg e costa 0.25 € per kg. Si
richiede che la miscela contenga almeno 2 unità
di vitamina A e 3 unità di vitamina C per kg.
Determinare la composizione a minimo costo.
Programmazione Lineare
Esempio omogeneizzato
Tre dimensioni (misto)
Vit. A Vit. C costo
F1 2 un./kg 4 un./kg 0.40 €/ kg
F2 1 un./kg 3 un./kg 0.35 €/ kg
F3 3 un./kg 2 un./kg 0.25 €/ kg
rich. 2 un./kg 3 un./kg
Programmazione Lineare
Esempio omogeneizzato
Tre dimensioni (misto)
MIN 0.40 x1 + 0.35 x2 + 0.25 x3
2 x1 + x2 + 3 x3 ≥ 2
4 x1 + 3 x2 + 2 x3 ≥ 3
x1 + x2 + x3 = 1
x1, x2, x3 ≥ 0

Soluzione: x1 = 0.5, x2 = 0, x3 = 0.5 kg/kg


con costo 0.325 €/kg
Programmazione Lineare
Esempi omogeneizzato
SETS fr/ f1,f2,f3/,vit/va,vc/;
SCALAR norm/1/;
PARAMETERS costo(fr)/f1 0.40,f2 0.35,f3 0.25/,rich(vit)/va 2,vc 3/;
TABLE cont(vit,fr)
f1 f2 f3
va 2 1 3
vc 4 3 2;
VARIABLES costunit,x(fr);POSITIVE VARIABLE x;
EQUATIONS ob,vinc(vit),uno;
ob..costunit =e= sum(fr,costo(fr)*x(fr));
vinc(vit)..sum(fr,cont(vit,fr)*x(fr)) =g= rich(vit);
uno..sum(fr,x(fr)) =e= norm;
MODEL omog/all/;OPTIONS lp=cplex;
MODEL omogsb/ob,vinc/;OPTIONS lp=cplex;
SOLVE omog USING lp MINIMIZING costunit;DISPLAY costunit.l,x.l;
SOLVE omogsb USING lp MINIMIZING costunit;DISPLAY costunit.l,x.l;
Programmazione Lineare
Esempio produzione alternativa2
Un’officina lavora due prodotti, P1 e P2, per lotti,
alternativamente su due macchine, Ma e Mb; ogni
lotto deve essere lavorato o da Ma o da Mb. Ogni lotto
di P1 richiede 4 ore di Ma al costo di 40 Euro oppure 6
ore di Mb al costo di 30 Euro, ogni lotto di P2 richiede
2 ore di Ma al costo di 70 Euro oppure 1 ora di Mb al
costo di 50 Euro. Si hanno a disposizione le due
macchine Ma e Mb per 36 ore ciascuna a settimana. I
clienti richiedono un totale di almeno 8 lotti di P1 ed
almeno 18 lotti di P2. Si determinino i lotti di P1 e P2
da lavorare a settimana su ognuna delle due
macchine per minimizzare il costo totale.
Programmazione Lineare
Esempio produzione alternativa2
MIN 40 xa1 + 70 xa2 + 30 xb1 + 50 xb2
4 xa1 + 2 xa2 ≤ 36
6 xb1 + xb2 ≤ 36
xa1 + xb1 ≥ 8
xa2 + xb2 ≥ 18
xa1, xa2, xb1, xb2 ≥ 0

Soluzione: xij = P1 P2 z = 1190


Ma 5 0
Mb 3 18
Programmazione Lineare
Esempio produzione alternativa2
SETS mac/ma,mb/,pro/p1,p2/;
PARAMETERS disp(mac)/ma 36,mb 36/,ric(pro)/p1 8,p2 18/;
TABLE ore(mac,pro)
p1 p2
ma 4 2
mb 6 1;
TABLE cost(mac,pro)
p1 p2
ma 40 70
mb 30 50;
VARIABLES x(mac,pro),costot;POSITIVE VARIABLE x;
EQUATIONS ob,maxore(mac),minlot(pro);
ob..costot =e= sum((mac,pro),cost(mac,pro)*x(mac,pro));
maxore(mac)..sum(pro,ore(mac,pro)*x(mac,pro)) =l=disp(mac);
minlot(pro)..sum(mac,x(mac,pro)) =g= ric(pro);
MODEL promac/all/;OPTIONS lp=cplex;
SOLVE promac USING lp MINIMIZING costot;
DISPLAY x.l,costot.l;
Programmazione Lineare
Esempio ricavi differenziati
Un’officina lavora due prodotti P1 e P2 su due
macchine Ma e Mb; P1 richiede 5 ore per lotto
su Ma e 3 ore per lotto su Mb, P2 richiede 2 ore
per lotto su Ma e 4 ore per lotto su Mb; Ma è
disponibile per 160 ore al mese e Mb per 180
ore al mese; P1 viene venduto a 500 €/lotto, P2
viene venduto a 400 €/lotto per i primi 20 lotti e
a 300 €/lotto per i successivi. Determinare la
produzione per ottenere il massimo ricavo.
Risolvere lo stesso problema nel caso in cui
Mb sia disponibile per 145 ore al mese.
Programmazione Lineare
Esempio ricavi differenziati
MAX 500 x1 + 400 x2 + 300 x3
5 x1 + 2 x2 + 2 x3 ≤ 160
3 x1 + 4 x2 + 4 x3 ≤ 180 (145)
x2 ≤ 20
x1, x2, x3 ≥ 0
Soluzione1: Soluzione 2:
x = 20 w = 210000 x = 25 w = 195000
20 17.5
10 0
Programmazione Lineare
Esempio ricavi differenziati
SETS ris/ma,mb,limp2/,pro/p1,p2,p3/;
PARAMETERS quant1(ris)/ma 160,mb 180,limp2 20/,
quant2(ris)/ma 160,mb 145,limp2 20/,ric(pro)/p1 500,p2 400,p3 300/;
TABLE consumo(ris,pro)
p1 p2 p3
ma 5 2 2
mb 3 4 4
limp2 0 1 0;
VARIABLES x(pro),proftot;POSITIVE VARIABLE x;
EQUATIONS ob,disp1(ris),disp2(ris);
ob..proftot =e= sum((pro),ric(pro)*x(pro));
disp1(ris)..sum(pro,consumo(ris,pro)*x(pro)) =l= quant1(ris);
disp2(ris)..sum(pro,consumo(ris,pro)*x(pro)) =l= quant2(ris);
MODEL ricdiff1/ob,disp1/, ricdiff2/ob,disp2/;OPTIONS lp=cplex;
SOLVE ricdiff1 USING lp MAXIMIZING proftot;DISPLAY x.l,proftot.l;
SOLVE ricdiff2 USING lp MAXIMIZING proftot;DISPLAY x.l,proftot.l;
Programmazione Lineare
Esempio flusso
Sette dimensioni (misto)
Cinque piazze, a, b, c, d, e, sono collegate
dalle strade ab, ae, bc, bd, be, cd, de con
capacità rispettive di 3, 9, 5, 4, 6, 7, 2 auto al
secondo per senso di marcia. Definire i
flussi lungo ogni strada per poter
trasportare il massimo flusso totale dalla
piazza a alla piazza c.
Programmazione Lineare
Esempio flusso

5
b c
3

a
6 4 7

9
2
e d
Programmazione Lineare
Esempio flusso
MAX xab + xae
xab - xbc - xbd - xbe = 0
xae + xbe + xde = 0
xbd + xcd - xde = 0
-3 ≤ xab ≤ 3
-9 ≤ xae ≤ 9
-5 ≤ xbc ≤ 5
-4 ≤ xbd ≤ 4
-6 ≤ xbe ≤ 6
-7 ≤ xcd ≤ 7
-2 ≤ xde ≤ 2
xij libere in segno
Soluzione: 3, 8, 5, 4, -6, -6,-2; 11.
Programmazione Lineare
Esempio flusso
SETS str/ab,ae,bc,bd,be,cd,de/;
VARIABLES flutot,x(str);FREE VARIABLE x;
x.lo('ab')=-3;x.up('ab')=3;
x.lo('ae')=-9;x.up('ae')=9;
x.lo('bc')=-5;x.up('bc')=5;
x.lo('bd')=-4;x.up('bd')=4;
x.lo('be')=-6;x.up('be')=6;
x.lo('cd')=-7;x.up('cd')=7;
x.lo('de')=-2;x.up('de')=2;
EQUATIONS ob,eqb,eqd,eqe;
ob..flutot =e= x('ab')+x('ae');
eqb..x('ab')-x('bc')-x('bd')-x('be') =e= 0;
eqd..x('bd')+x('cd')-x('de') =e= 0;
eqe..x('ae')+x('be')+x('de') =e= 0;
MODEL flussi/all/;OPTIONS lp=cplex;
SOLVE flussi USING lp MAXIMIZING flutot;
DISPLAY x.l,flutot.l;
Programmazione Lineare
Esempio trasporti 2 (4 dimensioni)
Una ditta fornitrice di calcestruzzo pronto per la
gettata possiede due magazzini di materie prime, Ma
e Mb, in grado di rifornire rispettivamente 17 e 19
betoniere al giorno. Vengono richieste da due cantieri
diversi, C1 e C2, rispettivamente 18 e 11 betoniere di
calcestruzzo entro la giornata. I costi di trasporto
unitario sono dati in tabella:
C1 C2
Ma 14 31
Mb 21 16
Si organizzi il trasporto in modo da minimizzare il
costo totale.
Programmazione Lineare
Esempio trasporti 2
MIN 14 xa1 + 31 xa2 + 21 xb1 + 16 xb2
xa1 + xa2 ≤ 17
xb1 + xb2 ≤ 19
xa1 + xb1 ≥ 18
xa2 + xb2 ≥ 11
xa1, xa2, xb1, xb2 ≥ 0

Soluzione: x = C1 C2 z = 435
Ma 17 0
Mb 1 11;
Programmazione Lineare
Esempio trasporti 2
SETS mag/ma,mb/,cant/c1,c2/;
PARAMETERS disp(mag)/ma 17,mb 19/,ric(cant)/c1 18,c2 11/;
TABLE cost(mag,cant)
c1 c2
ma 14 31
mb 21 16;
VARIABLES x(mag,cant),costot;POSITIVE VARIABLE x;
EQUATIONS ob,part(mag),arr(cant);
ob..costot =e= sum((mag,cant),cost(mag,cant)*x(mag,cant));
part(mag)..sum(cant,x(mag,cant)) =l= disp(mag);
arr(cant)..sum(mag,x(mag,cant)) =g= ric(cant);
MODEL trapic/all/;OPTIONS lp=cplex;
SOLVE trapic USING lp MINIMIZING costot;
DISPLAY x.l,costot.l;
Programmazione Lineare
Esempio trasporti (12 dimensioni)
Una ditta fornitrice di calcestruzzo possiede tre
magazzini, A, B, C, capaci di fornire rispettiva-
mente 80, 65 e 45 betoniere al giorno, e deve
servire quattro cantieri, 1, 2, 3, 4, che richiedono
15, 25, 30, 50 betoniere al giorno. Il costo unitario
di trasporto è dato in tabella:
1 2 3 4
A 41 27 28 24
Cij= B 40 29 42 23
C 37 30 27 21
Organizzare il rifornimento al minimo costo di
trasporto totale.
Programmazione Lineare
Esempio trasporti
di = 80, 65, 45; rj = 15, 25, 30, 50

MIN ∑ (cij xij | i=A,B,C; j=1,2,3,4)

∑ (xij | j=1,2,3,4) ≤ di per ogni i=A,B,C

∑ (xij | i=A,B,C) ≥ rj per ogni j=1,2,3,4

xij ≥ 0 per ogni i=A,B,C e per ogni j=1,2,3,4


Programmazione Lineare
Esempio trasporti
SETS mag/A,B,C/, cant/1*4/;
PARAMETERS disp(mag)/A 80,B 65,C 45/,ric(cant)
/1 15,2 25,3 30,4 50);
TABLE cost(mag,cant)
1 2 3 4
A 41 27 28 24
B 40 29 42 23
C 37 30 27 21;
VARIABLES costot,x(mag,cant);POSITIVE VARIALE x;
EQUATIONS ob,vincp(mag),vinca(cant);
ob..costot =e= sum((mag,cant),cost(mag,cant)*x(mag,cant));
vincp(mag)..sum(cant,x(mag,cant)) =l= disp(mag);
vinca(cant)..sum(mag,x(mag,cant)) =g= ric(cant);
MODEL trasp/all/; OPTIONS lp=cplex;
SOLVE trasp USING lp MINIMIZING costot;
DISPLAY costot.l,x.l;
Programmazione Lineare
Esempio trasporti
Soluzione:

xij = 1 2 3 4
A 0 25 30 0
B 0 0 0 20
C 15 0 0 30

z = 3160
Programmazione Lineare
Esempio miscelazione
3 benzine, a, b, c, vengono ottenute miscelando 4
prodotti, 1, 2, 3, 4. Le 3 benzine vengono vendute
al prezzo rispettivo di 5.5, 4.5 e 3.5; i 4 prodotti
sona a disposizione in quantità rispettive di 3000,
2000, 4000 e 1000 e costano 3, 6, 4 e 5. Vi sono i
seguenti vincoli di miscelazione:
prod. 1 2 3 4
benz a ≤30% ≥40% ≤50% lib
b ≤50% ≥10% lib lib
c ≥70% lib lib lib
Determinare le miscele a massimo guadagno
Programmazione Lineare
Esempio miscelazione
MAX (5.5-3)xa1+(5.5-6)xa2+(5.5-4)xa3+(5.5-5)xa4+
(4.5-3)xb1+(4.5-6)xb2+(4.5-4)xb3+(4.5-5)xb4+
(3.5-3)xc1+(3.5-6)xc2+(3.5-4)xc3+(3.5-5)xc4

xa1+xb1+xc1≤3000
xa2+xb2+xc2≤2000
xa3+xb3+xc3≤4000
xa4+xb4+xc4≤1000
Programmazione Lineare
Esempio miscelazione
xa1 ≤ 0.3 (xa1+xa2+xa3+xa4)
xa2 ≥ 0.4 (xa1+xa2+xa3+xa4)
xa3 ≤ 0.5 (xa1+xa2+xa3+xa4)
xb1 ≤ 0.5 (xb1+xb2+xb3+xb4)
xb2 ≥ 0.1 (xb1+xb2+xb3+xb4)
xc1 ≥ 0.7 (xc1+xc2+xc3+xc4)

xij ≥ 0 , i=a,b,c, j=1,2,3,4


Programmazione Lineare
Esempio (miscelazione)
Soluzione:
prod. 1 2 3 4
benz a 1100/3 4400/3 5500/3 0
b 7900/3 1600/3 6500/3 0
c 0 0 0 0
Programmazione Lineare
Esempio (miscelazione)
Scrittura sintetica dei dati:
i=a,b,c benzine; j=1,2,3,4 prodotti
q(j) quantità disponibile del prodotto j
p(i) prezzo unitario della benzina i
c(j) costo unitario del prodotto j
li(i,j) frazione minima del prodotto j nella
benzina i
ls(i,j) frazione massima del prodotto j nella
benzina i
Programmazione Lineare
Esempio (miscelazione)
Variabili decisionali: x(i,j) i=a,b,c;j=1,2,3,4
quantità del prodotto j nella benzina i

Scrittura sintetica del modello:


MAX ∑{[p(i)-c(j)]x(i,j)|i=a,b,c;j=1,2,3,4}
∑{x(i,j)|i=a,b,c,}≤q(j) j=1,2,3,4
x(i,j)≥li(i,j)∑{x(i,j)|j=1,2,3,4} i=a,b,c;j=1,2,3,4
x(i,j)≤ls(i,j)∑{x(i,j)|j=1,2,3,4} i=a,b,c;j=1,2,3,4
Programmazione Lineare
Esempio (miscelazione)
SETS ben/a,b,c/,pro/1*4/;alias (pro,pro1);
PARAMETERS disp(pro)/1 3000,2 2000,3 4000,4 1000/,
cost(pro)/1 3,2 6,3 4,4 5/,prez(ben)/a 5.5,b 4.5,c 3.5/;
TABLE limin(ben,pro)
1 2 3 4
a 0 0.4 0 0
b 0 0.1 0 0
c 0.7 0 0 0;
TABLE limax(ben,pro)
1 2 3 4
a 0.3 1 0.5 1
b 0.5 1 1 1
c 1 1 1 1;
VARIABLES x(ben,pro),guatot;POSITIVE VARIABLE x;
EQUATIONS ob,scorta(pro),vimin(ben,pro),vimax(ben,pro);
ob..guatot =e= sum((ben,pro),(prez(ben)-cost(pro))*x(ben,pro));
scorta(pro)..sum(ben,x(ben,pro)) =l= disp(pro);
vimin(ben,pro)..x(ben,pro) =g= limin(ben,pro)*sum(pro1,x(ben, pro1));
vimax(ben,pro)..x(ben,pro) =l= limax(ben,pro)*sum(pro1,x(ben, pro1));
MODEL miscben/all/;OPTIONS lp=cplex;
SOLVE miscben USING lp MAXIMIZING guatot;DISPLAY x.l,guatot.l;

Potrebbero piacerti anche