Università di Catania L.M. in Informatica Metodi Matematici per l Ottimizzazione Modulo di Ottimizzazione Matematica Il linguaggio GAMS - Lezione I Laura Scrimali DMI - Studio 338, piano II blocco I Tel. 095 7383063 - E-mail: scrimali@dmi.unict.it
I generatori algebrici di modelli Fra gli anni 50 e gli anni 70, la programmazione matematica compì grandi progressi, cui non corrispose un applicazione altrettanto diffusa a problemi reali. Un forte ostacolo era dato dalla difficoltà di costruire i modelli, raccogliere e organizzare i dati, programmare gli algoritmi risolutivi e analizzare i risultati ottenuti.
Approccio modellistico
Nell approccio modellistico il passaggio dal problema alla strategia risolutiva è tutt altro che immediato. Anche il passaggio dal modello alla soluzione è solo apparentemente astratto e matematico. Infatti, questo passaggio comprende anche: 1 la traduzione del modello (pensato o scritto in linguaggio matematico) e dei dati (disponibili su carta o in un database informatico) in strutture dati accessibili a un risolutore 2 la realizzazione di un risolutore, che trasformi i dati in una soluzione opportunamente codificata 3 la traduzione della soluzione in un formato accessibile all utente (tabelle, grafici o altro).
Risolutori potenti sono poco utili a livello applicativo se l utente non dispone di un interfaccia comoda verso il risolutore, ovvero di un software che gestisca modelli e dati appartenenti al mondo reale e interroghi il risolutore. I generatori algebrici di modelli, fra cui GAMS, costituiscono quest interfaccia, cioè si occupano del primo e del terzo passo, lasciando il secondo al risolutore.
Caratteristiche principali Le caratteristiche principali dei generatori algebrici di modelli sono: fornire un linguaggio semplice per descrivere modelli complessi, permettere all utente di comunicare con il risolutore attraverso file di testo anziché attraverso strutture dati, in modo da non richiedere conoscenze informatiche approfondite e da consentire di formulare il modello con un semplice editor, qualunque sia la piattaforma su cui viene scritto e quella su cui viene risolto permettere all utente di comunicare con diversi risolutori, in modo da poter sfruttare i più potenti sul mercato, ovvero quelli disponibili
GAMS GAMS (General Algebraic Modeling System) è un linguaggio di modellazione algebrico per problemi di problemi lineari e non lineari, problemi in variabili intere e continue. GAMS consta di un compilatore e di risolutori di alto livello.
Una volta che il problema viene formulato tramite il linguaggio GAMS, occorre un opportuno risolutore di programmazione matematica per risolvere il problema. Sono disponibili diversi risolutori, la cui scelta dipende dal tipo di problema. In questo corso utilizzeremo l interprete GAMS ed il risolutore CPLEX, versione student.
Software Sito ufficiale: www.gams.com. La pagina contiene: le istruzioni per il download, il software eseguibile per le diverse piattaforme, l elenco dei risolutori.
Un esempio Un imprenditore deve pianificare la produzione di cappelli della propria impresa manifatturiera per una singola giornata. La ditta può produrre 4 diversi modelli di cappelli, sfruttando la manodopera di tre artigiani. Il tempo impiegato da ogni artigiano per produrre i vari modelli è il seguente (in ore/pezzo). Modello/Artigiano 1 2 3 1 1.5 3.5 4 2 1.8 2 3 3 2 1.8 2.5 4 2.5 1.5 3.5 Per accordi sindacali pregressi ogni artigiano deve lavorare per un minimo di 8 ore giornaliere, senza eccederne un massimo di 10.
Di ogni modello di scarpe sono noti il prezzo di vendita in euro e una stima della massima quantità di pezzi che il mercato può assorbire. Modello Prezzo Quantità 1 56 4 2 86 3 3 45 3 4 32 5 Formulare in termini di programmazione lineare intera il problema di determinare un piano di produzione che massimizzi il profitto.
Traduzione in GAMS option optcr=0.0; Sets I artigiani / artigiano-1, artigiano-2, artigiano-3 /, J modelli di cappelli / modello-a, modello-b, modello-c, modello-d / ; Parameters p(j) prezzo di vendita /modello-a 56, modello-b 86, modello-c 45,modello-D 32/, q(j) quantità massima /modello-a 4, modello-b 3, modello-c 3,modello-D 5/; Parameter Tmin; Tmin = 8; Parameter Tmax; Tmax = 10; Table tempo(j,i) tempo di lavorazione artigiano-1 artigiano-2 artigiano-3 modello-a 1.5 3.5 4 modello-b 1.8 2 3 modello-c 2 1.8 2.5 modello-d 2.5 1.5 3.5 ; Variables x(j,i) numero di cappelli, z profitto totale ; Integer Variable x; Equations tempomin(i), tempomax(i), quantimax(j), profitto; tempomin(i).. sum(j,tempo(j,i)*x(j,i))=g=tmin; tempomax(i).. sum(j,tempo(j,i)*x(j,i))=l=tmax; quantimax(j).. sum(i,x(j,i))=l=q(j); profitto..z=e= sum(i,sum(j,p(j)*x(j,i))); Model produzione /all /; Solve produzione maximizing z using mip;
Input e output files Gli utenti preparano un file di modello di estensione.gms che contiene tutte le componenti del modello (variabili, funzione obiettivo, vincoli, etc.). Quando il file è pronto per essere eseguito, il sistema lo interpreta e, invocando il risolutore, restituisce come output il file di estensione.lst. Il file.gms può essere processato dalla linea di comando scrivendo gams filename.
Un modello GAMS è dato da un insieme di istruzioni nel linguaggio GAMS. Non importa l ordine con cui si inseriscono le istruzioni. L importante è che simboli e valori siano dichiarati prima di essere richiamati. Ciascuna istruzione di GAMS deve terminare con un punto e virgola. Può essere omesso nell ultima istruzione. GAMS non distingue tra lettere maiuscole e lettere minuscole. Le righe di commento devono essere precedute dal simbolo, oppure comprese tra i comandi $ Ontext... $ Offtext. Il testo che segue una specifica istruzione è sempre interpretato come un commento.
Organizzazione di un modello GAMS
Componenti fondamentali di un modello GAMS Ci sono cinque tipi fondamentali di input Parameters: (asseganti esogenamente) Variables: (variabili decisionali - sconosciute e esogene) Equations: (vincoli e funzione obiettivo) Model: (indica quali equazioni fanno parte del modello) Solve: (che tipo di problema deve essere risolto) La sintassi (dichiarazione e definizione) Parameter nome descrizione /valore/; Variables nome descrizione; Equations nome descrizione; Model nome-modello /nome-equazione,.../ (or: /all/ ); Solve nome-modello using tipo-risolutore minimizing (o maximizing) nome-variabile-funzione-obiettivo.
Procedura risolutiva lp: programmazione lineare; mip: programmazione lineare intera mista; rmip: rilassamento di un problema di programmazione lineare intera mista; qcp: programmazione quadratica vincolata; nlp: programmazione non lineare; dnlp: programmazione non lineare con derivate discontinue; miqcp: programmazione quadratica vincolata intera mista.
Risolutori Solutore Problemi Supportati Minos Cplex Lpsolve Progr. Lin. Progr. Nonlin. Progr. Lin. Progr. Quadr. Progr. Lin. Reti Progr. Lin. Intera Progr.Quadr. Intera Progr. Mista Intera Progr. Lin. Progr. Lin. Intera Progr. Mista Intera Algoritmi Implementati Simplesso Gradiente Ridotto Gradiente Proiettato Simplesso Punti Interni Simplesso su Reti Branch and Bound Cutting Planes Branch and Cut Simplesso Branch and Bound
Insiemi Un insieme deve essere: dichiarato con un nome che identifica l insieme attraverso la parola chiave Set (o Sets); la descrizione di cosa rappresenta; definito assegnando gli elementi all insieme dichiarato Esempio Per definire l insieme S di elementi a,b,c,d dichiariamo Set S /a, b, c, d/; Non sono ammessi nomi con più parole. Ad esempio si può scrivere San-Diego ma non San Diego.
In caso di più insiemi si può avere Esempio Set S /a, b, c, d/; Set A /1, 2, 3, 4/; oppure Sets S insieme di alimenti /a, b, c, d/ T insieme di principi nutritivi /f, g, h, i/; A piacimento si possono inserire spazi e righe vuote. Il testo contenuto dopo la dichiarazione dei nomi degli insiemi è solo esplicativo.
Per indicare successioni di elementi si usa il simbolo. Esempio Per definire l insieme S = {1, 2, 3,..., 50} dichiariamo Set S /1 * 50/; Un utile comando è alias che assegna un nome diverso ad un insieme precedentemente dichiarato. Ad esempio Alias (t,tp). Il muovo insieme può essere usato alternativamente al primo e contiene sempre gli stessi elementi del problema originario. E possibile introdurre più nomi con il comando alias. L ordine degli insiemi non conta, ma uno di essi deve essere stato definito precedentemente.
Dati GAMS usa tre formati per inserire i dati: liste (parametri), tabelle, assegnazione diretta.
Liste Esempio p(j) prezzo di vendita /modello-a 56, modello-b 86, modello-c 45,modello-D 32/, q(j) quantità massima /modello-a 4, modello-b 3, modello-c 3, modello-d 5/; Occorre dichiarare i parametri ed i loro domini, I valori sono inseriti tra i simboli /... / I valori degli elementi devono essere separati da, o inseriti su righe differenti.
Tabelle I dati possono essere inseriti in opportune tabelle. Esempio artigiano-1 artigiano-2 artigiano-3 modello-a 1.5 3.5 4 modello-b 1.8 2 3 modello-c 2 1.8 2.5 modello-d 2.5 1.5 3.5 ;
Assegnazione diretta Esempio Parameter c(i,j)=f*d(i,j)/ 1000 GAMS farà automaticamenti i calcoli per determinare i valori che assumono i parametri; ad uno stesso parametro può essere assegnato più volte un valore. Ogni assegnazione ha effetto immediato e sovrascrive ogni precedente valore. Uno scalare può essere riguardato come un parametro che non ha dominio.
Variabili Le variabili decisionali sono introdotte dall istruzione Variables. Ci sono cinque tipi di variabili VARIABLE (libera): ], + [ POSITIVE VARIABLE: [0, + [ NEGATIVE VARIABLE: ], 0] INTEGER: 0, 1,..., 100 BINARY: 0, 1 Le variabili hanno quattro caratteristiche upper bound.up lower bound.lo valore iniziale.l valore fissato.fx
Esempio Variables x(j,i) numero di cappelli, z profitto totale ; Integer Variable x; La variabili decisionali sono espresse algebricamente, specificando gli indici. La funzione obiettivo è dichiarata tra le variabili senza alcun indice e deve essere libera. La variabile z è dichiarata senza dominio perché è uno scalare. Non occorre ripetere il dominio delle variabili quando si dichiara il tipo.
Equazioni Le equazioni sono le istruzioni più complesse in GAMS. Le componenti sono: il nome dell equazione; il dominio; condizioni di restrizione del dominio; Il simbolo.. il primo membro dell equazione; gli operatori di relazione: =e= indica = =l= indica =g= indica il secondo membro dell equazione.
Equazioni Equations tempomin(i), tempomax(i), quantimax(j), profitto; tempomin(i).. sum(j,tempo(j,i)*x(j,i))=g=tmin; tempomax(i).. sum(j,tempo(j,i)*x(j,i))=l=tmax; quantimax(j).. sum(i,x(j,i))=l=q(j); profitto..z=e= sum((j,i),p(j)*x(j,i));
Istruzioni model e solve Model produzione /all /; Al modello viene assegnato un nome. Occorre poi specifiare quali equazioni devono essere incluse nella formulazione. Con l istruzione Solve produzione maximizing z using mip; si indica a GAMS quale modello risolvere, quale risolutore utilizzare, il tipo di problema (massimizzazione o minimizzazione), la variabile obiettivo.
L istruzione Display x.l; richiama i valori finali. Display
Output Il processo di compilazione restituisce due file di output: Process window: Status in blu, errori in rosso LST file: soluzione Contenuto del file.lst: Echo print: una copia del file di input con le righe numerate Equation listing Column Listing Model Statistics Solve Summary SolEQU SolVAR
Solve summary S O L V E S U M M A R Y MODEL produzione OBJECTIVE z TYPE MIP DIRECTION MAXIMIZE SOLVER CPLEX FROM LINE 43 **** SOLVER STATUS 1 Normal Completion **** MODEL STATUS 1 Optimal **** OBJECTIVE VALUE 777.0000 RESOURCE USAGE, LIMIT 0.062 1000.000 ITERATION COUNT, LIMIT 15 2000000000 IBM ILOG CPLEX 24.2.2 r44857 Released Mar 4, 2014 VS8 x86/ Cplex 12.6.0.0
SolEQU ---- EQU tempomin LOWER LEVEL UPPER MARGINAL artigiano-1 8.000 9.600 +INF. artigiano-2 8.000 9.300 +INF. artigiano-3 8.000 8.000 +INF. ---- EQU tempomax LOWER LEVEL UPPER MARGINAL artigiano-1 -INF 9.600 10.000. artigiano-2 -INF 9.300 10.000. artigiano-3 -INF 8.000 10.000. ---- EQU quantimax LOWER LEVEL UPPER MARGINAL modello-a -INF 4.000 4.000. modello-b -INF 3.000 3.000. modello-c -INF 3.000 3.000. modello-d -INF 5.000 5.000. LOWER LEVEL UPPER MARGINAL ---- EQU profitto... 1.000
SolVAR ---- VAR x numero di cappelli LOWER LEVEL UPPER MARGINAL modello-a.artigiano-1. 4.000 +INF 56.000 modello-a.artigiano-2.. +INF 56.000 modello-a.artigiano-3.. +INF 56.000 modello-b.artigiano-1. 2.000 +INF 86.000 modello-b.artigiano-2.. +INF 86.000 modello-b.artigiano-3. 1.000 +INF 86.000 modello-c.artigiano-1.. +INF 45.000 modello-c.artigiano-2. 1.000 +INF 45.000 modello-c.artigiano-3. 2.000 +INF 45.000 modello-d.artigiano-1.. +INF 32.000 modello-d.artigiano-2. 5.000 +INF 32.000 modello-d.artigiano-3.. +INF 32.000 LOWER LEVEL UPPER MARGINAL ---- VAR z -INF 777.000 +INF. z profitto totale