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> END ENDSETS DATA: <assegnazioni valori alle costanti> <definizione della funzione obiettivo e dei vincoli> 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; 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;... inizializzazione delle dimensioni nella sezione DATA SETS: SET1: X, Y; ENDSETS DATA: SET1, X, Y = A 1 4 B 2 5 C 3 6;
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; Attributi in parte costanti ed in parte variabili SETS: YEARS /1..5/: CAPACITY; ENDSETS DATA: CAPACITY = 34, 34,,, ; 14! Input dati runtime (what if analysis) Le costanti possono essere specificate runtime lasciandole indicate con? DATA: 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... to be continued