Il problema del cammino minimo tra 2 nodi in un grafo con archi privati
Il problema dello shortest path egoistico Input: un grafo G=(V,E) biconnesso sugli archi, in cui ogni arco corrisponde in modo biunivoco ad un insieme di agenti egoisti, un nodo sorgente s e un nodo destinazione t; il tipo di un agente è il costo di utilizzo dellarco (quindi tipo > 0); la sua valutazione è uguale al suo tipo; SCF: un vero cammino minimo in G=(V,E,tipi) tra s e t.
Meccanismo VCG Il problema è utilitario VCG-mechanism M= : g(r): calcola P G (s,t) in G=(V,E,r) p e : Per ogni arco e E: p e = je v j (r j,x(r - e )) - je v j (r j,x) cioè d G-e (s,t)-(d G (s,t)-r e ) se e P G (s,t) 0 altrimenti Per ogni e P G (s,t), dobbiamo calcolare P G-e (s,t), ovvero il cammino minimo di rimpiazzo in G-e =(V,E\{e},r -e ) tra s e t pe=pe= {
Cammino di rimpiazzo per e s t e P G-e (s,t) P G (s,t)
Ipotesi di lavoro n=|V|, m=|E| d G (s,t): distanza in G da s a t (somma dei pesi degli archi di P G (s,t)) I nodi s,t sono 2-edge connessi: cioè, esistono in G almeno 2 cammini tra s e t che sono disgiunti sugli archi per ogni arco e del cammino P G (s,t) che viene rimosso esiste almeno un cammino alternativo in G-e
…infatti, in caso contrario… Se s,t non sono 2-edge connessi, cè almeno un arco in P G (s,t) che è un ponte (arco che rimosso spezza G in due componenti C 1 e C 2, r C 1 e s C 2 ) Se e è un ponte d G-e (s,t) = Il possessore di quellarco tiene in pugno il sistema: può chiedere qualsiasi cifra!
Una soluzione banale e P G (s,t) applichiamo lalgoritmo di Dijkstra al grafo G-e Complessità: k=O(n) archi per O(m + n logn): O(mn + n 2 logn) time La soluzione che proponiamo costerà: O(m + n logn) time
Notazioni S G (s), S G (t): alberi dei cammini minimi radicati in s e t M s (e): insieme dei nodi raggiungibili da s in S G (s) senza passare per larco e N s (e)=V/M s (e): nodi del sottoalbero di S G (s) radicato in v, dove e=(u,v) M t (e), N t (e) definiti in modo analogo
s u v t e Ms(e)Ms(e) Ns(e)Ns(e) S G (s)
Crossing edges M s (e) e N s (e) individuano un taglio in G C s (e)={(x,y) E\{e}: x M s (e), y N s (e)} archi del taglio: crossing edges
Crossing edges s u v t e Ms(e)Ms(e) Ns(e)Ns(e) S G (s) Cs(e)Cs(e)
Come è fatto P G-e (s,t)? Ovvio: non usa e P G-e (s,t) deve attraversare il taglio È il cammino più corto fra quelli che non usano e La sua lunghezza è: ove w(f) denota il peso dichiarato per f. d G-e (s,t)= min {d G-e (s,x)+w(f)+d G-e (y,t)} f=(x,y) C s (e)
Cammino di rimpiazzo s u v t e x y d G-e (s,t)= min {d G-e (s,x)+w(f)+d G-e (y,t)} f=(x,y) C s (e)
Come calcolare d G-e (s,t) Sia f=(x,y) C s (e); dimostreremo che: d G-e (s,x)+w(f)+d G-e (y,t)=d G (s,x)+w(f)+d G (y,t) Osservazione: d G-e (s,x)=d G (s,x), perché x M s (e) Lemma: Sia f=(x,y) C s (e) un arco del taglio (x M s (e)). Allora y M t (e). (da cui segue che: d G-e (y,t)=d G (y,t))
Un semplice lemma Dim(per assurdo) y M t (e), allora y N t (e). Quindi y discendente di u in S G (t) e P G (t,y) usa e. P G (v,y) è sottocammino di P G (t,y). Quindi: d G (v,y)=w(e) + d G (u,y) > d G (u,y). y N s (e), allora P G (s,y) usa e. P G (u,y) è sottocammino di P G (s,y). Quindi: d G (u,y)=w(e) + d G (v,y) > d G (v,y).
s t N s (e) M t (e) Ms(e)Ms(e)
Costo per calcolare cammini di rimpiazzo Dati S G (s) e S G (t), in tempo O(1) si può calcolare k(f):= d G-e (s,x) + w(f) + d G-e (y,t) d G (s,x) guardo in S G (s) Osservazione: k(f) è la lunghezza del cammino minimo fra s e t che usa f d G (y,t) guardo in S G (t)
Un altro semplice algoritmo Passo 1: Calcoliamo S G (s) e S G (t) Passo 2: e P G (s,t) guardiamo gli archi del taglio C s (e) e prendiamo il minimo (rispetto al valore k( ٠ )). Complessità Passo 1: O(m + n logn) Passo 2: k=O(n) archi, O(m) archi in ogni taglio: O(mn) Migliore di O(mn + n 2 logn) se m=o(n logn)
Lalgoritmo di Malik, Mittal e Gupta (1989) Alla fine degli anni 80, Malik et al. hanno risolto in tempo O(m+n log n) il seguente problema di vitalità su grafi: dato un cammino minimo P G (s,t), qual è il suo arco più vitale, ovvero larco la cui rimozione induce il più lungo cammino minimo di rimpiazzo tra s e t? Il loro approccio costruisce efficientemente tutti i cammini di rimpiazzo tra s e t… …ma questo è esattamente quello che stiamo cercando nel nostro meccanismo VCG!
Lalgoritmo di Malik, Mittal e Gupta Siano e 1, e 2,…,e k gli archi di P G (s,t) da s verso t Al passo i manteniamo in un heap H linsieme dei nodi N s (e i ) (convenzione: N s (e 0 )=V) Chiamiamo i nodi in H nodi attivi Ad ogni nodo y H è associata una chiave k(y) e un particolare crossing edge. k(y)= min {d G (s,x)+w(x,y)+d G (y,t)} k(y): lunghezza del cammino minimo da s a t passante per y quando y è attivo x M s (e i )
Lalgoritmo di Malik, Mittal e Gupta Inizializzazione: H =V, k(y)= per ogni y Passo i : consideriamo larco e i e processiamo H nel seguente modo: Elimino da H tutti i nodi in W s (e i )=N s (e i-1 )\N s (e i ) Considero ogni x W s (e i ), quando trovo che un vicino y a x è attivo, calcolo k(y)=d G (s,x)+w(x,y)+d G (y,t) Se k(y)<k(y) decremento k(y) a k(y) Processati tutti gli x W s (e i ), estraggo il minimo da H, che fornisce la lunghezza del cammino minimo di rimpiazzo per e i (d G-ei (s,t))
Un esempio N s (e 1 ) e1e1 e2e2 e3e3 e5e5 e4e4 s t W s (e 1 )
Un esempio N s (e 2 ) e1e1 e2e2 e3e3 e5e5 e4e4 s t W s (e 2 )
Complessità computazionale di MMG Teorema Dati due nodi s,t in un grafo G con n vertici e m archi, tutti i cammini di rimpiazzo possono essere calcolati in tempo O(m + n log n).
Complessità computazionale di MMG Dim: Calcoliamo S G (s) e S G (t) in tempo O(m + n logn). Usiamo lheap di Fibonacci. Complessità ammortizzata delle operazioni di delete e delete_min è O(logn), e O(1) per le operazioni di insert, find_min, decrease_key,make_heap. Singola operazione make_heap O(n) insert O(n) find_min O(n) delete O(m) decrease_key O(m + n logn)
Complessità computazionale del VCG Corollario Il meccanismo VCG per il problema del cammino minimo può essere calcolato in tempo O(m + n logn) Dim Complessità di g( ٠ ): O(m + n logn) Complessità di p( ٠ ): calcolo tutte le distanze d G-e (s,t), in tempo O(m + n logn)