Ottimizzazione Combinatoria Esercitazione AMPL A.A. 2-22 Esercitazione a cura di Silvia Canale contatto e-mail: canale@dis.uniroma.it Università i di Roma La Sapienza Dipartimento di Informatica e Sistemistica Corso di Laurea in Ingegneria Gestionale
Pagina del corso http://www.dis.uniroma.it/~or/gestionale/oc/ Oltre al materiale delle esercitazioni, sulla pagina del corso sono disponibili informazioni relative a: - appelli d esame (date, orari, prenotazioni); - programma del corso; - orari e avvisi per il ricevimento studenti; - testi di tesine dei precedenti; - attività di laboratorio - 2
Riassumendo AMPL è un linguaggio di modellazione algebrico che ci permette di modellare problemi di programmazione matematica di diversa natura. Abbiamo visto come dichiarare (file.mod) e definire (file.dat) le entità: - Insiemi (parola chiave set); - Parametri semplici i o a più dimensioni i i (parola chiave param); - Variabili (parola chiave var); - Funzione obiettivo (parola chiave minimize o maximize); - Vincoli (parola chiave subject to). Abbiamo visto come far interpretare i file.mod e.dat all interprete AMPL. Abbiamo visto come far risolvere il problema modellato all interprete AMPL invocando un opportuno solutore di programmazione matematica (CPLEX). Oggi vedremo altre funzionalità del linguaggio AMPL. 3
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{..n}; Successivamente definiamo nel file prova4.dat i valori dei parametri: param N := 3; param vett2 := 3 2 2 3 ; 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]; 4
Parametri a più dimensioni in AMPL E possibile definire un vettore di parametri a più di una dimensione. Le matrici di parametri sono vettori di parametri a due dimensioni e Sono molto utili per definire matrici di coefficienti. Esempio: Per definire la matrice di parametri Mat di componenti indicizzate i su un insieme i ordinato di M elementi per le righe e di N elementi per le colonne dichiariamo nel file prova5.mod: param M; param N; param Mat{..M,..N}; Successivamente definiamo i nel file prova5.dat i valori dei parametri: param M := 3; param N := 2; param Mat := 2 2 2 3 2 2 4 3 5 3 2 6; 5
Parametri a più dimensioni in AMPL Per stampare tutti gli elementi della matrice è possibile usare l istruzione display seguita dall identificativo. Se invece vogliamo stampare solo una componente della matrice allora dobbiamo usare l operatore []. Esempio: Per stampare l intera matrice di parametri Mat dichiarata nel file prova5.mod e definita nel file prova5.dat scriviamo: display Mat; Una volta eseguita l istruzione, l interprete mostrerà il seguente output: ampl: display Mat; Mat := 2 2 2 3 2 2 4 3 5 3 2 6 ; 6
Espressioni di indicizzazione Le parentesi {} ci permettono di indicare un insieme, ordinato o meno. Esse servono a definire espressioni di indicizzazione che possono essere più o meno complesse. Se A e B sono insiemi e p è un vettore di parametri, allora - {A} o {i in A} indicano tutti gli elementi dell insieme A - {A,B} o {i in A, j in B} indica tutte le coppie tali che il primo elemento appartiene all insieme A ed il secondo all insieme B - {i in A, i in B} indica tutte le coppie tali che il primo elemento appartiene all insieme A ed il secondo all insieme B purché uguali - {i in A: p[i] > } indica tutti gli elementi dell insieme A tali che il corrispondente valore del vettore p sia positivo 7
Grafo Esercitazione AMPL A.A. 2-22 8
Problema Problema Il grafo Il grafo Sia dato il grafo orientato G(N,A) in figura N = {A, B, C, D, E} A = {AB AC BC BE CD DB DE} A = {AB, AC, BC, BE, CD, DB, DE} B A E C D C D Matrice di incidenza M di G(N,A) matrice 5 x 7 a valori {,, -} M = 9
Problema del massimo flusso (MF) Esercitazione AMPL A.A. 2-22
Definizione del problema Sia dato un grafo orientato G(N,A). Sia dato un nodo sorgente s N ed un nodo pozzo t N {s}. Sia dato un vettore c di capacità definito sull insieme A degli archi del grafo G(N,A). 4 6 3 2 2 s 2 4 t 3 4 8 3 4
Definizione di flusso Si definisce flusso s-t di (G, c) un vettore x R A tale che (x uv,c uv ) x c uv A u v uv uv (2,8). ciascuna componente di x rispetti il vincolo di capacità x + uv δ G uv ( v) vu δ G x uv ( v) = v { s, t } (3,3) (2,3) v (,5) (,) 2. il vettore x rispetti il vincolo di conservazione del flusso ad ogni nodo tu δ + G x tu (t) = x us δ G us (s) = (,3) (2,5) s (,3) t (,5) (,) 3. nulla entri nel nodo s ed esca dal nodo t (,2) 2
Definizione di flusso Si definisce valore di un flusso s-t di (G, c) per il valore f(x) del flusso entrante nel nodo pozzo t oppure del flusso uscente dal nodo sorgente s f ( x) = x = ut x su + ut δ t) su δ (s) G ( G Un flusso s-t x di (G, c) per il grafo mostrato prima è (2,4) (,6) s (2,3) (,2) (,4) (,8) 2 (2,2) (,4) 3 4 t (,3) Il valore del flusso è f(x) = 3 3
Il problema di massimo flusso Determinare il flusso s-t x di (G, c) che massimizzi il valore f(x) max f x ut ut δ G ( t ) + su δ G x su ( s) = f = f xuv + uv δ G ( v) x uv vu δ c G uv x uv ( v) M matrice di incidenza del grafo (G, c) b: b s = -; b t = ; b v = v N {s,t} = v { s, t} uv A max f Mx = bf x uv c uv uv A 4
Il problema di massimo flusso Siano s = A e t = E due nodi speciali del grafo G(N,A). Sia dato il vettore c di capacità definito sull insieme A degli archi del grafo G(N,A) c = { 6, 4, 2, 7, 8, 4, 5 } A = {AB, AC, BC, BE, CD, DB, DE} B 6 7 s 2 4 t 4 C 8 D 5 Vogliamo risolvere il problema di massimo flusso (MF) da s a t sul grafo orientato G(N,A) rispetto al vettore c di capacità. 5
à Problema Problema Massimo flusso Massimo flusso Aggiungiamo l arco ts (e quindi una colonna alla matrice M) di capacità infinita. c = { 6, 4, 2, 7, 8, 4, 5, } A ={AB, AC, BC, BE, CD, DB, DE, EA} M= B 6 4 2 7 A E 4 8 5 4 2 C D 4 8 5 6
Problema Massimo flusso max w T x = x EA (MF) M x = d A x c Modelliamo il poblematamite problema tramite AMPL Vogliamo determinare un flusso x di (G, c) di valore massimo B (x AB,6) (x BE, 7) A (x BC, 2) (x DB, 4) E (x AC, 4) ) (x DE, 5) (x CD, 8) C D (x EA, ) 7
Modellazione con AMPL (MF) max w T x M x = d A x c Modelliamo il problema tramite AMPL creando due file: - file.mod contenente: - la dichiarazione dei parametri: insiemi N, A; vettori w, d, c e M; - la dichiarazione delle variabili: vettore x; - la struttura e la definizione della funzione obiettivo: w T x; - la struttura e la descrizione dei vincoli: M x = d, A x c. - file.dat contenente i valori numerici dei parametri - N = { A, B, C, D, E} - A = {AB, AC, BC, BE, CD, DB, DE,EA} EA} - w = {,,,,,,, } M= - d = {,,,, } - c = {6, 4, 2, 7, 8, 4, 5, } 8
File modello File modello MF.mod Definiamo il problema di massimizzazione maximize Costo_Totale: sum {j in ARCHI} costo[j] * x[j]; Scriviamo esplicitamente i vincoli di capacità subject to Capacita {j in ARCHI}: x[j] <= capacita[j]; senza inserirli nella dichiarazione delle variabili x var x {j in ARCHI} >= ; 9
File dati MF.dat File dati - definizione dei parametri set ARCHI := AB AC BC BE CD DB DE EA; param domanda := A B C D E ; param: capacita costo := AB 6 AC 4 BC 2 BE 7 CD 8 DB 4 DE 5 EA Infinity ; 2
File dati MF.dat File dati - definizione dei parametri: definiamo i vettori a due dimensioni (M): param M : AB AC BC BE CD DB DE EA := A - - B - - C - D - - E -; 2
Interprete AMPL ampl: reset; // cancelliamo i modelli e/o i dati precedentemente caricati // (obbligatorio se abbiamo già caricato un problema) ampl: model MF.mod; // carichiamo prima il modello del problema ampl: data MF.dat; // carichiamo successivamente i dati del problema 22
Soluzione del problema ampl: option solver cplex; // scegliamo il solutore di Programmazione Matematica con cui // risolvere il problema: CPLEX (attualmente vers..2.) ampl: solve; // risolviamo il problema caricato valore ottimo // output ottenuto: CPLEX.2.: optimal solution; objective dual simplex iterations ( in phase I) informazioni sul metodo di soluzione soluzione disponibile 23
Soluzione del problema ampl: display x; // chiediamo i valori della soluzione ottenuta (componenti di x) // output ottenuto: x [*] := AB 6 AC 4 BC BE 7 CD 4 DB DE 3 EA ; soluzione a componenti intere 24
Soluzione del problema (MF) Abbiamo determinato il flusso x* ottimo di (G, c, d) B (6,6) (7, 7) A (, 2) (, 4) E (4, 4) (3, 5) (4, 8) C D (, ) ) x* soddisfa sia i vincoli di capacità che i vincoli di domanda: M x* = d A x* c. valore costo(x*) = x = ottimo 25
Soluzione duale ampl: display Incidenza; // chiediamo i valori della soluzione duale ottenuta // output ottenuto: Incidenza [*] := A B C D E ; 26
Soluzione duale ampl: display Capacita; // chiediamo i valori della soluzione duale ottenuta // output ottenuto: Capacita [*] := AB AC BC BE CD DB DE EA ; 27