Lezione 4 Algoritmi di Approssimazione basati sulla Programmazione Lineare a cura di Clelia Sessa In questa lezione saranno illustrati algoritmi di approssimazione basati sulla programmazione lineare. Verranno trattati due problemi NP-completi: MIN-VERTEX-COVER (pesato) e SETCOVER (pesato), si vedrà dalla formulazione di tali problemi che essi sono problemi di programmazione intera 0-1, di difficile soluzione. L’obiettivo è approssimare i due problemi in modo da poter utilizzare la programmazione lineare, a tale scopo verranno considerate le relative versioni “rilassate”. 4.0 Definizione Problema di Programmazione Lineare Un Problema di Programmazione Lineare è un problema così strutturato: (funzione obiettivo) n min/max f(x1…xn) = a1x1+…+anxn = i 1 aixi con ai (vincoli) g(x1…xn) = b con bi Un problema di programmazione lineare può essere risolto in tempo polinomiale. 4.1 MIN–VERTEX-COVER (pesato) [CLRS par. 35.4] Dati G = (V, E), una funzione costo (o peso) c: V + , trovare V’ V vertex-cover che minimizza c(V’), dove c(V’) = vV ' c(v) 1 Esempio 1 V’= 1,5 c(V’) = 10+15 = 25 V’’= 2,3,4 c(V’’) = 1+2+3 = 6 c(V’’) < c(V’) anche se |V’’| > |V’| 2 1 10 1 3 5 15 2 4 3 Soluzione al MIN – VERTEX - COVER è V’’ V. Una soluzione V’ è possibile vederla anche come un vettore binario di lunghezza |V|, che associa 1 se il vertice appartiene alla soluzione e 0 altrimenti. Definizione: vV la variabile xv 0 se vV’ 1 se vV’ Esempio 2 In riferimento ai dati dell’esempio 1 si ha: V’’= 2,3,4 (0, 1, 1, 1, 0) c(V’’) = vV c(v) xv = c(1)*0+c(2)*1+c(3)*1+c(4)*1+c(5)*0 = c(2)+c(3)+c(4) = 6 Con l’introduzione della variabile booleana xv il problema del MIN–VERTEX-COVER può essere riformulato in questo modo: min vV c(v) xv con vincoli: xu + xv 1 (u, v)E xv0,1 vV 2 Esempio 3 In riferimento ai dati dell’esempio 1 si ha : min 10x1+x2+2x3+3x4+15x5 con vincoli: x1 + x2 1 x1 + x3 1 x1 + x4 1 x2 + x5 1 x3 + x5 1 x4 + x5 1 xi 0,1 i = 1,…,5 Il problema così ridefinito è un problema di programmazione intera 0-1, questo problema è difficile da risolvere, verrà quindi considerato un problema simile: la versione “rilassata”, allo scopo di poter utilizzare la programmazione lineare. 4.1.1 Versione “RILASSATA” min vV c(v) xv con vincoli: xu + xv 1 (u, v)E xv0 xv1 vV Questo è un problema di programmazione lineare e può essere risolto in tempo polinomiale. Di seguito verrà indicato con minR = vV c(v) xv il minimo del problema rilassato e con C * la soluzione ottimale del MIN–VERTEX-COVER. Osservazione: soluzione al problema 0-1 è soluzione al problema rilassato. minR c(C * ) costituisce un limite inferiore all’ottimo. Approx_Min-Vertex-Cover_Pesato (G,c) C “Sia x il vettore soluzione del problema rilassato” for ogni vV do 1 if x v 2 then CC v return C 3 L’algoritmo prende in input il grafo G con funzione costo c associata ai vertici e restituisce in 1 output l’insieme dei vertici C per cui si ha un valore . 2 Esempio 4 Se x = ( 1 1 3 , , 0, , 1) 2 4 5 (1, 0, 0, 1, 1 ) C = 1, 4, 5 Adesso bisogna dimostrare che: 1) l’algoritmo è polinomiale 2) C è un Vertex - Cover 3) c(C * ) c(C) 2c(C * ) DIMOSTRAZIONI 1) L’algoritmo è polinomiale perché il problema rilassato è un problema di programmazione lineare che si risolve in tempo polinomiale e il resto dell’algoritmo è eseguibile in O(|V|). ? 2) (u, v) E u C oppure v C 1 1 x u + x v 1 x u > oppure x v > 2 2 u C oppure v C C è un Vertex - Cover. 3) Innanzitutto c(C * ) c(C) perché si tratta di un problema di minimizzazione. Sia C * la soluzione ottima del problema Min-Vertex-Cover_Pesato e sia minR il valore di una soluzione ottima del problema di programmazione lineare, si ha che: minR c(C * ) minR = c(v) x v 1 2 c(v) vV x (v ) vV c(v) x v vV x (v ) 1 2 1 2 4 1 c(v) 2 vC 1 = c(C) 2 = c(C ) 2 minR 2c(C * ) L’algoritmo Approx_Min_Vertex-Cover_Pesato è 2-approssimato. 4.2 SET-COVER (pesato) [Vaz. parr. 14.1-14.2] Dati un insieme X = x1, x2, …, xn, una famiglia P (X), (S, SX), una funzione costo (o peso) c: + , trovare una sottofamiglia C che ricopre X (xX, xS , S C ) che minimizza c(C ) 0 se S C Definendo una variabile booleana xs 1 se S C Il problema può essere riformulato come segue: min c(S) xS S con vincoli: xS 1 xX S: xS xS0,1 S Questo problema è di programmazione intera 0-1, ed è difficile da risolvere, verrà quindi considerato un problema simile: la versione “rilassata”, allo scopo di poter utilizzare la programmazione lineare . 5 4.2.1 Versione “RILASSATA” min c(S) xS S con vincoli: xS 1 xX S: xS xS 0 xS 1 S Questo è un problema di programmazione lineare e può essere risolto in tempo polinomiale. Osservazione: soluzione al problema 0-1 è soluzione al problema rilassato. Indicando con minR = c(S) xS, il minimo del problema rilassato e con C * la soluzione ottimale S del MIN- SET-COVER si ha: minR c(C * ) costituisce un limite inferiore all’ottimo. 4.2.2 Problema di P. L. con fattore f Definizione: xX f(x) = | S | x S| è detta frequenza di x Definizione: = max f(x) è detta frequenza massima xX Esempio 1 = 3 S1, S3, S4 = S1, S2, S3, S4 6 Approx_Set-Cover_Pesato C “Sia x il vettore soluzione del problema rilassato” for ogni S do 1 if x S f then C C S return C L’algoritmo restituisce in output la famiglia C di sottoinsiemi di S che hanno un valore 1 . f Esempio 2 In riferimento all’esempio 1 dove = 3 2 1 1 4 1 1 Se x = ( , , , ) vengono selezionati gli elementi = 3 5 3 9 3 f che rappresentati tramite il vettore binario sono (1, 0, 1, 1) cioè C = S1, S3, S4 Adesso bisogna dimostrare che: 1) l’algoritmo è polinomiale 2) C ricopre X 3) c(C * ) c(C ) c(C * ) DIMOSTRAZIONI 1) L’algoritmo è polinomiale perché il problema rilassato è un problema di programmazione lineare che si risolve in tempo polinomiale e il resto dell’algoritmo è eseguibile in tempo polinomiale. 2) Per dimostrare che C sia la soluzione restituita dall’algoritmo, si deve verificare che ? x X S C t.c. x S, xs = 1 algo 1 S C f xS La sommatoria è definita su tutti gli S, quindi x contiene esattamente f(x) elementi, ed f(x) dato che tale somma è 1, quindi ci deve essere almeno un elemento 1 diviso il numero di 1 elementi, cioè x S e in base all’algoritmo viene arrotondato e messo in C , questo implica f che in C c’è un insieme che contiene x. Poiché questo vale x X, alla fine in C ci sarà almeno un insieme per ogni elemento di X, ossia C è un set-cover di X. x S 1 S t.c. x S 3) Innanzitutto c(C * ) c(C) perché si tratta di un problema di minimizzazione. 7 La soluzione al problema rilassato è minR = c(S) x S , dove minR c(C * ). Inoltre S c(C ) minR Infatti: minR = c(S) x S S rilax c(S) x S S rilax xS 1 f c(S) = 1 c(C) f S rilax 1 f Quindi si ha un algoritmo di approssimazione per Set-Cover con fattore f. 4.2.3 Problema di P. L. versione Random In questo paragrafo verrà formulato un nuovo algoritmo randomizzato allo scopo di ottenere un’approssimazione nell’ordine di O(log n). L’idea è partire dalla soluzione ottima del problema rilassato e interpretare le sue componenti non intere come le probabilità con cui prendere nella soluzione l’insieme corrispondente. Sia x = p una soluzione ottima al problema di programmazione lineare. Per ogni insieme S, S viene preso con probabilità ps. Sia C la collezione di insiemi presi. Il costo medio di questa soluzione è: Ec(C) = c(S) Probabilità di prendere S = c(S) ps = OPT S S Infatti, per definizione, la media è data dal costo di ogni elemento per la rispettiva probabilità, ma le probabilità sono proprio le ps e la somma dei costi per le ps non è altro che la soluzione al problema rilassato. Adesso bisogna controllare che la famiglia così costruita sia un cover. Dato x X, si suppone che sia coperto (ovvero appartenga) dagli insiemi S1, S2, …, Sk, e si calcola la probabilità che questo avvenga: Pr{x sia coperto da C} = 1- Pr{x non sia coperto da C} = = 1 - Pr{ S1 non è stato inserito in C S2 non stato inserito in C … Sk non è stato inserito in C}= (poiché gli eventi sono indipendenti, la probabilità della congiunzione è uguale al prodotto delle probabilità) = 1- Pr{ S1 non è stato inserito in C} × … ×Pr{ Sk non è stato inserito in C} = (poiché si mette ciascun S in C con prob. ps, la prob. che non venga messo è (1- ps)) = 1 – (1 – p1) (1 – p2) (1 – pK) 1 1 (dalla teoria del calcolo delle probabilità si ha che) 1 – (1 – )k (si può dimostrare che) 1 – k k e Si ottiene quindi: Pr{x sia coperto da C} = 1- Pr{x non sia coperto da C} 1 e 8 Pr{x non sia coperto da C} 1 x X. e Viene riapplicato lo stesso procedimento allo scopo di abbassare la probabilità che l’insieme ottenuto non sia un cover, cioè si costruisce nello stesso modo un’altra famiglia e si unisce a quella precedente. Quindi vengono costruite allo stesso modo d×log n famiglie e la loro unione è chiamata C’. Dove d è una costante scelta in modo che risulti: 1 1 ( ) dlog n e 4n Pr{x non sia coperto da C’ } ( 1 dlog n 1 ) e 4n Questa è la probabilità che un generico x X non sia coperto, quindi: 1 1 Pr{ C’ non sia un cover per X} n 4n 4 Si ha che : Ec(C' ) OPT d log n Disuguaglianza di Markov: Data una variabile casuale X con valor medio E[X], E X vale che Pr{X t} . t Applicando la disuguaglianza di Markov con t = 4d log n OPTf . Si ottiene: E c(C' ) d log n OPTf 1 = . 4 4d log n OPTf 4d log n OPTf 1 La probabilità dell’unione di due eventi sfavorevoli è 2 Pr c(C) 4d log n OPTf Pr{C è un cover c(C’) 4d log n OPTf } 1 2 Osservazione: E’ possibile verificare in tempo polinomiale se C’ soddisfa entrambe queste condizioni. Il numero medio di ripetizioni è al più 2. Bibliografia [1] Appunti della lezione del 14/12/2004 [2] Min-Vertex-Cover [CLRS par. 35.4] [3] Set-Cover [Vazirani parr. 14.1-14.2] 9