Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 1/21 Sommario della lezione Ulteriori applicazioni del Massimo Flusso 1. Connettività di grafi 2. Selezione di progetti
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 2/21 Connettività di grafi Problema: Dato un grafo diretto G = (V,E) e due nodi s e t, trovare il minimo numero di archi che disconnette t da s. Def. Un insieme di archi F E disconnette s da t se tutti i cammini da s a t usano almeno un arco di F. 2 5 s 3 6 t 4 7 Il problema trova applicazione nell analisi della tolleranza ai guasti di reti di calcolatori (ed in tante altre situazioni...)
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 3/21 Il risultato Il minimo numero di archi che disconnette t da s = massimo numero di cammini arco-disgiunti da s a t. Proviamo innanzitutto il. Sia F E un insieme di cardinalità k minima di archi che disconnette t da s. Ogni cammino da s a t deve usare almeno un arco di F (altrimenti F non disconnetterebbe t da s) pertanto il massimo numero di cammini arco-disgiunti da s a t è al più k 2 5 2 5 s 3 6 t s 3 6 t 4 7 4 7 Nell esempio, abbiamo 2 cammini arco disgiunti da s a t e 2 archi bastano a disconnettere t da s.
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 4/21 Proviamo ora la diseguaglianza oppposta Sia k il massimo numero di cammini arco-disgiunti da s a t. Nella lezione scorsa vedemmo che tale numero corrispondeva anche al valore del massimo s-t flusso f nel grafo. Ricordiamo inoltre che la massimalità di f implicava che in G esiste un taglio (A,B) di capacità c(a,b) = v(f) = k. Gli archi che vanno da A a B (ovviamente in numero di k visto che ogni arco ha capacità pari a 1) costituiscono un insieme F che disconnette t da s, per cui la minima cardinalità di un F che disconnette t da s è k. 2 5 2 5 s 3 6 t s 3 6 t A 4 7 B 4 7
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 5/21 Ricordando il risultato provato nella lezione scorsa: Il massimo numero di cammini da s a t in G che sono arco-disgiunti = valore del massimo flusso in G da s a t e quello appena provato: Il minimo numero di archi che disconnette t da s = massimo numero di cammini arco-disgiunti da s a t. otteniamo Risultato: Il minimo numero di archi che disconnette t da s = valore del massimo flusso in G da s a t che ci fornisce anche un algoritmo di complessità O(mn)) per risolvere il problema, dove come al solito n = V,m = E.
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 6/21 E se volessimo studiare gli stessi problemi relativamente a vertici? ovvero considerare i seguenti problemi: Problema 1: Determinare il massimo numero di cammini tra due vertici di un grafo in modo tale che nessuna coppia di cammini abbiano vertici in comune? (ovvero i cammini siano vertici-disgiunti) Problema 2: Determinare il minimo numero di vertici che disconnette un vertice t da s? Bisogna rifare tutto da capo? No.
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 7/21 Basta considerare grafi con capacità anche sui vertici ovvero, generalizzare il concetto di rete di flusso mediante un grafo diretto G = (V, E) con le seguenti caratteristiche: associato ad ogni arco e E vi è un numero c(e) 0, capacità dell arco e associato ad ogni nodo u V vi è un numero d(u) 0 capacità del nodo u vi è un nodo s chiamato sorgente, senza archi entranti vi è un nodo t chiamato destinazione, senza archi uscenti In tale situazione un flusso f deve soddisfare le seguenti condizioni 1. (Vincoli sulle capacità) e E 0 f(e) c(e) e u V e entranti in uf(e) d(u) 2. (Vincoli sulla conservazione del flusso) v V,s v t, vale e entranti in v f(e) = e uscenti da v f(e)
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 8/21 Il bello di grafi siffatti è che non sono più difficili da trattare di quelli soliti, ovvero di grafi con capacità solo sugli archi. Infatti, dato un grafo con capacità c(e) sugli archi e capacità d(u) sui nodi avremmo una situazione siffatta, in cui la somma dei flussi entranti nel nodo deve essere d(u): c 2 c 5 c 2 c 5 c 3 d(u) c 6 c 3 u d(u) u c 6 c 1 c 4 c 1 c 4 Potremmo trasformarla in una situazione come quella di destra, in cui si introduce un nodo fittizio u, connesso a u con un arco con capacità d(u). Nel grafo risultante dopo la trasformazione sopra delineata (effettuata ovviamente per ogni nodo) vi sono solo capacità su archi (che sappiamo trattare). È altresì ovvio che esiste un flusso di valore k nel grafo di partenza (con capacità anche sui nodi) se e solo se ne esiste uno dello stesso valore nel grafo modificato (con capacità solo sugli archi).
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 9/21 Riassumendo... Le tecniche di flusso introdotte permettono quindi di risolvere anche questioni che coinvolgono condizioni su nodi, ad esempio determinare il massimo numero di cammini nodo-disgiunti tra una coppia di nodo del grafo, o determinare il minimo numero di nodi necessari a disconnettere una coppia di nodi nel grafo, etc. Basterà imporre le opportune limitazioni sia alla capacità sugli archi, che sui nodi. Ad es., per determinare il massimo numero di cammini nodo-disgiunti tra due vertici s e t di un grafo G, basterà calcolare il massimo flusso da s a t in G, dove avremo imposto che la capacità di ciascun nodo è pari a 1, trasformare il grafo come prima descritto e risolvere il problema del massimo flusso nel grafo trasformato per ottenere la risposta.
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 10/21 Esempio: Vie di Fuga Supponiamo di avere una griglia, e dei punti in essa. Il problema è di stabilire se esistono cammini vertice-disgiunti da ciascun punto alla frontiera della griglia non ha soluzione
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 11/21 Formulazione del problema in termini di flusso Input: Grafo griglia G = (V,E), consistente di n colonne ed n righe di vertici. Il vertice generico nella riga i e colonna j può essere rappresentato dalla coppia (i, j). Ogni vertice ha quattro vicini, tranne che per i vertici sulla frontiera (che ne hanno o due o tre). In input abbiamo anche m n 2 punti (x 1,y 1 ),...,(x m,y m ) per i quali vogliamo stabilire se ci sono o meno m cammini disgiunti da essi alla frontiera della griglia (non importa dove, purchè si possa raggiungere la frontiera) Definiamo un grafo di flusso G = (V,E ) nel seguente modo: V = V {s,t} E = E {archi da s ad ogni punto (x i,y i )} {archi da ogni punto della frontiera a t} Ogni arco di G ha capacità pari a 1, ogni nodo di G ha capacità pari a 1.
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 12/21 Esempio 1 s t
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 13/21 Vale il seguente risultato Il problema delle vie di fuga ha soluzione positiva (ovvero esistono i cammini nodi-disgiunti dagli m punti in input sulla griglia alla frontiera della griglia) se e solo se nel grafo G esiste un massimo flusso a valori interi pari a m. Prova: per esercizio.
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 14/21 Selezione di progetti Input: insieme di progetti P, a ciascun progetto v P è associato un ricavo p(v) che può essere sia positivo (guadagno) che negativo (costo). Ad es., alcuni progetti generano guadagno (creare pagine web interattive per e-commerce, ridisegnare siti web, etc.) altri progetti, che possono essere necessari per la realizzazione di quelli che generano guadagno, richiedono invece spese (acquisire licenze software, aggiornare server, etc.) Input: insieme di prerequisiti E: se (v,w) E, allora prima di eseguire il progetto v occorre necessariamente aver eseguito il progetto w un insieme di progetti A P è fattibile se i progetti prerequisiti di ogni progetto v A appartengono essi stessi ad A Output: un insieme di progetti A fattibile di profitto profitto(a) = v Ap(v) massimo.
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 15/21 Es. : Estrazione da cave all aperto Blocchi di materiale vengono estratti dalla superficie per estrarre sostanze Ciascun blocco v ha un valore netto p(v) =(valore della sostanza contenuta in v) (costo dell estrazione del blocco v) Non si può estrarre il blocco v prima di w o prima di x
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 16/21 Introduciamo il grafo G = (V, E) dei prerequisiti V =insieme dei progetti, (v,w) E se prima di eseguire il progetto v occorre necessariamente aver eseguito il progetto w Nel grafo di sotto, l insieme {v,w,x} è un insieme fattibile di progetti, l insieme {v, x} non è un insieme fattibile di progetti. w v x
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 17/21 Formuliamo il problema come un problema di minimo taglio assegniamo capacità a tutti gli archi dei prerequisiti aggiungiamo un arco (s,v) con capacità c(s,v) = p(v) se p(v) > 0 aggiungiamo un arco (v,t) con capacità c(v,t) = p(v) se p(v) < 0 Poniamo inoltre: p(s) = p(t) = 0. u w p(u) p(w) s p(y) y z p(z) t p(v) p(u) v x
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 18/21 Osservazione: Sia A P un sottoinsieme di progetti fattibile. Definiamo il taglio (A,B ) con A = A {s},b = (P A) {t}. Per definizione di fattibilità nessun arco (i,j) E attraversa il taglio (in quanto se i A dipende da j allora anche j A) Esempio: A = {w,v,x} u w s y z t v x
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 19/21 Per A P fattibile, e per A = A {s},b = (P A) {t} vale: c(a,b ) = v P:p(v)>0p(v) v A p(v) Ricordiamo che gli archi del grafo di flusso possono essere divisi in 3 categorie: 1.gli archi di E che descrivono le precedenze, 2. gli archi che fuoriescono da s e 3. gli archi che entrano in t. Inoltre, gli archi di E non attraversano il taglio (come prima notato) e quindi non contribuiscono alla sua capacità c(a,b ). Gli archi che entrano in t contribuiscono a c(a,b ) per la quantità ( p(v)) v A:p(v)<0 mentre quelli che fuoriescono da s contribuiscono a c(a,b ) per la quantità p(v) = p(v) p(v) v/ A:p(v)>0 v P:p(v)>0 v A:p(v)>0
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 20/21 Per A P fattibile, e per A = A {s},b = (P A) {t} Otteniamo quindi c(a,b ) = c(e)+ c(e) e:e fuoriesce da A e và in t = ( p(v))+ = v A:p(v)<0 v P:p(v)>0p(v) v A che è quallo che volevamo provare. e:e fuoriesce da A e parte da s p(v) v P:p(v)>0 v A:p(v)>0 p(v) p(v)
Università degli Studi di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Acc. 2009/10 p. 21/21 Posto C = v P:p(v)>0 p(v) e notando che ogni arco (v,w) che definisce precedenze tra progetti ha capacità > C, otteniamo che ogni taglio (A,B ) di capacità c(a,b ) C definisce implicitamente un insieme fattibile A = A {s}, in quanto nessun arco di precedenze può attraversare tale taglio, avrebbe infatti da solo una capacità maggiore della capacità c(a,b ) dell intero taglio. Mettendo tutto insieme, otteniamo che la capacità di tali tagli (A,B ) è uguale a c(a,b ) = v P:p(v)>0p(v) v A p(v) = C profitto(a) e quindi per trovare un insieme di profitto massimo (che era il nostro obiettivo) basta trovare un taglio (A,B ) di capacità minima ed estrarne s, (e questo lo sappiamo fare, con l algoritmo di Ford e Fulkerson).