Università degli Studi di Cagliari FACOLTA’ DI INGEGNERIA Ricerca Operativa - RO - Dott.ssa Michela Lai mlai@unica.it http://sorsa.unica.it/ Esercitazione 6
Dualità Esercizio: Dato il problema primale: P min 2 x1 + 3 x2 + 5 x3 + 2 x4 + 3 x5 s.t. x1 + x2 + 2 x3 + x4 + 3 x5 ≥ 4 2 x1 – 2 x2 + 3 x3 + x4 + x5 ≥ 3 x1, x2, x3, x4, x5 ≥ 0 Risolvere il suo duale su carta e poi implementare P e D su Lindo.
Dualità – Relazioni P&D Min P Max D Variabili ≥ 0 ↔ ≤ 0 Vincoli Libera =
Dualità Esercizio: Seguendo le relazioni P&D otteniamo: D max 4 w1 + 3 w2 s.t. w1 + 2 w2 ≤ 2 w1 – 2 w2 ≤ 3 2 w1 + 3 w2 ≤ 5 w1 + w2 ≤ 2 3 w1 + w2 ≤ 3 w1, w2 ≥ 0
Soluzioni Soluzione P: Lindo P: Lindo D: Soluzione D: OBJECTIVE FUNCTION VALUE 1) 5.000000 VARIABLE VALUE REDUCED COST X1 1.000000 0.000000 X2 0.000000 3.400000 X3 0.000000 1.600000 X4 0.000000 0.600000 X5 1.000000 0.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.000000 -0.800000 3) 0.000000 -0.600000 Soluzione D: W1 0.800000 0.000000 W2 0.600000 0.000000 2) 0.000000 1.000000 3) 3.400000 0.000000 4) 1.600000 0.000000 5) 0.600000 0.000000 6) 0.000000 1.000000 Lindo P: min 2 x1 + 3 x2 + 5 x3 + 2 x4 + 3 x5 s.t. x1 + x2 + 2 x3 + x4 + 3 x5 = 4 2 x1 - 2 x2 + 3 x3 + x4 + x5 = 3 end Lindo D: max 4 w1 + 3 w2 w1 + 2 w2 = 2 w1 - 2 w2 = 3 2 w1 + 3 w2 = 5 w1 + w2 = 2 3 w1 + w2 = 3
Analisi di sensitività
Introduzione I problemi di flusso su rete presentano una speciale struttura che consente di adottare algoritmi particolarmente efficienti per la loro risoluzione Tra i vari problemi di flusso, ci occuperemo del Problema del Flusso di Minimo Costo (MCF). In questa esercitazione: faremo brevi richiami della teoria dei grafi e del MCF vedremo possibili applicazioni del MCF utilizzeremo un solver specializzato per problemi di MCF 7
Richiami di teoria dei grafi Un grafo G(N, A) è definito da una coppia di insiemi N e A N, detto insieme dei nodi, è l’insieme dei primi n numeri naturali A, detto insieme degli archi, è un sottoinsieme del prodotto cartesiano N x N Dato un nodo i Є N P(i) = {j: (j, i) Є A}, è l’insieme dei predecessori di i S(i) = {k: (i, k) Є A}, è l’insieme dei successori di i Dato un arco (i, j) Є A Il nodo i rappresenta la coda dell’arco Il nodo j rappresenta la testa dell’arco Si ha un grafo orientato quando (i, j)≠(j,i) 8
Richiami di teoria dei grafi G(N, A) orientato N = {1, 2, 3, 4, 5} A = {(1, 2), (1, 4), (2, 3), (2, 5), (3, 1), (3, 5), (4, 5), (5, 4)} Si dice cammino un insieme di archi in cui ogni coppia contiene un nodo della coppia precedente. Esempio: {(1, 2), (2, 5), (4, 5)} Si dice cammino orientato un insieme di archi in cui la testa di ogni arco coincide con la coda dell’arco seguente. Esempio: {(1, 2), (2, 5), (5, 4)} 9
Richiami di teoria dei grafi Grafo connesso esiste sempre un cammino tra qualsiasi coppia di nodi Grafo fortemente connesso esiste un cammino orientato tra ogni coppia di nodi Ciclo cammino chiuso, inizia e termina nello stesso nodo. Se il cammino è orientato, anche il ciclo è orientato. Ciclo Hamiltoniano ciclo che passa per ogni nodo del grafo una sola volta 10
Richiami di teoria dei grafi Foglia nodo testa/coda di un solo arco Albero grafo connesso privo di cicli ha almeno due foglie Estraendo un qualsiasi arco l’albero viene suddiviso in due sottoalberi distinti un albero con n nodi presenta n-1 archi Dato un grafo G=(N, A) Grafo parziale G‘=(N, A‘) grafo in cui Albero ricoprente di un grafo albero che costituisce un grafo parziale che tocca tutti i nodi del grafo 11
Richiami di teoria dei grafi Matrice di incidenza nodi-archi uno dei possibili modi in cui rappresentare un grafo Ha un numero di righe pari al numero dei nodi Ha un numero di colonne pari al numero degli archi In ogni colonna solo due elementi sono non-nulli: 1 in corrispondenza della coda di quell’arco -1 in corrispondenza della testa di quell’arco La matrice di incidenza è una struttura adatta a ricavare algoritmi, ma non consente una buona implementazione. 12
Richiami di teoria dei grafi Esercizio Ricavare la matrice di incidenza nodi-archi del grafo Una matrice di incidenza con n nodi ha rango n-1. Esiste una corrispondenza biunivoca tra gli alberi ricoprenti del grafo e le basi della matrice di incidenza (purché rendiamo la matrice di incidenza a rango pieno). 13
Richiami di teoria dei grafi Dimostrazione rango n-1: Il suo rango non è n, infatti, comunque si estragga un minore di ordine n la somma delle sue colonne risulta sempre nulla Considerato un albero ricoprente del grafo, il minore ad esso corrispondente ha n righe e n-1 colonne. Questo albero presenta almeno 2 foglie e la sua matrice di incidenza presenta almeno 2 righe con un coefficiente non nullo Con delle permutazioni si porta il coefficiente non nullo di una foglia in prima riga sulla diagonale principale Si cancella quella foglia e quel ramo, si ottiene un nuovo albero con almeno 2 foglie che possono essere portate in seconda riga sulla diagonale principale Iterando questo procedimento, si portano n-1 coefficienti non nulli sulla diagonale principale 14
Il problema del flusso di minimo costo Dato un grafo G(N,A), ad ogni nodo i viene associata una quantità di risorsa bi Se bi > 0 il nodo i è un nodo offerta Se bi < 0 il nodo i è un nodo domanda Se bi = 0 il nodo i è un nodo di transito Si assume che l’offerta totale di risorsa sia uguale alla domanda, in questo caso la rete si dice bilanciata Notazione: xij : flusso di risorsa che transita sull’arco (i,j) cij : costo di transito sull’arco (i,j), il costo è unitario 15
Formalizzazione del MCF Il problema del flusso di minimo costo Formalizzazione del MCF dove E è la matrice di incidenza nodi archi Se una rete non è bilanciata, occorre bilanciarla con opportuni valori di domande/offerte in nodi artificiali connessi da archi di costo molto elevato 16
Esercizio La rete è bilanciata? SI A cosa corrisponde un costo negativo? BENEFICIO 17
Passo I Trovare una base ammissibile e calcolare il flusso delle variabili di base. Partiamo dalla base segnata in verde: Scrivere la matrice di incidenza Calcolare il flusso sugli archi a partire dalle foglie (1 solo elemento sulla riga ≠ 0) Foglia 1 w1 = 2 Foglia 2 w2 = 5 Eliminiamo le foglie, le utilizziamo per correggere i bi dei nodi su cui incidono e iteriamo il calcolo dei w… 18
Passo I Terminati i calcoli dei flussi otteniamo: Foglia 1 w1 = 2 L’equazione ∑jЄS(i) xij – ∑kЄP(i) xki = bi è rispettata! La nostra base è ammissibile! 19
Passo II Effettuare il criterio di entrata Per effettuare il criterio di entrata in generale bisogna risolvere il sistema wB = cB (w1, w2, w3, w4, w5) (matrice di incidenza) = (2, -4, 0, 3, 0-costo r-) L’equazione che usiamo per risolvere il sistema è wi-wj=cij per le variabili in base! Il costo della radice è 0 innesco da cui partire Andiamo avanti ricorsivamente esaminando un solo w alla volta! 20
Passo II w1 – w5 = 2 – 0 = 2 w1 = 2 w4 – w5 = 3 – 0 = 3 w4 = 3 Ora abbiamo tutto ciò che ci serve per calcolare le zij – cij = wi – wj – cij per gli archi fuori base! arco(1,2): w1 – w2 – 5 -2 arco(1,3): w1 – w3 – (-2) 1 arco(4,2): w4 – w2 – 6 -2 arco(5,3): w5 – w3 – 4 -7 21
Il maggiore tra i positivi! Passo II arco(1,2) -2 arco(1,3) 1 arco(4,2) -2 arco(5,3) -7 Chi entra? Il maggiore tra i positivi! 22
L’arco discorde al ciclo con flusso minore! Passo III Chi esce? L’arco discorde al ciclo con flusso minore! Questo è il nuovo albero! Non ripetiamo la fase di ammissibilità perché i nuovi flussi sono stati calcolati con il criterio di uscita. Ripartiamo dal calcolo dei w perché ci aspettiamo una nuova configurazione! 23
Passo III Quando ci si ferma? Tutti i valori per le variabili fuori base sono ≤ 0! Troviamo un ciclo che non migliora! Completare l’esercizio e trovare la soluzione ottima! Trovata la soluzione ottima risolvere l’istanza sul Lindo e confrontarla! 24
Esercizio Risolvere l’istanza con Lindo 25
Esercizio Su Lindo: min 5 x12 - 2 x13 + 2 x15 - 4 x23 + 0 x34 + 6 x42 + 3 x45 + 4 x53 s.t. x12 + x13 + x15 = 2 x23 - x12 - x42 = 5 x34 - x13 - x23 - x53 = 1 x42 + x45 - x34 = -4 x53 - x15 - x45 = -4 end 26
Esercizio Soluzione con Lindo: OBJECTIVE FUNCTION VALUE 1) -12.00000 1) -12.00000 VARIABLE VALUE REDUCED COST X12 0.000000 3.000000 X13 2.000000 0.000000 X15 0.000000 1.000000 X23 5.000000 0.000000 X34 8.000000 0.000000 X42 0.000000 2.000000 X45 4.000000 0.000000 X53 0.000000 7.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.000000 0.000000 3) 0.000000 2.000000 4) 0.000000 -2.000000 5) 0.000000 -2.000000 6) 0.000000 1.000000 27
Utilizzo del solver specializzato MCF c Problem line (il carattere c introduce righe utilizzate per commenti) p min 5 8 (il carattere p introduce la riga della f.o. questo problema ha 5 nodi e 8 archi) c c Node descriptor lines (per convenzione l’offerta è positiva e la domanda è negativa) n 1 2 (il carattere n introduce la riga relativa a un nodo; ad esempio il nodo 1 offre 2 unità di risorsa) n 2 5 n 3 1 n 4 -4 n 5 -4 (il nodo 5 domanda 4 unità di risorsa) c Arc descriptor lines a 1 2 0 10 5 (il carattere a introduce la riga relativa a un arco, riportando nell’ordine coda, a 1 3 0 10 -2 testa, limite inferiore del flusso, limite superiore del flusso e costo) a 1 5 0 10 2 a 2 3 0 10 -4 a 3 4 0 10 0 a 4 2 0 10 6 a 4 5 0 10 3 a 5 3 0 10 4 c End of file Comandi essenziali per MCF: read nome_file.dimacs optimize display write sol_nome_file.txt 28
Utilizzo del solver specializzato MCF Soluzione con MCF: c Output to minimum-cost flow problem sample3.dimacs c The problem was solved with a network simplex code c c need 4 iteration(s) in 0 second(s). s -12 (questo è il valore ottimo della f.o.) f 1 3 2 (il flusso da 1 a 3 vale 2 all’ottimo) f 2 3 5 f 3 4 8 f 4 5 4 c All other variables are zero 29
Con OPL 30
Con OPL {int} Nodi = { 1, 2, 3, 4, 5}; int dom[Nodi]= [2, 5, 1, -4, -4]; tuple arco { int i; int j; } {arco} archi = {<1,2>, <1,3>, <1,5>, <2,3>, <3,4>, <4,2>, <4,5>, <5,4>}; int costi[archi] = [5, -2, 2, -4, 0, 6, 3, 4]; dvar int+ x[archi]; minimize sum(a in archi)costi[a] * x[a]; subject to forall(i in Nodi) sum (<i, s> in archi) x[<i, s>] - sum(<p, i> in archi) x[<p, i>] == dom[i]; 31