Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoAlice Palmisano Modificato 8 anni fa
1
Algoritmi Avanzati a.a.2012/2013 Prof.ssa Rossella Petreschi Albero Ricoprente Lezione n°9
2
Albero ricoprente Sia G=(V,E) un grafo connesso non orientato e w:E R una funzione costo su gli archi di G. Definiamo m da V V: m(u)=v sse (u,v) è l’arco di costo minimo incidente su u. Un albero ricoprente (SpanningTree) di G=(V,E) è un albero T=(V,E') tale che E' E. Il costo di un albero pesato è pari alla somma dei costi degli archi che lo compongono: w(T)= e T w(e). Un minimo albero ricoprente (Minimum Spanning Tree ) di un grafo pesato G=(V,E w ) è un albero ricoprente T=(V,E' w ) che ha costo minimo rispetto al costo di qualunque altro albero ricoprente.
3
MST è unico? Un MST in generale non è unico, ma diventa unico quando gli archi hanno costi distinti. Se si vuole avere un unico MST e non si hanno tutti costi distinti, basta considerare la coppia costituita dal costo e dal nome dell’arco in considerazione: w'(e) = a b d c e Si noti che tra e viene scelto a b d c e Nel seguito i costi verranno sempre disambiguati considerando gli archi indicizzati in base al loro ordine lessicografico.
4
LEMMA Lemma1. Tutti gli archi (u,m(u)) MST. Dimostrazione. Sia G=(V,E) un grafo, w una funzione di costo su G e T il MST di G. Assumiamo per assurdo che esista un v V tale che (v,m(v)) T. Consideriamo il cammino da v a m(v) in T sia (v,x) il primo arco in tale cammino. Il costo di tale arco è sicuramente maggiore di quello dell’arco (v,m(v)), per definizione di m(v). Sia T' = T - (v,x) (v,m(v)). T' è un albero ricoprente per G e il suo costo w(T')=w(T)-w(v,x)+(v,m(v)) è minore di quello di T, il che contrasta con il fatto che T è il MST di G, quindi v non può esistere.
5
Stelle ed alberi radicati Albero Radicato Stella Radicata
6
Pseudoforesta Si definisce pseudoforesta un grafo orientato in cui ogni vertice ha grado uscente minore od uguale ad uno. In altre parole, pseudoforesta è un insieme di alberi (e stelle) orientati radicati, ciascuno contenente un ciclo. Una pseudoforesta può essere vista come una funzione d:V V. v V, (v,d(v)) è l’unico arco uscente da v in G. 18 14 1 12 4 13 82 111771521 6 20 310 195 16 9 vd(v) 114 213 320 421 510 66 72 813 910 20 118 121 134 1418 152 1620 178 181 193 206 212
7
Proprietà La funzione m:V V definisce una pseudoforesta t.c. ogni albero orientato ha un ciclo contenente esattamente due archi. Non ci sono cappi perché m(u) u u V. Se per assurdo ci fosse un ciclo di 3 (o più archi) tra i nodi u, v = m(u) e x = m(v) con u = m(x) allora considerando i costi di tali archi, w 1, w 2 e w 3, si avrebbe l’assurdo w 1 < w 3 < w 2 < w 1 v ux w1w1 w2w2 w3w3
8
Algoritmi per MST Prim: si parte da T = un singolo vertice e si costruisce incrementalmente il MST aggiungendo l’arco di costo minimo tra T e G-T. Ad ogni passo si è generato un sottoalbero del MST. Kruskal: si parte da una foresta di nodi isolati e, considerando tutti gli archi in ordine di costo crescente, si aggiunge ciascun arco solo se non induce un ciclo. La certezza di aver generato un albero si ha solo all’ultimo passo. Sollin: si parte da una foresta di nodi isolati. Al primo passo si aggiungono tutti gli archi (u,m(u)). Se non si è costruito il MST, si itera il procedimento considerando le varie componenti connesse generate al passo precedente come nodi isolati.
9
Esempio (PRIM) Dato il grafo Prim inizia con T=({a}, ). Poi inserisce, passo dopo passo, gli archi (a,g), (g,e), (a,b), (b,d), (b,f) e (d,c). L’albero ricoprente generato è: d cb 1 1 2 a f e g 2 2 1 1 1 3 4 1 d cb 1 a f e g 1 1 1 1 2
10
Esempio(KRUSKAL) Kruskal genera il medesimo MST analizzando gli archi nel seguente ordine (quelli che inducono cicli vengono scartati): d cb 1 a f e g 1 1 1 1 2 ew(e)induce un ciclo? (a,g)1no (b,d)1no (b,f)1no (c,d)1no (d,f)1si (e,g)1no (a,b)2no (a,c)2si (f,g)2si (e,f)3si (b,g)4si
11
Esempio(Sollin) Sollin inizialmente considera i seguenti archi: In seguito considera gli archi tra le due componenti connesse: d cb 1 a f e g 1 1 1 1 vm(v)costo ag1 bd1 cd1 db1 eg1 fb1 ga1 Vm(V)costoarco originale C1C1 C2C2 2(a,b) C2C2 C1C1 2 d cb 1 a f e g 1 1 1 1 2 ed ottiene:
12
Strategia per il parallelo Sia Prim che Kruskal sono inerentemente sequenziali in quanto la scelta fatta ad ogni passo dipende strettamente da tutto ciò che si è fatto nei passi precedenti. L’idea di Sollin invece (ad ogni iterazione) lavora su tutti i vertici senza richiedere un ordine specifico, quindi si presta meglio ad essere utilizzata in un contesto di calcolo parallelo. Si noti però che se i costi non fossero distinti con Sollin si potrebbero introdurre cicli di lunghezza ≥ 3: um(u) ab bc ca b ac 1 1 1 b ac
13
MST nel parallelo Input: G grafo non orientato connesso pesato, con pesi distinti Output: l’unico MST Idea: partendo da frammenti costituiti da singoli nodi, ad ogni passo ogni frammento cerca di unirsi con un altro frammento (formando meganodi) attraverso lo spigolo di costo minimo ad esso incidente. Si ripete finché la foresta non si riduce ad un albero.
14
Cosa fare Identificare l’adiacente di costo minimo Rappresentare e identificare opportunamente i meganodi Fondere i meganodi avendo presente le limitazioni sul costo Il tutto deve essere fatto cercando di limitare sia il tempo parallelo che il numero di processori.
15
Meganodi Ad ogni meganodo si associa un identificativo: inizialmente i meganodi sono vertici isolati e l’identificativo è il nome del nodo stesso; in generale, l’identificativo del meganodo coincide con il nome del nodo radice dell’albero che costituisce il meganodo. Per generare i meganodi: ogni nodo v seleziona un proprio vicino tramite la funzione m:V V; si costruisce così una pseudo foresta (V, F), dove F = {(v, m(v)) | v V}. ogni meganodo è identificato dalla radice dell’albero che lo rappresenta ed ogni nodo di V conosce il nome del meganodo a cui appartiene semplicemente leggendo il nome dell’albero a cui appartiene.
16
Come generare i meganodi 1.ogni nodo v seleziona il proprio vicino. Ogni ciclo nella pseudo foresta o è un loop o contiene due archi. In ogni singolo albero il vertice di numerazione minima appartenente all’unico ciclo sarà usato come radice. 2.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. 4 13 812 111771521 4 13 812 111771521 4 13 812 111771521
17
Grafo ridotto 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à n k+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 n k+1 bisogna numerare tutti i meganodi utilizzando la tecnica delle somme prefisse. In un vettore di lunghezza n k si assegna valore 1 alle radice e 0 a tutti gli altri nodi; applicando l’algoritmo delle somme prefisse si conosce il valore di n k+1
18
Strutture dati per MST Input: il grafo G rappresentato come matrice di adiacenza pesata W. W[i,j] = w(i,j) se (i,j) E altrimenti W[i,j] = . Output: MST di G rappresentato tramite liste di adiacenza Altre variabili: n k : numero di nodi del grafo al passo k (n 0 = n) W k : matrice di adiacenza del grafo al passo k (W 0 = W) m k (v): adiacente di v t.c. (u,m k (u)) è l’arco di costo minimo incidente su u (nel grafo al passo k)
19
Algoritmo per MST begin k = 0 while W k contiene archi do m k (u) = v t.c. min W k (u,v) Aggiungi (u,m k (u)) al MST Crea la pseudoforesta corrispondente Esegui il salto del puntatore su m k (v) Numera i meganodi Costruisci W k+1 k = k+1 end
20
Esempio Grafo di partenza rappresentato tramite matrice W 0 Passo 0: meganodi iniziali = nodi isolati Aggiungendo (u,m(u)) u V 2 3 14 11 12 713 6 5 8910 1 2 3 4 5 6 1 1 1 2 2 2 3 3 4 4 1 4 2 3 11 689 5 13 712 10
21
Esempio Dopo il salto del puntatore rimangono 4 meganodi La matrice di adiacenza W 1 del grafo ridotto è: (nella tabella sono riportati il costo minimo di un arco tra due meganodi e l’identificatore di tale arco nel grafo iniziale) 1 4 2 3 11 689 5 13 712 10 1 234 1234 1-2, (1,2)4, (4,5) 22, (1,2)- 34, (4,5) -5, (7,11) 4 -
22
Esempio Passo 1: 4 meganodi isolati, aggiungendo (u,m(u)) u in W 1 Dopo il salto del puntatore rimane 1 solo meganodo La matrice di adiacenza è vuota quindi al passo 2 l’algoritmo termina. Il MST risultante è: 1 23 4 1 23 4 2 3 14 11 12 713 6 5 8910 1 2 5 1 1 1 2 2 2 3 3 4
23
Costo dell’algoritmo Adoperiamo una PRAM con n 2 processori, uno per ogni elemento della matrice di adiacenza. Al generico passo k, una componente connessa di n' > 1 nodi, può originare al più n'/2 meganodi. Quindi dopo O(log n) iterazioni del ciclo while l’algoritmo termina. Ciascuna iterazione richiede tempo logaritmico(vedi slide successiva) L’algoritmo richiede quindi O(log 2 n) tempo su una PRAM CREW con n 2 processori. Con vari tecnicismi si può raffinare l’algoritmo e ridurre costo, assunzioni sul modello e/o numero di processori.
24
Costo di una singola iterazione Ciascuna iterazione richiede tempo logaritmico: a)la ricerca del minimo adiacente per ciascun nodo v richiede O(log n) tempo su PRAM EREW; b)il salto del puntatore per ridurre a stelle la pseudoforesta richiedere tempo logaritmico su PRAM CREW; c)la numerazione dei meganodi richiede tempo logaritmico con somme prefisse su PRAM EREW; d)si deve prestare attenzione nella generazione della matrice W k+1 da utilizzare al passo successivo: tra due meganodi si dovrà porre un arco il cui peso è pari al minimo tra tutti gli archi che collegano i nodi di un meganodo ai nodi dell’altro. Tale operazione si può eseguire in O(log n) tempo su una PRAM EREW simulando una scrittura concorrente. Si dovrà inoltre tenere traccia dell’arco del grafo originale a cui tale costo si riferisce, al fine di poterlo correttamente inserire nel MST.
25
Oltre il MST Lo stesso algoritmo si può applicare per trovare un semplice albero ricoprente di un grafo. Infatti, se il grafo non è pesato si considerano tutti pesi unitari, disambiguati dall’indice dell’arco. Se il grafo non è connesso l’algoritmo genera una foresta ricoprente di costo minimo. Quindi questo algoritmo si può anche utilizzare per identificare le componenti connesse di un grafo.
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.