Introduzione a LingoTM
Transcript
Introduzione a LingoTM
Introduzione a LingoTM www.lindo.com Massimo Paolucci ([email protected]) DIST – Università di Genova 2001/2002 2 Lingo – caratteristiche generali 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 = 3xE + 2xI xE + 2xI ≤ 6 2xE + xI ≤ 8 - x E + 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 Esempio di input di un PL • definito il modello il bottone attiva il processo di soluzione (dopo la verifica sintattica) 4 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 Esempio di input di un PL • il report mostra il risultato ottenuto Primale informazioni sul duale 6 Lingo – Mathematical Modeling Language 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 ; Lingo – Mathematical Modeling Language 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; 8 Lingo – Mathematical Modeling Language 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) Lingo – Mathematical Modeling Language 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) 10 Lingo – Mathematical Modeling Language 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] Lingo – Mathematical Modeling Language 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 B25 C 3 6; ENDDATA 12 Lingo – Mathematical Modeling Language 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 Lingo – Mathematical Modeling Language Input dati runtime (what if analysis) • Le costanti possono essere specificate runtime lasciandole indicate con “?” DATA: INFLATION_RATE = ?; ENDDATA • 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 14 Lingo – Mathematical Modeling Language 15 Funzioni ricorsive Funzione da richiamare Condizione da verificare set_operator (set_name /condition : expression) Insieme su cui lavorare Espressione da eseguire Lingo – Mathematical Modeling Language Funzioni ricorsive • Operatori: @FOR (set_name [ | conditions ] : costraint_expression) @MAX (set_name [ | conditions ] : expression) @MIN (set_name [ | conditions ] : expression) @SUM (set_name [ | conditions ] : expression) 16 Lingo – Mathematical Modeling Language 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 Lingo – Mathematical Modeling Language 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 ≤ xi ≤ U i ∈InsiemeA • Le relazioni (vincoli, obiettivo) possono essere etichettate [etichetta] <relazione> [LIMITI] @FOR (InsiemeA( ) : @BND (0, x, 1) ) 18 Lingo – Mathematical Modeling Language 19 Funzioni matematiche @ABS(X) Valore assoluto di x @COS(X) Coseno di x, dove x è l’angolo in radianti @EXP(X) ex @LOG(X) log(x) @SIGN(X) -1 se x < 0, e’ +1 se x => 0 @SIN(X) Seno di x, dove x è l’angolo in radianti @SMAX(list ) E’ il più grande valore tra una lista di scalari @SMIN(list ) E’ il più piccolo valore tra una lista di scalari @TAN(X) Tangente di x, dove x è l’angolo in radianti @SIZE (set_name) Fornisce il numero di elementi nel set Lingo – Mathematical Modeling Language Operatori logici #EQ# = #NE# ≠ #GT# > #GE# ≥ #LT# < #LE# ≤ #AND# #OR# #NOT# 20 Lingo – Mathematical Modeling Language 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 Lingo – Mathematical Modeling Language 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 22 23 Lingo – Mathematical Modeling Language 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: 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 MASSIMI Lingo – Mathematical Modeling Language Formulazione sulla carta • Insiemi Prodotti finiti F, i ∈ F Materie prime M, j ∈ M Qualità Q, k ∈ Q • Dati Disponibilità materie prime (vettore), aj Costo unitario materie prime (vettore), cj Qualità unitarie delle materie prime (matrice), qjk Prezzo prodotti finiti (vettore), pi Richiesta minima prodotti finiti (vettore), dli Richiesta massima prodotti finiti (vettore), dui Specifica minima delle qualità unitarie dei prodotti finiti (matrice), qlik Specifica massima delle qualità unitarie dei prodotti finiti (matrice), quik 24 25 Lingo – Mathematical Modeling Language Formulazione sulla carta • Variabili (decisioni) Quanto produrre dei prodotti (batch) (vettore), xi Quantità di materia prima usata per produrre i prodotti (matrice), uij • Obiettivo (da massimizzare): profitto = ricavo - costi x 0 = ∑ pi ⋅ xi − ∑ c j ⋅ ∑ uij i∈F j∈M i∈F 26 Lingo – Mathematical Modeling Language Formulazione sulla carta • Vincoli Rispetto disponibilità Quantità totale prodotta ∑ uij ≤ a j i∈F ∀j ∈ M ∑ uij = x i j∈M Limiti massimi e minimi per la produzione ∀i ∈ F dli ≤ x i ≤ dui Rispetto delle specifiche di qualità qlik ⋅ x i ≤ ∑ q jk ⋅ uij ≤ quik ⋅ x i j∈M ∀i ∈ F, ∀k ∈ Q ∀i ∈ F Lingo – Mathematical Modeling Language 27 Formulazione sulla carta • Introducendo una variabile di slack (per visualizzare nel risultato quanto margine c’è rispetto il limite massimo) qsik = slack rispetto il max livello di k del prodotto i ∑ q jk ⋅ uij + qsik = quik ⋅ x i ∀i ∈ F, ∀k ∈ Q j∈M qsik ≤ (quik − qlik ) ⋅ x i ∀i ∈ F, ∀k ∈ Q Lingo – Mathematical Modeling Language La formulazione con Lingo MODEL: TITLE BLEND; ..... END 28 Lingo – Mathematical Modeling Language 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/; .... Lingo – Mathematical Modeling Language 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 30 Lingo – Mathematical Modeling Language 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; ... Lingo – Mathematical Modeling Language 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 32 Lingo – Mathematical Modeling Language 33 La formulazione con Lingo - Vincoli ! Disponibilità materie prime ; @FOR( RAWMAT( R): [RMLIM] @SUM( FINGOOD( F): USED( R, F)) <= AVAIL( R); ); Lingo – Mathematical Modeling Language 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); ); ); 34 Lingo – Mathematical Modeling Language 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... 35