Introduzione a Lingo TM www.lindo.com Massimo Paolucci (paolucci@dist.unige.it) DIST Università di Genova 2001/2002 Lingo caratteristiche generali 2 E un software per la PL e IP, ma anche per problemi non lineari Permette di scrivere il problemi direttamente in termini di funzione obiettivo, vincoli e variabili (ciò che fa Lindo) Permette di scrivere i programmi usando una sintassi simbolica (linguaggio di modellazione matematico) Rappresenta sommatorie, cicli ecc. Separa il modello dai dati
Lingo Definizione e soluzione di problemi 3 Esempio di input di un PL sulla carta Max Z = 3x E + 2x I xe + 2xI 6 2xE + xi 8 - xe + xi 1 xi 2 xe 0 xi 0 con Lingo max =3*xE+2*xI ; xe+2*xi<=6 ; 2*xE+xI<=8 ; -xe+xi<=1 ; xi<=2 ; non ci sono i vincoli di positività non c è la Z ci sono ; alla fine delle righe Lingo Definizione e soluzione di problemi 4 Esempio di input di un PL definito il modello il bottone attiva il processo di soluzione (dopo la verifica sintattica)
Lingo Definizione e soluzione di problemi 5 Esempio di input di un PL la finestra di soluzione fornisce svariate informazioni Lingo Definizione e soluzione di problemi 6 Esempio di input di un PL il report mostra il risultato ottenuto Primale informazioni sul duale
7 Struttura di un modello Lingo MODEL: [ TITLE <nome modello>; ] SETS: <definizione degli insieme di indici, delle variabili e delle costanti> ENDSETS DATA: <assegnazioni valori alle costanti> ENDDATA <definizione della funzione obiettivo e dei vincoli> END Ogni riga (ad eccezione di quelle che identificano le parti del modello) deve terminare per ; Commenti: testo tra! e ; 8 SETS: Insiemi e variabili Le variabili non sono tipizzate I Set sono classi di elementi che possiedono attributi che possono essere quantificati Si possono dichiarare Array o creare oggetti che assumono tanti valori quanti gli elementi di uno o più insieme Sintassi : setname [/ member_list /] [: attribute_list]; Esempio Vettori: variabili o costanti definite su un insieme SET PRIMOINSIEME /ELE1,ELE2/:PROPRIETÀ; CASE /CASA2,CASA1/:COLORE; ENDSET In questo modo sono stati creati i seguenti vettori: [PROPRIETÀ(ELE1),PROPRIETÀ(ELE2)] [COLORE(CASA1),COLORE(CASA2)] Definizione implicita: WAREHOUSES / 1..6/: CAPACITY;
9 SETS: Matrici (variabili o costanti definite su più insiemi) Sono insiemi derivati: setname( parent_set_list) [ / member_list /] [: attribute_list]; Esempio SET PRIMOINSIEME /ELE1,ELE2/:PROPRIETÀ; CASE /CASA2,CASA1/:COLORE; LINKS(PRIMOINSIEME,CASE):PREZZO,VOLUME; ENDSET Si è creato un template di una struttura: Links=(Ele1 Casa1, Ele2 Casa1, Ele1 Casa2, Ele2 Casa2) = ( Ele1 Casa1, Ele1 Casa2 Ele2 Casa1, Ele2 Casa2 ) Prezzo(i, j) e Volume(i, j) sono due matrici i cui elementi sono definiti dalle combinazioni dei due insiemi, e.g., Prezzo(Ele2, Casa1) 10 SETS: Sottinsiemi di elementi Per default un insieme derivato (o matrice) ha tanti elementi quanti il prodotto cartesiano degli insiemi da cui deriva PRODUCT / A B/; MACHINE / M N/; WEEK / 1..2/; ALLOWED( PRODUCT, MACHINE, WEEK); Si possono costruire sottinsiemi del prodotto cartesiano esplicitamente o attraverso condizioni ALLOWED( PRODUCT, MACHINE, WEEK) / A M 1, A N 2, B N 1/; HEAVY_DUTY( TRUCKS) CAPACITY( &1) #GT# 50000:; inizio condizione indice riferito al primo insieme derivato (TRUCKS)
11 DATA: assegnazione valori alle costanti La sintassi: object_list = value_list; Esempi DATA PROPRIETÀ=3,4; COLORE=ROSSO,VERDE; ENDDATA In questo modo sono stati assegnati i valori agli attributi degli insiemi : PROPRIETÀ (ELE1)=3, PROPRIETÀ (ELE2)=4 [COLORE(CASA1),COLORE(CASA2)]=[ROSSO,VERDE] 12 DATA: assegnazione valori alle costanti Altri esempi significativi... SETS: SET1 /A, B, C/: X, Y; ENDSETS DATA: X, Y = 1, 4, 2, 5, 3, 6; ENDDATA... inizializzazione delle dimensioni nella sezione DATA SETS: SET1: X, Y; ENDSETS DATA: SET1, X, Y = A 1 4 B 2 5 C 3 6; ENDDATA
13 DATA: assegnazione valori alle costanti Inizializzazione con un unico valore costante SETS: DAYS / MO, TU, WE, TH, FR, SA, SU/:NEEDS; ENDSETS DATA: NEEDS = 20; ENDDATA Attributi in parte costanti ed in parte variabili SETS: YEARS /1..5/: CAPACITY; ENDSETS DATA: CAPACITY = 34, 34,,, ; ENDDATA 14 Input dati runtime (what if analysis) Le costanti possono essere specificate runtime lasciandole indicate con? DATA: ENDDATA INFLATION_RATE =?; Si possono importare dati da fogli Excel, Database oppure file testo @IMPORT( worksheet filename, data range name); @File(filename); object_list = @ODBC( [ data_source [, table_name [, column_name_1 [, ]]]]); Esiste anche una section INIT per inizializzare le variabili INIT: X =.999; ENDINIT
15 Funzioni ricorsive Funzione da richiamare Condizione da verificare set_operator (set_name /condition : expression) Insieme su cui lavorare Espressione da eseguire 16 Funzioni ricorsive Operatori: @FOR (set_name [ conditions ] : costraint_expression) @MAX (set_name [ conditions ] : expression) @MIN (set_name [ conditions ] : expression) @SUM (set_name [ conditions ] : expression)
17 Funzioni per la specifica delle caratteristiche delle variabili Funzioni : @BND (lower bound, x, upper bound) L x U @BIN(x) x B @FREE(x) x variabile libera @GIN(x) x Z 18 Esempio @FOR (InsiemeA( ) : @BND (0, x, 1) ) Impone per tutte le variabili x definite sui valori dell InsiemeA di restare tra 0 ed 1 : L x i U i InsiemeA Le relazioni (vincoli, obiettivo) possono essere etichettate [etichetta] <relazione> [LIMITI] @FOR (InsiemeA( ) : @BND (0, x, 1) )
19 Funzioni matematiche @ABS(X) @COS(X) @EXP(X) @LOG(X) Valore assoluto di x Coseno di x, dove x è l angolo in radianti e x log(x) @SIGN(X) -1 se x < 0, e +1 se x => 0 @SIN(X) @SMAX(list ) @SMIN(list ) @TAN(X) @SIZE (set_name) Seno di x, dove x è l angolo in radianti E il più grande valore tra una lista di scalari E il più piccolo valore tra una lista di scalari Tangente di x, dove x è l angolo in radianti Fornisce il numero di elementi nel set 20 Operatori logici #EQ# = #NE# #GT# > #GE# #LT# < #LE# #AND# #OR# #NOT#
21 Un esempio di modello: un problema di Blending Descrizione: Il manager della produzione di un impianto di raffinamento di carburanti vuole massimizzare il profitto che deriva dalla produzione di due prodotti finiti, carburanti indicati con Regular e Premium ottenuti dalla miscelazione delle materie prime, butane, catalytic reformate, naphtha. (prodotto = mat.prima 1 + mat.prima 2 + mat. prima 3) I prodotti finali si differenziano tra loro perchè devono soddisfare dei requisiti di qualità minimi e massimi in termini di octane, vapor pressure, and volatility. Le materie prime hanno una capacità limitata ed un costo unitario noto. Sono date anche le richieste minime per ciascuno dei due prodotti finiti, la quantità massima che può essere venduta ed il valore del ricavo unitario dalla loro vendita. Si vuole determinare quanto produrre dei due prodotti e come produrre, ossia la miscelazione più conveniente delle componenti che soddisfi le specifiche di produzione dei due carburanti 22 Un esempio di modello: un problema di Blending I numeri in gioco Disponibilità e costi unitari delle materie prime : butane: 1000, 7.3 catalytic reformate: 4000, 18.2 naphtha: 5000, 12.5 Livello di qualità delle materie prime octane vapor pressure volatility butane 120 60 105 catalytic reformate 100 2.6 3 naphtha 74 4.1 12 Limiti sulla domanda: Regular: min=4000, max=8000 Premium: min=2000, max=6000
23 Un esempio di modello: un problema di Blending I numeri in gioco Prezzo unitario dei prodotti finiti : Regular : 18.4 Premium : 22 Limiti di qualità dei prodotti: MASSIMI octane vapor pressure volatility MINIMI octane vapor pressure volatility Regular 110 11 25 Regular 90 8 17 Premium 110 11 25 Premium 95 8 17 24 Formulazione sulla carta Insiemi Prodotti finiti F, i F Materie prime M, j M Qualità Q, k Q Dati Disponibilità materie prime (vettore), a j Costo unitario materie prime (vettore), c j Qualità unitarie delle materie prime (matrice), q jk Prezzo prodotti finiti (vettore), p i Richiesta minima prodotti finiti (vettore), dl i Richiesta massima prodotti finiti (vettore), du i Specifica minima delle qualità unitarie dei prodotti finiti (matrice), ql ik Specifica massima delle qualità unitarie dei prodotti finiti (matrice), qu ik
25 Formulazione sulla carta Variabili (decisioni) Quanto produrre dei prodotti (batch) (vettore), x i Quantità di materia prima usata per produrre i prodotti (matrice), u ij Obiettivo (da massimizzare): profitto = ricavo - costi x0 = pi xi c j u i F j M i F ij 26 Formulazione sulla carta Vincoli Rispetto disponibilità Quantità totale prodotta uij i F a j uij = j M j M xi i F Limiti massimi e minimi per la produzione dli xi dui i F Rispetto delle specifiche di qualità qlik xi qjk j M uij quik xi i F, k Q
27 Formulazione sulla carta Introducendo una variabile di slack (per visualizzare nel risultato quanto margine c è rispetto il limite massimo) qs ik = slack rispetto il max livello di k del prodotto i qjk j M uij + qsik = quik xi i F, k Q qsik (quik qlik ) xi i F, k Q 28 La formulazione con Lingo MODEL: TITLE BLEND;... END
29 La formulazione con Lingo SETS:! Materie prime; RAWMAT/ BUTANE, CATREF, NAPHTHA/: AVAIL, COST;! Prodotti finiti (batch è la variabile x ); FINGOOD/ REGULAR, PREMIUM/: MINREQ, MAXSELL, PRICE, BATCH;! Qualità ; QUALMES/ OCTANE, VAPOR, VOLATILITY/;... 30 La formulazione con Lingo SETS:...! Misura della qualità unitaria delle materie prime ; RXQ( RAWMAT, QUALMES): QLEVEL;! Specifiche livelli minimi e massime delle qualità dei prodotti ;! Definizione delle variabili slack di qualità ; QXF( QUALMES, FINGOOD): QUP, QLOW, QSLACK;! Miscelazione: quantità di materie prime usate nei prodotti ; RXF( RAWMAT, FINGOOD): USED; ENDSETS
31 La formulazione con Lingo DATA:! Disponibilità materie prime ; AVAIL = 1000, 4000, 5000;! Costi materie prime; COST = 7.3, 18.2, 12.5;! Parametri di qualità materie prime ; QLEVEL = 120, 60, 105, 100, 2.6, 3, 74, 4.1, 12;! Limiti domanda prodotti finiti ; MINREQ = 4000, 2000; MAXSELL = 8000, 6000;... 32 La formulazione con Lingo DATA:...! Prezzi prodotti finiti ; PRICE = 18.4, 22;! Specifiche minime e massime sulla qualità dei prodotti finiti ; QUP = 110, 110, 11, 11, 25, 25; QLOW = 90, 95, 8, 8, 17, 17; ENDDATA
33 La formulazione con Lingo - Vincoli! Disponibilità materie prime ; @FOR( RAWMAT( R): [RMLIM] @SUM( FINGOOD( F): USED( R, F)) <= AVAIL( R); ); 34 La formulazione con Lingo - Vincoli @FOR(FINGOOD(F):! Produzione totale (batch); [BATCOMP] BATCH(F) = @SUM(RAWMAT(R): USED(R, F));! Limiti minimi e massimi della produzione (batch); @BND(MINREQ, BATCH, MAXSELL);! Vincoli sulla qualità dei prodotti finiti ; @FOR(QUALMES(Q): [QRESUP] @SUM(RAWMAT(R): QLEVEL(R, Q) * USED(R, F)) + QSLACK(Q, F) = QUP(Q, F) * BATCH(F); [QRESDN] QSLACK(Q, F) <= ( QUP(Q, F) - QLOW(Q, F)) * BATCH(F); ); );
35 La formulazione con Lingo - Obiettivo! Massimizzazione del profitto; [OBJECTIVE] MAX = @SUM(FINGOOD: PRICE * BATCH) @SUM(RAWMAT(R): COST(R) * @SUM(FINGOOD(F): USED(R, F)));... provare ad eseguirlo ed ad interpretare il risultato...