Algoritmi Avanzati Prof.ssa Rossella Petreschi Minimo Albero Ricoprente Lezione n°15 Algoritmi Avanzati Prof.ssa Rossella Petreschi 1
Individuazione del minimo albero ricoprente in un contesto distribuito Si provede in modo analogo al caso parallelo, ovvero si prende come base l’algoritmo di Sollin. Si procede formando frammenti (frammento = meganodo) e collegandoli fra loro individuando, per ogni frammento l’arco uscente di costo minimo. La correttezza di questa strategia dipende da 2 proprietà fondamentali: Dato un sottoalbero T’ di un qualche albero di copertura T di costo minimo e un arco e uscente da T’ di costo minimo, allora T’ U {e} è ancora un sottoalbero di qualche albero di copertura di costo minimo (non serve l’unicità dei pesi in questo caso). 2) Se tutti gli archi di un grafo G hanno pesi differenti, allora esiste un unico albero di copertura di G di costo minimo.
Cosa si fa nel parallelo Ad ogni meganodo si associa un identificativo: inizialmente i meganodi sono vertici isolati; l’identificativo del meganodo coincide con l’etichetta del nodo che è radice dell’albero che costituisce il meganodo; ogni nodo capisce a quale meganodo appartiene semplicemente leggendo il nome della radice del suo albero. Cosa si deve evitare nel parallelo: che il costo sia troppo elevato, quindi bisogna diminuire il più possibile: il numero dei processori usati, il numero di iterazioni necessarie, l’altezza degli alberi che si gestiscono.
Algoritmo parallelo Ogni nodo v seleziona il proprio vicino di numerazione minore. Ogni ciclo nella pseudo foresta o è un loop o contiene due archi e in ogni singolo albero il vertice di numerazione minima appartiene al ciclo (e sarà usato come radice). Tramite la tecnica del salto del puntatore, ogni albero della foresta è ridotto ad una stella. In tal modo ogni meganodo è identificato dalla radice della stella ed ogni nodo conosce il nome del meganodo a cui appartiene semplicemente leggendo il nome della radice della propria stella. Una volta che al passo k-esimo si sono individuati tutti i meganodi del grafo su cui si sta operando, bisogna costruire il nuovo grafo ridotto su cui si opererà al passo (k+1)-esimo. Il nuovo grafo avrà nk+1 meganodi e tanti spigoli quanti sono quelli che uniscono i meganodi, ovvero quegli spigoli di G che uniscono vertici appartenenti a stelle differenti. Per calcolare nk+1 bisogna numerare tutti i meganodi utilizzando la tecnica delle somme prefisse.
Cosa si deve fare nel distribuito Ad ogni frammento si associa un identificativo: inizialmente i frammenti sono a livello 0 e sono costituiti da un solo nodo il cui identificativo coincide con quello del frammento; l’identificativo di un frammento è dato dal nodo di identificativo maggiore fra i due estremi dello spigolo “portante” dello spanning tree proprio del frammento. Uniamo i frammenti in due modi: per combinazione di frammenti allo stesso livello k con lo stesso spigolo di costo minimo. In tal caso si crea un nuovo frammento di livello k+1; per assorbimento di un frammento di livello minore con uno di livello maggiore.
Cosa si deve evitare nel distribuito Che i frammenti non coordinino le loro azioni: ogni nodo deve riconoscere a quale frammento appartiene e questa informazione la deve ricevere in modo coordinato; fra tutti gli spigoli uscenti dal frammento, va trovato lo spigolo di costo minimo relativo al frammento stesso; Che l’unione dei frammenti non implichi un numero di messaggi da trasmettere troppo elevato: evitare l’unione di frammenti grandi con vertici isolati: questo potrebbe portare a trasmettere un numero quadratico di messaggi.
Ordinamento fra frammenti Consideriamo un ordinamento fra i frammenti determinato da livello e peso del minimo arco uscente. Chiamiamo fl un frammento a livello l 0 ed el il suo spigolo uscente di costo minimo c(el). fl < fl’ se l < l’ se, l = l’, c(el) < c(el’). fl ≈ fl’ se, l = l’, el = el’.
Unione di frammenti Si ha: combinazione di frammenti quando fl ≈ fl’. Si crea un nuovo frammento di livello l+1 il cui spigolo portante è lo spigolo che ha unito i due frammenti a livello l; assorbimento di fl in fl’ se fl < fl’. Il frammento di livello minore è assorbito da quello di livello maggiore che si trasforma in nuovo frammento mantenendo stesso livello e stesso spigolo portante; nessuna operazione in tutti gli altri casi, ovvero fl’ accoderà la richiesta di fl , mettendolo in attesa, se fl > fl’ ’. La richiesta di fl verrà servita non appena si verificheranno le condizioni per una combinazione o un assorbimento.
Schema dell’algoritmo Si uniscono i frammenti. Il minimo arco uscente dai frammenti che si combinano diventa l’arco portante della componente risultante. Quindi al termine di una combinazione, gli estremi del nuovo arco portante aggiornano la componente contestualmente alla richiesta di ricerca del nuovo minimo arco uscente, causando l’aggiornamento delle relazioni padre/figli. Ad ogni incremento di livello, le richieste lasciate in attesa devono essere nuovamente analizzate per verificare se possono essere servite. L’algoritmo termina quando un frammento non è in grado di individuare il suo arco uscente di costo minimo tutti gli archi vengono scartati perché non esterni in quanto il frammento copre l’intero grafo G.
Esempio 10 c m l 16 15 9 7 8 11 a f g 6 17 2 i 1 3 5 4 12 b d e h 18 14 13 Inizialmente ogni nodo è un frammento di livello 0 a b c d e f g h i l m Identificazione dell’arco uscente di peso minimo 1 1 2 2 3 3 4 5 6 7 9 b a d c f e e g g g f Combinazione a b c d e f liv 1 liv 1 liv 1 e f Assorbimento liv 1 g m
Esempio Identificazione dell’arco uscente di peso minimo a b c d g e f h i l 16 14 5 5 6 7 c e h g g g Combinazione (niente) g e f m Assorbimento h i l liv 1 Identificazione dell’arco uscente di peso minimo a b c d h g e f m 16 14 i 14 l c e d f m Combinazione c d e g h liv 2 l i Assorbimento (niente)
Esempio f m Identificazione dell’arco uscente di peso minimo a b c d e g h 16 16 l i c a f m 2) Assorbimento b a c d e g h 1) Combinazione (niente) liv 2 l i