Ottimizzazione Combinatoria Esercitazione AMPL A.A. 2010-20112011 Esercitazione a cura di Silvia Canale contatto e-mail: canale@dis.uniroma1.it Università i di Roma La Sapienza Dipartimento di Informatica e Sistemistica Corso di Laurea in Ingegneria Gestionale 1
AMPL in breve A Mathematical Programming Language AMPL è un linguaggio di modellazione algebrico per problemi di programmazione matematica: - problemi lineari e non lineari - problemi in variabili intere e continue AMPL impiega una notazione basata su concetti semplici e di uso comune per rendere più facile il processo di modellazione di un problema. Una volta formulato tramite il linguaggio AMPL, occorre un opportuno solutore di programmazione matematica per risolvere il problema. L interprete AMPL permette di risolvere un problema formulato tramite il linguaggio AMPL impiegando direttamente un solutore di programmazione matematica. 2
Solutori per AMPL Sono disponibili diversi solutori tramite l interfaccia grafica AMPL. La scelta del solutore dipende dal tipo di problema: - Problemi di programmazione lineare: con variabili continue: GUROBI, BPMPD, CPLEX, LAMPS, LOQO, lp_solve, MINOS, MOSEK, OSL, SOPT, XA, Xpress-MP con variabili intere: GUROBI, CPLEX, LAMPS, lp_solve, MINTO, MOSEK, OSL, SOPT, XA, Xpress-MP - Problemi di programmazione non lineare: quadratici: CPLEX, MOSEK, OSL convessi: MOSEK, SOPT generali continui: CONOPT, DONLP2, FILTER, FSQP, IPOPT, KNITRO, LANCELOT, LOQO, MINOS, NPSOL, PENNON, SNOPT generali interi: MINLP In questo corso utilizzeremo l interprete AMPL ed il solutore CPLEX, versione student. 3
Software AMPL Sito ufficiale: www.ampl.com Tutte le informazioni relative ad AMPL si trovano sul sito ufficiale AMPL Pagina per il download dell interprete APML e dei solutori: www.ampl.com/downloads/index.html La pagina contiene: - istruzione per il download (quick start per Windows e Unix); - software eseguibile dell interprete AMPL; - software eseguibile di diversi solutori. Ulteriori i informazioni i i sul download d sono reperibili alla pagina: www.ampl.com/downloads/details.html AMPL Pagina per il download dell interfaccia grafica: www.ampl.com/gui/expermt.html Sono disponibili tre diverse interfacce grafiche in versione sperimentale. 4
Materiale Oltre alle slide di questa esercitazione, è possibile scaricare dalla pagina della prof.ssa Piccialli http://www.dis.uniroma1.it/~piccialli/teachita.htm il seguente materiale: - Par. 4-11 di Appunti sulla Sintassi e sui Comandi di AMPL Plus v1.6 Manuale in italiano a cura dei dott. R. Bruni, G. Fasano e G. Liuzzi www.dis.uniroma1.it/~piccialli/amplman2.pdf - Esercitazioni i i a cura dalla prof.ssa Piccialli i con appunti delle lezioni i e diversi esempi di problemi di programmazione lineare e non lineare, realizzate per il corso di Ottimizzazione A.A. 2004/2005. Si ringraziano i dott. Piccialli, Bruni, Fasano e Liuzzi per aver reso disponibile il materiale 5
Il linguaggio AMPL AMPL contiene diverse primitive per esprimere la notazione matematica normalmente utilizzata nello scrivere problemi di ottimizzazione (=, <, >,,, sommatorie, funzioni elementari, etc.) Ciascuna istruzione di AMLP deve terminare con un punto e virgola (;). E quindi possibile l indentazione nel file dei comandi. E possibile scrivere in un unico file con estensione.mod tutte le istruzioni AMPL che definiscono il modello, ma è bene separare due elementi del problema da risolvere: - la struttura del modello nel file.mod in cui sono descritte le componenti del modello (variabili, funzione obiettivo, vincoli, etc.); - i dati del modello nel file.dat in cui sono scritti i dati del problema (che in AMPL vengono chiamati parametri). Le righe di commento, sia nel file.mod che nel file.dat, devono essere precedute dal simbolo #. 6
Il linguaggio AMPL Una volta scritti i file con estensione.mod e.dat, è possibile farli interpretare all interprete AMPL attraverso le istruzioni - model file.mod; con questa istruzione vengono interpretate tutte le componenti del modello (variabili, funzione obiettivo, vincoli, etc.); - data file.dat; con questa istruzione vengono assegnati i valori a tutte le componenti del modello dichiarate nel file.mod Esempio: Se abbiamo dichiarato e definito il nostro modello nei file prova.mod e prova.dat, per interpretare i due file scriviamo: model prova.mod; data prova.dat; Da questo momento, tutte le dichiarazioni presenti in prova.mod e tutte le assegnazioni definite in prova.dat sono state interpretate. 7
Il linguaggio AMPL Per modellare un problema di programmazione matematica in AMPL creiamo due file: - file.mod contenente: - la dichiarazione dei parametri - la dichiarazione delle variabili - la struttura e la definizione della funzione obiettivo - la struttura e la descrizione dei vincoli - fl file.dat contenente i valori numerici dei parametri Il file.dat deve iniziare con il comando data. Questa istruzione dice all interprete che segue la definizione delle entità precedentemente dichiarate nel file.mod. I parametri possono essere rappresentati fondamentalmente tramite due tipi di strutture dati: -insieme - parametro (anche a più dimensioni) i i) 8
Esempio Un problema di PL Problema di produzione Un acciaieria deve decidere come impegnare l unico laminatoio disponibile per la produzione della prossima settimana. Il laminatoio lavora lastre di acciaio e può produrre due tipi di semilavorati: a bande (B) oppure tondini di acciaio a (T). In un ora il laminatoio produce 200 tonnellate di bande oppure 140 tonnellate di tondini. Il profitto delle bande è di 25 euro a tonnellata mentre quello dei tondini di 30 euro per tonnellata. Inoltre, tenendo conto degli ordini già esistenti, la produzione della prossima settimana non può superare le 6000 tonnellate di bande e le 4000 tonnellate di tondini. Infine, il laminatoio disponibile solamente per 40 ore in tutta la settimana. Si formuli un problema di PL che permetta di determinare quante tonnellate produrre di bande e quante di tondini. 9
Variabili Esempio Un problema di PL Definizione del problema xb = tonnellate di bande da produrre xt = tonnellate di tondini di acciaio da produrre Funzione obiettivo: massimizzazione del profitto Max 25 * xb + 30 * xt Vincoli di produzione xb <= 6000 xt <= 4000 Vincolo sulla disponibilità del laminatorio ( 1 / 200 ) * xb + ( 1 / 140 ) * xt <= 40 Vincoli di non negatività xb >= 0 xt >= 0 10
File prob.mod param profitto_b; param profitto_t; Esempio Un problema di PL param laminazione_oraria_b; param a laminazione a _oraria a_ T; param tempo_laminazione_massimo; param massima_produzione_b; param massima_produzione_t; var xb >= 0, <= massima_produzione_b; var xt >= 0, <= massima_produzione_t; maximize Profitto: profitto_b * xb + profitto_t * xt; subject to Vincolo_laminatoio: (1/l laminazione_oraria_b i i B)* xb B+(1/l laminazione_oraria_t i i T)* xt <= tempo_laminazione_massimo; 11
File prob.dat data; Esempio Un problema di PL param profitto_b := 25; param profitto_t := 30; param laminazione_oraria_b := 200; param laminazione_oraria_t := 140; param tempo_laminazione_massimo := 40; param massima_produzione_b := 6000; param massima_produzione_t := 4000; 12
Gli insiemi in AMPL AMPL consente di utilizzare la struttura dato insieme. Un insieme dev essere: - dichiarato (nel file.mod), dicendo all interprete AMPL che un nome identifica l insieme che vogliamo utilizzare attraverso la parola chave set; - definito (nel file.dat), assegnando gli elementi all insieme dichiarato; l operatore di assegnazione è :=. Esempio: Per definire l insieme S di elementi a, b, c e d, dichiariamo nel file prova.mod: set S; Successivamente definiamo nel file prova.dat l insieme assegnando gli elementi a, b, c e d: set S := a b c d ; Il linguaggio gg AMLP è case sensitive. 13
Gli insiemi in AMPL Per stampare gli elementi di un insieme possiamo utilizzare l istruzione display seguita dall identificativo dell insieme. Esempio: Per stampare gli elementi dell insieme S di elementi a, b, c e d, dichiarato nel file prova.mod e definitivo nel file prova.dat, scriviamo l istruzione da riga di comando dell interprete AMPL: display S; Una volta eseguita l istruzione, l interprete mostrerà il seguente output: ampl: display S; set S := a b c d; AMPL consente di utilizzare operazioni elementari tra insiemi, quali: - unione: istruzione union; -intersezione: istruzione inter; -differenza: istruzione diff; - differenza simmetrica: istruzione symdiff; - cardinalità: istruzionecard; card;. 14
Gli insiemi in AMPL AMPL consente inoltre di dichiarare insiemi di tipo ordinato attraverso la parola chiave ordered posto dopo l identificativo dell insieme. L ordine Lordine in cui assegniamo gli elementi all insieme definisce l ordinamento dell insieme. Esempio: Per definire l insieme ordinato S di elementi a, b, c e d, dichiariamo nel file prova.mod: set S ordered; Successivamente definiamo nel file prova.dat l insieme assegnando gli elementi a, b, c e d: set S := a b c d ; Quindi a sarà il primo elemento dell insieme, b il secondo e così via. 15
Gli insiemi in AMPL AMPL consente di utilizzare alcune operazioni elementari per insiemi ordinati quali: -first(s)per restituire il primo elemento dell insieme S; -last(s)per restituire l ultimo elemento dell insieme S; - next(t,s,n) per restituire l ennesimo elemento che si trova dopo l elemento lelemento t nell insieme S; -prev(t,s,n)per restituire l ennesimo elemento che si trova prima dell elemento t nell insieme S; -ord(t,s)per restituire la posizione dell elemento t nell insieme S; -member(j,s)per restituire l elemento in posizione j nell insieme S. E inoltre possibile definire in AMPL insiemi ordinati molto semplici in base ad un ordinamento predefinito. Il più semplice insieme ordinato è quello dei numeri interi compresi tra due valori, che si indica con l operatore.. Se N è un numero intero, l insieme dei numeri interi compresi tra 1 ed N si indica con 1..N 16
I parametri in AMPL I parametri sono i dati del problema, da non confondere con le variabili. Una volta invocato il solutore, il valore dei parametri resta costante. Un parametro dev essere: - dichiarato (nel file.mod), dicendo all interprete AMPL che un nome identifica il parametro che vogliamo utilizzare attraverso la parola chave param; - definito (nel file.dat), assegnando il valore al parametro dichiarato; l operatore loperatore di assegnazione è :=. Esempio: Per definire il parametro N dichiariamo nel file prova2.mod: param N; Successivamente definiamo nel file prova2.dat il valore del parametro N: param N := 3 ; Se il parametro assume un valore INTERO, possiamo dichiararlo di tipo integer: param N integer; 17 Analoghe restrizioni sul valore assunto dal parametro possono essere indicate in fase di dichiarazione.
Parametri a più dimensioni in AMPL I vettori di parametri sono molto utili per definire vettori di coefficienti. Un vettore di parametri dev essere: - dichiarato (nel file.mod), dicendo all interprete AMPL il nome che identifica il vettore e l insieme entro cui varia l indice delle sue componenti attraverso la parola chiave param e le parentesi {}; - definito (nel file.dat), assegnando i valori al vettore di parametri dichiarato. Esempio: Per definire il vettore di parametri vett di componenti indicizzate su un insieme S dichiariamo nel file prova3.mod: set S; param vett{s}; Successivamente definiamo nel file prova3.dat i valori dei parametri: set S := a b c d; param vett := a 1 b 2 c 3 d 4; 18
Parametri a più dimensioni in AMPL E possibile definire un vettore di parametri indicizzato su un insieme ordinato in base ad un ordinamento predefinito. Esempio: Per definire i il vettore di parametri vett2 di componenti indicizzate su un insieme ordinato di N elementi dichiariamo nel file prova4.mod: param N; param vett2{1..n}; Successivamente definiamo nel file prova4.dat i valori dei parametri: param N := 3; param vett2 := 1 3 2 2 3 1; Ovunque si desideri specificare una precisa componente del vettore di parametri, occorre usare le parentesi [] dopo l identificativo del vettore. Esempio: Per stampare la seconda componente del vettore di parametri vett2 usiamo l istruzione display seguita dall espressione vett2[2] display vett2[2]; 19