Il problema del minimo albero ricoprente in un grafo con archi privati Un problema molto noto… INPUT: G=(V,E): grafo non diretto pesato, w(e) R+ per ogni e E T è un albero ricoprente di G se: 1. 2. 3. T è un albero T è un sottografo di G T contiene tutti i nodi di G OUTPUT: T=(V,ET) minimo albero ricoprente di G, ovvero che minimizza il peso totale w(T)= w(e) e ET Miglior algoritmo centralizzato richiede tempo O(m (m,n)) La funzione di Ackermann A(i,j) e la sua inversa (m,n) A(i,j) per piccoli valori di i e j j=1 j=2 j=3 j=4 i=1 2 22 23 24 i=2 22 22 2 2 22 22 2 2 22 2 .. i=3 22 2 .2 16 . . 2 2 22 2. 2 . . 2 .. 16 2 .. 22 2 2 2 .. 2 2 2 16 La funzione (m,n) Proprietà 1. Fissato n, (m,n) è monotonicamente decrescente al crescere di m (m,n)= min {i>0 : A(i, m/n) > log2 n} crescente in m 2. (n,n) per n (n,n)= min {i>0 : A(i, n/n) > log2 n} = min {i>0 : A(i, 1) > log2 n} Osservazione (m,n) 4 per ogni scopo pratico (cioè per valori di n ragionevoli) (m,n)= min {i>0 : A(i, m/n) > log2 n} A(4,m/n) A(4,1) = A(3,2) .2 16 . . =22 >> 1080 numero stimato di atomi nell’universo osservabile quindi (m,n) 4 per ogni n<210 80 Il problema del MSTegoistico Input: un grafo G=(V,E) biconnesso sugli archi, in cui ogni arco corrisponde in modo biunivoco ad un insieme di agenti egoisti; il tipo di un agente è il costo di utilizzo dell’arco (quindi tipo > 0); la sua valutazione è uguale al suo tipo; SCF: un vero MST di G=(V,E,t). Meccanismo VCG Il problema è utilitario VCG-mechanism M= <g(r), p(x)>: g(r): dato il grafo G e le dichiarazioni r=(r1,…,rm), calcola il MST T=(V,ET) di G=(V,E,r) pe: Per ogni arco e E, pe =j≠e vj(rj,x(r-e)) -j≠e vj(rj,x) cioè pe=w(TG-e)-w(T)+ re pe=0 se eET, altrimenti. Per ogni e T dobbiamo calcolare TG-e, ovvero il MST di rimpiazzo per e (MST in G-e =(V,E\{e},r-e)) Ipotesi di lavoro: Grafo 2-edge connesso (altrimenti TG-e potrebbe non esistere il possessore dell’arco e “terrebbe in pugno” il sistema!) Una soluzione banale e T applichiamo l’algoritmo di calcolo dell’MST al grafo G-e Complessità: n-1 archi dell’MST per O(m (m,n)): O(nm (m,n)) La soluzione efficiente che proponiamo costerà ancora O(m (m,n))!!! Un problema correlato: l’analisi di sensitività degli archi di un MST Input grafo G=(V,E) pesato non orientato T=(V,ET) minimo albero ricoprente di G Domanda quanto possono aumentare i pesi w(e) (e T) prima di inficiare la minimalità di T? Esempio 4 11 10 13 6 8 8 10 2 1 3 7 9 Notazioni G=(V,E), T albero ricoprente di G. Definiamo: Per ogni f=(x,y) E\E(T) T(f): (unico) cammino semplice in T che unisce x ey Per ogni e E(T) C(e)={f E\E(T): e T(f)} Proprietà dei cicli Teorema: Sia G=(V,E) un grafo non orientato e pesato, sia e l’arco più pesante di un qualsiasi ciclo in G. Allora e MST(G) Dim (per assurdo): Sia e l’arco più pesante in un ciclo C={e }P, e supponiamo e T X P e V\X T’=T \ {e} {e’} w(e’) < w(e) w(T’) < w(T) e’ T T non è MST(G) Condizione di minimalità di un MST Corollario G=(V,E) grafo non diretto, connesso, pesato T albero ricoprente di G. allora T è minimo se e soltanto se per ogni arco f non dell’albero vale: w(f) w(e) per ogni e in T(f) …quindi… Se e è un arco dell’MST, esso rimane minimo finché w(e) non cresce oltre w(f), dove f è l’arco più leggero che forma un ciclo con e (f è chiamato arco di swap per e); chiamiamo tale valore up(e) Più formalmente, per ogni e E(T) up(e)= minf C(e) w(f) swap(e)= arg minf C(e) w(f) Analisi di sensitività degli archi del MST C(e) 4 11 10 13 6 e 8 10 up(e)=8 2 1 3 7 9 Osservazione Calcolare tutti i valori up(e) è equivalente a calcolare il peso di un MST di G-e per ogni e di T; infatti w(TG-e)=w(T)-w(e)+up(e) Nel meccanismo VCG il pagamento pe di un arco e della soluzione è esattamente pari ad up(e)!! Idea dell’algoritmo efficiente Per ogni e E(T) guardare efficientemente tutti gli archi che formano un ciclo con e e prendere il minimo (up(e)) Il Transmuter Dato G=(V,E) e un suo albero ricoprente T, un transmuter è un grafo diretto aciclico D che rappresenta in modo compatto l’insieme dei cicli fondamentali di G rispetto a T, ovvero l’insieme {T(f) : f arco non dell’albero} D conterrà: 1. 2. 3. Una sorgente (nodo con grado entrante nullo) s(e) per ogni arco e di T Un pozzo (nodo con grado uscente nullo) t(f) per ogni arco f non in T Un certo numero di nodi ausiliari con grado entrante pari a 2 e grado uscente diverso da zero. Proprietà fondamentale: c’è un cammino in D da una data sorgente s(e) a un pozzo t(f) se e solo se e T(f) Un esempio Come si costruisce un transmuter Tarjan ha mostrato che ad ogni albero ricoprente di un grafo può essere associato un transmuter con O(m (m,n)) nodi ed archi, il quale può essere calcolato in tempo O(m (m,n)) La costruzione è un’estensione delle tecniche usate per mantenere efficientemente insiemi di foreste disgiunte sottoposte a operazioni di LINK e operazioni di EVAL R. E. Tarjan, Application of path compression on balanced trees, J. ACM 26 (1979) pp 690-715 Ordinamento topologico D=(N,A) grafo diretto. Un ordinamento topologico di D è un ordinamento v1, v2, …,vn dei nodi tale che per ogni arco (vi, vj) A, vale i < j. D ammette un ordinamento topologico se e solo se D è un DAG (grafo diretto aciclico). Un ordinamento topologico dei nodi può essere trovato (se esiste) in tempo O(n+m). Calcolo degli incrementi per gli archi dell’albero Ordiniamo topologicamente il transmuter (che è un DAG) Etichettiamo ogni nodo del transmuter con un valore reale processando i nodi in ordine topologico inverso: Etichettiamo ogni pozzo t(f) con il valore w(f) (associamo al valore anche l’arco f ) Etichettiamo ogni nodo v che non è un pozzo con il valore minimo fra i valori dei suoi (immediati) successori Quando tutti i nodi sono etichettati ogni sorgente s(e) è etichettata con il valore up(e) (e relativo arco di swap) Calcolo dei valori up(e) 7 2 8 5 6 9 7 4 7 7 7 8 11 6 9 10 6 6 6 9 3 10 9 10 6 10 11 Complessità temporale 1. 2. Costruzione Transmuter: O(m (m,n)) Calcolo valori up(e): Trovare l’ordinamento topologico: O(m (m,n)) Processare il transmuter: O(m (m,n)) Complessità computazionale del VCG Teorema Il meccanismo VCG per il problema del MST può essere implementato in tempo O(m (m,n)). Dim Complessità di g(٠): O(m (m,n)) Complessità di p(٠): calcolo tutti i valori up(e) in tempo O(m (m,n)).