Algoritmo di Edmonds

Versione del 9 feb 2010 alle 11:33 di Alberto da Calvairate (discussione | contributi) (ritocco del le notazioni)

Nella teoria dei grafi l'algoritmo di Edmonds, chiamato anche algoritmo di Chu-Liu-Edmonds, è utilizzato per determinare, a partire da un dato digrafo pesato e fortemente connesso, un suo sottoalbero orientato di peso minimo e avente assegnata radice. L'algoritmo individua cioè un sottoinsieme degli archi del dato digrafo che costituisca un albero tale che ogni coppia dei nodi presi in considerazione sia connessa attraverso un cammino e il peso totale degli archi individuati risulti minimo. Una prevedibile variante dell'algoritmo ricerca il sottoalbero orientato di peso massimo.

Questo algoritmo è stato sviluppato in modo indipendente da Chu e Liu nel 1965 e da Jack Edmonds nel 1967. Edmonds ha fornito una dimostrazione della sua correttezza, piuttosto macchinosa e complessa, utilizzando procedimenti della programmazione lineare.

Descrizione

L'algoritmo accetta in ingresso un grafo orientato e pesato G = (V,A,w,a), dove V è l'insieme dei nodi, A l'insieme degli archi, w: AR+ una funzione dall’insieme degli archi all’insieme dei numeri reali e a il nodo che si richiede essere radice dell'albero. In uscita restituisce l'albero orientato di supporto a costo minimo T* = (V,A*,w,a), dove A* è un sottoinsieme di A formato da card(V ) - 1 archi. Durante l’esecuzione l’algoritmo opera su grafi intermedi Gi = (V,Ai,w,a) e su alberi intermedi Hi = (Vi, Bi,w,a) che vengono man mano modificati.

All'inizio vengono eliminati gli archi entranti nella radice a, evidentemente estranei all'albero richiesto. Successivamente viene eseguita una sequenza di coppie di fasi eseguite alternatamente, dette rispettivamente di contrazione, o fase C, e di espansione, o fase E: durante una fase C si contrae il grafo precedente Gi = (V,Ai,w,a) per eliminare i suoi eventuali cicli; durante la fase E si espande l’albero Hi ottenuto come risultato della fase precedente, per far riemergere i nodi dei cicli che erano stati contratti. Sia durante la contrazione che durante l’espansione avviene la scelta degli archi presenti nella soluzione finale T* = (V,A*,w,a).


Consideriamo la generica fase C che accetta in ingresso il grafo Gi = (V,Ai,w,a) :

passo 1.
Per ogni nodo si seleziona l'arco entrante di peso inferiore. Dal momento che la radice non ha archi entranti, rimangono card(V ) - 1 archi. Se non ci sono cicli il procedimento è terminato e si restituisce l’albero Hi.
passo 2.
Se ci sono cicli si procede a considerarli secondo un ordine qualsiasi:
a.  Ulteriori eventuali archi del grafo di partenza che congiungono i nodi del ciclo sono eliminati dall’insieme degli archi.
b.  Tutti gli archi che entrano in uno dei nodi del ciclo vanno rietichettati secondo il seguente criterio: siano j ed i rispettivamente un nodo del ciclo e un nodo che non vi appartiene tali che esista l'arco (i,j) con peso wi,j; sia inoltre (k,j) l'arco del ciclo che termina in j (avente peso wk,j); allora il peso rietichettato associato all'arco (i,j) sarà:
wi,j = wi,j - wk,j
cioè dal peso di ogni arco entrante nel ciclo si sottrae il peso dell'arco del ciclo diretto allo stesso nodo in cui entra l'arco che si sta rietichettando.
c.  Si fanno collassare i nodi del ciclo in un super-nodo.
d.  Tra tutti gli archi rietichettati e paralleli che entrano in un super-nodo si conserva quello di peso inferiore e si eliminano tutti gli altri.
e.  Si ripete questo procedimento per ogni ciclo.
passo 3.
Torniamo al passo 1 e applichiamo la contrazione sul grafo ridotto Gi+1 ottenuto operando sul precedente ciclo.

Consideriamo ora la generica fase di espansione che accetta in ingresso l’albero Hi = (Vi, Bi,w,a) ottenuto al termine della precedente contrazione:

passo 1.
Consideriamo un super-nodo e l'arco entrante, l'arco entrante appartiene alla soluzione finale T = (V,A*,w) e viene etichettato come era in origine.
passo 2.
Il super-nodo viene espanso nei nodi originali e tra gli archi del ciclo bisogna eliminarne uno; tra i nodi del ciclo uno ha due archi entranti: l'arco appena aggiunto alla soluzione e l'arco del ciclo, quest'ultimo viene eliminato, gli altri archi del ciclo vengono aggiunti alla soluzione.
passo 3.
Si torna al passo 1 finché abbiamo espanso tutti i super-nodi.


Alla contrazione di ogni ciclo in un supernodo durante una fase C, corrisponde l’espansione di tale supernodo nel ciclo di partenza durante la fase E.


Esempio 1

Immagine Descrizione
[[Image:]] Grafo d’ingresso G = (V,A,w,a)
[[Image:|200px]] Prima contrazione: passo 1
[[Image:|200px]] Prima contrazione: passo 2.a
  Prima contrazione: passo 2.b
[[Image:|200px]] Prima contrazione: passo 2.c
[[Image:|200px]] Seconda contrazione: passo 1
[[Image:|200px]] Seconda contrazione: passo 2.a
[[Image:|200px]] Seconda contrazione: passo 2.b
[[Image:|200px]] Seconda contrazione: passo 2.c
[[Image:|200px]] Seconda contrazione: passo 2.d

Fine fase di contrazione

[[Image:|200px]] Prima espansione: passo 1
[[Image:|200px]] Prima espansione: passo 2
[[Image:|200px]] Seconda espansione: passo 2

Fine Si ottiene T = (V,A*,w).


Esempio 2

Immagine Descrizione
[[Image:]] Grafo d’ingresso G = (V,A,w,a)
[[Image:|200px]] Prima contrazione: passo 1
[[Image:|200px]] Prima contrazione: passo 2.a
[[Image:|200px]] Prima contrazione: passo 2.b
[[Image:|200px]] Prima contrazione: passo 2.c
[[Image:|200px]] Prima contrazione: passo 2.d
[[Image:|200px]] Seconda contrazione: passo 1

Gli archi selezionati non formano cicli: abbiamo trovato un albero.

Fine contrazione

[[Image:|200px]] Prima espansione: passo 1
[[Image:|200px]] Prima espansione: passo 2
[[Image:|200px]] Seconda espansione: passo 1
[[Image:|200px]] Seconda espansione: passo 2
[[Image:|200px]] Fine

Si ottiene T = (V,A*,w).

Bibliografia

  • Y. J. Chu. T. H. Liu: On the Shortest Arborescence of a Directed Graph, Science Sinica, v. 14, (1965), pp. 1396-1400.
  • J. Edmonds: Optimum Branchings, J. Res. Nat. Bur. Standards, v. 71B, 1967, pp. 233-240.
  • Robert Tarjan: Finding Optimum Branchings, Networks, v.7, 1977, pp.25-35.
  • P.M. Camerini, L. Fratta, F. Maffioli: A note on finding optimum branching, Networks, v.9, (1979), pp.309-312.
  • Alan Gibbons: Algorithmic Graph Theory, Cambridge University Press, (1985(, ISBN 0-521-28881-9
  • H. N. Gabow, Z. Galil, T. Spencer, R. E. Tarjan: Efficient algorithms for finding minimum spanning trees in undirected and directed graphs, Combinatorica 6 (1986), 109-122.
  • Y. Zhang: Parallel algorithms for minimal spanning trees of directed graphs, Int. J. Parallel Program., 3 (June 1990), pp. 109-122
  • T. Magnanti, L. Wolsey: Handbooks in Operational Researh and Management Science: Optimal Trees (1995)

Collegamenti esterni