Il problema del cammino minimo tra 2 nodi
Il problema del cammino minimo tra 2 nodi in un grafo con archi privati
Scenario n n Archi di un grafo controllati da agenti egoistici Solo l’agente conosce il peso associato al proprio arco Obiettivo: calcolare una “buona” soluzione di un certo problema di ottimizzazione rispetto a pesi reali Strumento: progettazione di un meccanismo truthful (pagamento opportuno degli agenti per convincerli a dire la verità!)
Il problema dello shortest path egoistico n n Input: un grafo G=(V, E), ogni arco è un agente egoistico, un nodo sorgente s e un nodo destinazione t; il tipo di un agente è il costo di utilizzo dell’arco (quindi tipo > 0); la sua valutazione è uguale al suo tipo; SCF: un vero cammino minimo in G=(V, E, tipi) tra s e t.
Più Formalmente n Soluzioni ammissibili: n n Tipo dell’agente e: n n n e: peso dell’arco intuitivamente: e è il costo che l’agente sostiene per utilizzare e Valutazione agente e di un cammino P F : n n F: insieme dei cammini in G da s a t ve( e, P)= e se e P, 0 altrimenti SCF: shortest path in G=(V, E, ) fra s e t.
Come progettare un meccanismo truthful per il problema? Osservazione cruciale: la (vera) lunghezza di un cammino P è: e E ve( e, P) problema utilitario! …usiamo i meccanismi VCG
Meccanismo VCG n M= <g(r), p(x)>: g(r): arg minx F j vj(rj, x) n pe(x): Per ogni arco e E: n pe = j≠e vj(rj, g(r-e)) - j≠e vj(rj, x) cioè
Meccanismo VCG n M= <g(r), p(x)>: g(r): calcola PG(s, t) in G=(V, E, r) n pe: Per ogni arco e E: n pe = j≠e vj(rj, g(r-e)) - j≠e vj(rj, x) cioè pe= { d. G-e(s, t)-(d. G(s, t)-re) 0 se e PG(s, t) altrimenti Per ogni e PG(s, t), dobbiamo calcolare PG -e(s, t), ovvero il cammino minimo di rimpiazzo in G-e =(V, E{e}, r-e) tra s e t
Cammino di rimpiazzo per e s PG-e(s, t) 2 4 5 5 12 3 PG(s, t) 6 e 2 10 5 t quanto viene pagato e? pe=12 -(11 -2)=3
Quel è la complessità temporale del meccanismo? …dobbiamo calcolare con uno SP tra s e t …e il pagamento per gli archi selezionati …è solo una questione algoritmica!
Ipotesi di lavoro n n n=|V|, m=|E| w(e): denota il peso dell’arco e d. G(s, t): distanza in G da s a t (somma dei pesi degli archi di PG(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 PG(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 PG(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) n Se e è un ponte d. G-e(s, t) = ∞ Il possessore di quell’arco “tiene in pugno” il sistema: può chiedere qualsiasi cifra! n
Una soluzione banale e PG(s, t) applichiamo l’algoritmo 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 n n SG(s), SG(t): alberi dei camminimi radicati in s e t Ms(e): insieme dei nodi raggiungibili da s in SG(s) senza passare per l’arco e Ns(e)=V/Ms(e): nodi del sottoalbero di SG(s) radicato in v, dove e=(u, v) Mt(e), Nt(e) definiti in modo analogo
s SG(s) Ms(e) u e v t Ns(e)
Crossing edges n n Ms(e) e Ns(e) individuano un taglio in G Cs(e)={(x, y) E{e}: x Ms(e), y Ns(e)} archi del taglio: crossing edges
Crossing edges SG(s) s Ms(e) u e Cs(e) v t Ns(e)
Come è fatto PG-e(s, t)? n n Ovvio: non usa e PG-e(s, t) deve attraversare il taglio È il cammino più corto fra quelli che non usano e La sua lunghezza è: d. G-e(s, t)= min {d. G-e(s, x)+w(f)+d. G-e(y, t)} f=(x, y) Cs(e) ove w(f) denota il peso dichiarato per f.
Cammino di rimpiazzo s u x e y d. G-e(s, t)= min v t {d. G-e(s, x)+w(f)+d. G-e(y, t)} f=(x, y) Cs(e)
Come calcolare d. G-e(s, t) n Sia f=(x, y) Cs(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 Ms(e) Lemma: Sia f=(x, y) Cs(e) un arco del taglio (x Ms(e)). Allora y Mt(e). (da cui segue che: d. G-e(y, t)=d. G(y, t))
Dim(per assurdo) y Mt(e), allora y Nt(e). Quindi y discendente di u in SG(t) e PG(t, y) usa e. PG(v, y) è sottocammino di PG(t, y). Quindi: d. G (v, y)=w(e) + d. G (u, y) > d. G (u, y). y Ns(e), allora PG(s, y) usa e. PG(u, y) è sottocammino di PG(s, y). Quindi: d. G (u, y)=w(e) + d. G (v, y) > d. G (v, y). Un semplice lemma SG(s) s Ms(e) u x v y t e Ns(e)
s Ms(e) t Ns(e) Mt(e)
Costo per calcolare cammini di rimpiazzo Dati SG(s) e SG(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) d. G(y, t) guardo in SG(s) guardo in SG(t) Osservazione: k(f) è la lunghezza del cammino minimo fra s e t che usa f
Un altro semplice algoritmo Passo 1: Calcoliamo SG(s) e SG(t) Passo 2: e PG(s, t) guardiamo gli archi del taglio Cs(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)
L’algoritmo di Malik, Mittal e Gupta (1989) n n 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 PG(s, t), qual è il suo arco più vitale, ovvero l’arco 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!
L’algoritmo di Malik, Mittal e Gupta n n n Siano e 1, e 2, …, ek gli archi di PG(s, t) da s verso t Al passo i manteniamo in un heap H l’insieme dei nodi Ns(ei) (convenzione: Ns(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)} x Ms(ei) n k(y): lunghezza del cammino minimo da s a t che usa un qualche arco (x, y) non dell’albero
L’algoritmo di Malik , Mittal e Gupta n n Inizializzazione: H =V, k(y)= per ogni y Passo i : consideriamo l’arco ei e processiamo H nel seguente modo: n n Elimino da H tutti i nodi in Ws(ei)=Ns(ei-1)Ns(ei) Considero ogni x Ws(ei), 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 Ws(ei), estraggo il minimo da H, che fornisce la lunghezza del cammino minimo di rimpiazzo per ei (d. G-ei(s, t))
Un esempio s Ws(e 1) e 1 8 8 e 2 15 9 8 e 3 10 2 9 5 Ns(e 1) e 4 1 13 10 e 5 t 11
Un esempio s e 1 8 Ws(e 2) e 2 8 9 8 e 3 2 14 14 9 5 e 4 Ns(e 2) 1 13 10 e 5 t 11
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 SG(s) e SG(t) in tempo O(m + n logn). Usiamo l’heap 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(m + n logn) O(n) delete O(m) decrease_key
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)
- Slides: 31