Sia dato un grafo non orientato e connesso G=(V,E), |V|=n, |E|=m, e ad ogni arco [i,j] in E sia assegnato un costo .
Per ogni sottoinsieme E’ non proprio di E, il costo complessivo c(E’) associato ad E’ è così definito:
Il Problema dell’Albero di Copertura Minimo (Minimum Spanning Tree – MST) di G consiste nell’individuare un albero che “ricopra” G e che fra tutti gli alberi ricoprenti G sia un albero di costo totale minimo.
Alcune semplici considerazioni utili alla completa comprensione del problema:
Definiamo le seguenti m variabili di decisione
Dal momento che l’obiettivo è minimizzare il costo totale degli archi appartenenti a , la funzione obiettivo è
Per definire i vincoli del problema è sufficiente imporre la validità delle proprietà di albero che la coppia deve godere, dove .
Infatti, è un albero se
;
, , , dove
Nota: Gs=(S,E(S)) è il sottografo di G indotto da S.
Riassumendo, il Problema del Minimum Spanning Tree di un grafo non orientato ha la seguente formulazione matematica:
In quanto segue, sarà descritto un algoritmo esatto polinomiale che segue una strategia di tipo greedy per individuare un albero di copertura minimo di un grafo non orientato.
L’algoritmo di Kruskal è un algoritmo polinomiale che seguendo una strategia di tipo greedy individua un albero di copertura minimo di un grafo non orientato.
Una qualunque tecnica di tipo greedy costruisce una soluzione al problema a partire da una soluzione vuota, aggiungendo di volta in volta alla soluzione parziale in costruzione l’elemento candidato più conveniente in termini di valore di funzione obiettivo (nel caso dell’MST, detto elemento sarà un arco del grafo).
Come già sottolineato, non tutti i problemi di ottimizzazione possono essere risolti all’ottimo applicando questa strategia, ma solo quelli per i quali sia possibile dimostrare che effettuare la scelta migliore al momento conduce ad una soluzione ottima globale.
Dato un albero ed un arco , in quanto segue indicheremo con l’insieme degli archi che formano un ciclo in .
Inoltre, supporremo che
L’ipotesi 2. serve a garantire l’unicità dell’albero di copertura a costo minimo di G ed è utile solo a semplificare la
dimostrazione del seguente teorema enunciato nella slide successiva.
Infatti, rimuovendo l’ipotesi 2, gli algoritmi proposti a soluzione esatta del problema risultano ancora validi ed individuano una delle soluzioni ottime.
Teorema.
Sia un MST per G=(V,E). Per ogni arco [i,j] di E si ha che
dove
ed è detto taglio di G rispetto ad S.
Dimostrazione “⇐”
Supponiamo per assurdo che . In si formerà un ciclo che attraversa il taglio almeno due volte (vedi Figura).
Si noti che , per cui l’albero di copertura di G dato da
avrà costo totale
Si giunge, quindi, ad un assurdo, essendo un MST per G per ipotesi.
Nella figura a lato: Ciclo in ; , per ipotesi).
Dimostrazione “⇒”
Per ipotesi, [i,j] è un arco dell’MST e
dobbiamo verificare che esiste un sottoinsieme proprio S tale che [i,j] sia un arco di costo minimo fra tutti gli archi attraversanti il taglio .
Si scelga come S una delle due componenti connesse che si ottengono rimuovendo da E’ l’arco [i,j] (vedi Figura) e si supponga per assurdo che esista un arco [v,w] nell’insieme tale che .
In tali ipotesi, è possibile costruire un albero di copertura alternativo dato
Cui è associato un costo totale pari
Ma ciò contraddice l’ipotesi di ottimalità di .
Il Teorema appena enunciato e dimostrato suggerisce un semplice algoritmo greedy per trovare una soluzione ottima al Problema dell’MST di un grafo: l’algoritmo di Kruskal.
In fase di inizializzazione gli archi del grafo vengono ordinati per valori non decrescenti dei rispettivi costi ed il grafo
viene considerato come una foresta di n componenti connesse , ciascuna contenente il solo nodo i. .
Ad ogni iterazione viene selezionato l’arco [i,j] avente il costo correntemente minimo e viene aggiunto all’MST in costruzione solo se esso non forma cicli con gli archi già selezionati, ossia se i suoi nodi estremi non appartengono già alla stessa componente connessa.
Nota: [i,j] è l’arco di costo minimo in , con (o ).
L’ordinamento degli archi in fase di inizializzazione (linea 2) richiede
dato che .
L’aggiornamento delle componenti (linee 8 e 9) richiede e viene effettuato al più n-1 volte.
Dunque, il loop while (linee 4–12) richiede .
Ne consegue che la complessità dell’algoritmo di Kruskal è
1. Presentazione del Corso ed Introduzione alla Programmazione Mat...
2. Introduzione ai Problemi di PL
6. Algoritmo del Simplesso Revisionato
7. Algoritmo del Simplesso Tabellare
10. Soluzione di Problemi di PL tramite Algoritmo del Simplesso
11. Problemi di Programmazione Lineare Intera
12. PLI con matrice dei vincoli unimodulare
13. Problemi di PLI: Branch & Bound
14. Il Problema dello Zaino 0/1 e il Problema dello Zaino Frazionar...
15. Il Problema dello Zaino 0/1: un algoritmo B&B
16. Il Problema dello Zaino 0/1: un algoritmo di Programmazione Din...
17. Richiami di Teoria dei Grafi: definizioni e notazioni
18. Il Problema del Vertex Cover Minimo di un Grafo
19. Il Problema dell'Albero di Copertura Minimo (MST)
20. Il Problema dell'Albero di Copertura Minimo (MST): esempio
D. Bertsimas e J.N. Tsitsiklis, Introduction to Linear Optimization, Belmont - Massachusetts (USA), Dynamic Ideas and Athena Scientific, 2008.
M. Fischetti, Lezioni di Ricerca Operativa, Padova, Edizioni Libreria Progetto Padova, 1999.
S. Martello, Fondamenti di Ricerca Operativa L-A, Bologna, Società Editrice Esculapio, 2004.
S. Martello, Ricerca Operativa LS, Bologna, Società Editrice Esculapio, 2004.
Dispense del Corso di Ricerca Operativa presso l'Università degli Studi di Pisa.
Dispense ed Appunti del Corso prodotte da Paola Festa.