Algoritmo di Edmonds: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti. Etichette: Modifica visuale Modifica da mobile Modifica da web per mobile Attività per i nuovi utenti Suggerito: aggiungi collegamenti |
||
(21 versioni intermedie di 17 utenti non mostrate) | |||
Riga 1:
{{tmp|Algoritmo}}
Nella [[teoria dei grafi]] l''''algoritmo di Edmonds''', chiamato anche '''algoritmo di Chu-Liu-Edmonds''', è utilizzato per determinare, a partire da un dato [[Digrafo (matematica)|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
Questo algoritmo è stato sviluppato in modo indipendente da Chu e Liu nel 1965 e da [[Jack Edmonds]] nel 1967. Edmonds ha fornito una prova della sua correttezza utilizzando procedimenti della [[programmazione lineare]]. Si tratta di una dimostrazione piuttosto macchinosa e complessa.▼
▲Questo algoritmo è stato sviluppato in modo indipendente da Chu e Liu nel 1965 e da [[Jack Edmonds]] nel 1967. Edmonds ha fornito una
== 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''
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'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
;'''passo 1.''': Per ogni nodo si seleziona l'arco entrante di peso inferiore. Dal
;'''passo 2'''.: Se ci sono cicli
:::'''a.''' Ulteriori eventuali archi del grafo di partenza che congiungono i nodi del ciclo sono eliminati
:::'''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 ''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.''' 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.'''
;'''passo 3.''': Torniamo al passo 1 e applichiamo la manovra di contrazione sul grafo ridotto ''
Consideriamo ora i '''passi dell'espansione''' che accetta in ingresso l’albero ''H = (V<sup>#</sup>, A<sup>#</sup>,w)'' ottenuto al termine della 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.▼
▲Consideriamo ora
Alla contrazione di ogni ciclo in un supernodo durante la prima fase corrisponde l’espansione del supernodo nel ciclo di partenza durante la seconda fase.▼
▲;'''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
== Esempio 1 ==
Riga 34 ⟶ 32:
! Immagine !! Descrizione
|-
|Grafo
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 1
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.a
|-
|[[Image:Kruskal Algorithm 3.svg|200px]]
|Prima manovra di contrazione: passo 2.b
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.c
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 1
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 2.a
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 2.b
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 2.c
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 2.d
Fine fase di contrazione
|-
|[[Image:|200px]]
|Prima manovra di espansione: passo 1
|-
|[[Image:|200px]]
|Prima manovra di espansione: passo 2
|-
|[[Image:|200px]]
|Seconda manovra di espansione: passo 2
Fine
Si ottiene ''T = (V,A*,w)''.▼
▲|}
▲Si ottiene ''T* = (V,A*,w,a)''.
|}
== Esempio 2 ==
Riga 83 ⟶ 82:
! Immagine !! Descrizione
|-
|
|Grafo
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 1
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.a
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.b
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.c
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.d
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 1
Gli archi selezionati non formano cicli: abbiamo trovato un albero.
Fine fase di contrazione
|-
|[[Image:|200px]]
|Prima manovra di espansione: passo 1
|-
|[[Image:|200px]]
|Prima manovra di espansione: passo 2
|-
|[[Image:|200px]]
|Seconda manovra di espansione: passo 1
|-
|[[Image:|200px]]
|Seconda manovra di espansione: passo 2
|-
|[[Image:|200px]]
|Fine
Si ottiene ''T* = (V,A*,w,a)''.
|}
== Bibliografia ==
* Y. J. Chu. T. H. Liu: ''On the Shortest Arborescence of a Directed Graph'', Science Sinica, v. 14, (1965), pp.
* J. Edmonds: ''Optimum Branchings'', J. Res. Nat. Bur. Standards, v. 71B, 1967, pp.
* [[Robert Tarjan]]: ''Finding Optimum Branchings'', Networks, v.7, 1977, pp.
* P.M. Camerini, L. Fratta, F. Maffioli: ''A note on finding optimum branching'', Networks, v.9, (1979), pp.
* Alan Gibbons: ''Algorithmic Graph Theory,'' Cambridge University Press, (1985
* 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.
* T. Magnanti, L. Wolsey: ''Handbooks in Operational
== 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://
{{portale|informatica|matematica}}
[[Categoria:Teoria dei grafi]]▼
|