Algoritmo di Edmonds: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
FrescoBot (discussione | contributi)
m Bot: errori di battitura e modifiche minori
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti.
 
(8 versioni intermedie di 7 utenti non mostrate)
Riga 5:
 
== 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: A'' → ''R<sup>+</sup>'' una funzione dall’insiemedall'insieme degli archi all’insiemeall'insieme dei [[Numero reale|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’esecuzionel'esecuzione l’algoritmol'algoritmo opera su grafi intermedi ''G<sub>i</sub> = (V,A<sub>i</sub>,w,a)'' e su alberi intermedi ''T<sub>j</sub> = (V<sub>j</sub>, A*<sub>j</sub>,w,a)'' che vengono man mano modificati.
 
All'inizio vengono eliminati gli archi entranti nella radice ''a'', evidentemente estranei all'albero richiesto. Successivamente l'algoritmo opera in due fasi, dette rispettivamente di contrazione, o fase C, e di espansione, o fase E: durante una fase C si contrae il grafo ''G<sub>i</sub> = (V,A<sub>i</sub>,w,a)'' per eliminare i suoi eventuali cicli; durante la fase E si espande l’alberol'albero ''T<sub>j</sub> = (V<sub>j</sub>, A*<sub>j</sub>,w,a)'' per far riemergere i nodi dei cicli che erano stati contratti. Sia durante la fase di contrazione che durante la fase di espansione avviene la scelta degli archi presenti nella soluzione finale ''T* = (V,A*,w,a)''.
 
Consideriamo la '''fase di contrazione''' che accetta in ingresso il grafo ''G'' = ''(V,A,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 la fase di contrazione è terminata e si restituisce l’alberol'albero ''T<sub>1</sub> = (V<sub>1</sub>, A*<sub>1</sub>,w,a)''.
;'''passo 2'''.: Se ci sono cicli si procede a considerarli secondo un ordine qualsiasi:
:::'''a.'''&nbsp; Ulteriori eventuali archi del grafo di partenza che congiungono i nodi del ciclo sono eliminati dall’insiemedall'insieme degli archi.
:::'''b.'''&nbsp; 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 ''w<sub>i,j</sub>''; sia inoltre ''(k,j)'' l'arco del ciclo che termina in ''j'' (avente peso ''w<sub>k,j</sub>''); allora il peso rietichettato associato all'arco ''(i,j)'' sarà:
::::::::''w<sub>i,j</sub>'' = ''w<sub>i,j</sub> - w<sub>k,j</sub>''
:::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.'''&nbsp; Si fanno collassare i nodi del ciclo in un super-nodo.
:::'''d.'''&nbsp; 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.
Riga 21:
;'''passo 3.''': Torniamo al passo 1 e applichiamo la manovra di contrazione sul grafo ridotto ''G<sub>i+1</sub>'' ottenuto.
 
Consideriamo ora la '''fase di espansione''' che accetta in ingresso l’alberol'albero ''T<sub>1</sub> = (V<sub>1</sub>, A*<sub>1</sub>,w,a)'' ottenuto al termine della precedente fase di contrazione:
;'''passo 1.''': Consideriamo un super-nodo e l'arco entrante, l'arco entrante appartiene alla soluzione finale ''T* = (V,A*,w,a)'' 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’espansionel'espansione di tale supernodo nel ciclo di partenza durante la fase E.
 
== Esempio 1 ==
Riga 33:
|-
|
|Grafo d’ingressod'ingresso ''G = (V,A,w,a)''
|-
|[[Image:|200px]]
Riga 83:
|-
|
|Grafo d’ingressod'ingresso ''G = (V,A,w,a)''
|-
|[[Image:|200px]]
Riga 132:
* 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.&nbsp;109–122
* T. Magnanti, L. Wolsey: ''Handbooks in Operational ResearhResearch and Management Science: Optimal Trees'' (1995) <!--???-->
 
== Collegamenti esterni ==
*[https://web.archive.org/web/20100109052208/http://www.ce.rit.edu/~sjyeec/dmst.html The Directed Minimum Spanning Tree Problem] Description of the algorithm summarized by Shanchieh Jay Yang, May 2000.
*[http://edmonds-alg.sourceforge.net/ Edmonds's algorithm ( edmonds-alg )] - An [[open source]] implementation of Edmonds's algorithm written in [[C++]] and licensed under the [[MIT License]]. This source is using Tarjan's implementation for the dense graph.
*[https://web.archive.org/web/20090511193102/http://algowiki.net/wiki/index.php/Edmonds%27s_algorithm's_algorithm AlgoWiki - Edmonds's algorithm] - A public-___domain implementation of Edmonds's algorithm written in [[Java (programminglinguaggio di languageprogrammazione)|Java]].
 
{{portale|informatica|matematica}}
[[Categoria:Teoria dei grafi]]
 
[[Categoria:TeoriaAlgoritmi deisui grafi|Edmonds]]