Minimo Albero Ricoprente
Lezione n°15
Algoritmi Avanzati
Prof.ssa Rossella Petreschi
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:
1)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.
3
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
16
15
m
9
l
7
8
a
f
17
1
2
g
3
11
6
i
5
4
12
b
d
18
e
14
h
13
Inizialmente ogni nodo è un
frammento di livello 0
Identificazione dell’arco
uscente di peso minimo
Combinazione
a
b
1
1
b
a
a
b
liv 1
c
d
2
d
e
2
c
c
f
3
3
f
d
g
4
e
e
liv 1
h
e
liv 1
e
f
liv 1
Assorbimento
g
m
5
g
f
i
l
6
g
m
7
g
9
f
Esempio
Identificazione dell’arco
uscente di peso minimo
a
b
c
d
16
g
14
c
e
f
m
h
5
5
e
g
h
Combinazione (niente)
g
Assorbimento
h
Identificazione dell’arco
uscente di peso minimo
a
e
i
b
c
d
16
g
h
14
i
e
c
e
f
m
g
h
l
i
f
14
l
d
e
d
liv 2
Assorbimento (niente)
m
liv 1
l
c
Combinazione
f
i
m
l
6
g
7
g
Esempio
Identificazione dell’arco
uscente di peso minimo
a
b
c
16
2) Assorbimento
1) Combinazione (niente)
b
c
liv 2
g
h
i
l
a
a
m
e
d
16
c
f
d
f
m
g
h
e
l
i