Professional Documents
Culture Documents
Dijkstra (Parte 1)
Algoritmicamente
August 1, 2009
http://algoritmicamente.wordpress.com/
Concetti fondamentali
Come si pu`
o notare linsieme dei vertici V = {v1 , v2 , v3 , v4 , v5 , v6 } mentre linsieme
degli archi `e dato da tutte le coppie di vertici che vengono connessi tra loro, in
questo caso:
G = {{v1 , v2 } , {v1 , v4 } , {v1 , v6 } , {v3 , v6 } , {v5 , v2 } , {v5 , v6 } , {v2 , v4 } , {v4 , v6 } , {v5 , v6 }}.
Spesso (come nel caso trattato) ad ogni vertice o ad ogni arco viene associato
un peso ossia un valore numerico che indica la distanza che intercorre da due
vertici. Tale tipo di grafo prende il nome di grafo pesato del quale viene data
una definizione pi`
u formale.
Definizione 1.4 Un grafo pesato G `e definito come una terna G = ( V,E,P).
Dove V ed E indicano il grafo G = ( V,E) e P indica una generica funzione
che ad ogni vertice o ad ogni arco associa un valore numerico n [, +].
Definizione 1.5 Un cammino (p) in un grafo `e una sequenza di vertici
nei quali ogni vertice successivo `e adiacente al precedente nel cammino.
Definizione 1.5.1 Un cammino semplice, `e un cammino dove tutti i
vertici sono distinti.
Definizione 1.5.2 Un ciclo `e un cammino semplice, eccetto che il vertice
iniziale e finale rimangono invariati.
Cammini minimi
Lanalisi dei cammini minimi `e il cuore di tale articolo, infatti lalgorito di Dijkstra ha come scopo quello di trovare il cammino minimo allinterno di un grafo.
Prima di tutto bisogna far chiarimento su cosa sia un cammino minimo
Definizione 2 Dato un grafo G=( V,E,P) ed un cammino p = {v1 , v2 , ..., vn }
il peso di un cammino (p) `e la somma dei pesi degli archi che compongono
tale cammino.
Dalla figura risulta che il peso del cammino in rosso `e dato da:
(p) = (1 + 5 + 21 + 3) = 30.
Detto ci`
o `e possibile ora definire il cammino minimo di un generico grafo G.
Definizione 2.1 Dato un grafo G = ( V,E,P) il cammino minimo di tale
grafo `e il pi`
u piccolo dei (pn ), dove pi 1 i n `e un generico cammino del
grafo G.
Grazie a tale definizione appare pi`
u chiaro lo scopo dellalgoritmo di Dijkstra,
infatti mediante esso possiamo trovare IL cammino minimo allinterno di un
grafo pesato G.
Seguono dunque alcuni esempi per mostrare il cammino minimo allinterno di
un grafo:
Come si pu`
o dunque notare dalle due figure, il cammino minimo (per arrivare
dal vertice 1 al vertice 3) non `e quello pi`
u breve cio`e quello che percorre meno
archi, ma, come detto nella definizione, `e quello la cui somma dei pesi degli archi
`e minima.
Tale problema non `e banale in quanto vi `e unimportante osservazione da fare:
Come si pu`
o notare in entrambe le figure (fig.4, fig5) il cammino minimo non
inizia affatto con larco di peso minore, anzi, in questo caso il cammino minimo
`e quello che ha come arco di partenza, quello con il peso maggiore (gli altri sono
E1 = {v1 , v6 } il quale ha peso 2, e E2 = {v1 , v4 } il quale ha peso 1). Ci`o ci da la
dimostrazione che il cammino minimo `e dato da una somma, e in quanto somma
si deve tener conto degli addendi che la compongono (in questo caso i pesi). Inoltre, dalla definizione 1.4 si evince che i pesi possono anche essere negativi,
dunque per quanto possa essere grande il peso del primo arco di un percorso, il
peso di un cammino potr`
a essere diminuito a causa di un cammino di valore
negativo.
Algoritmo di Dijkstra
Per quanto riguarda linizializzazione, essa `e effettuata dalle righe 2,3,4,5,6 nelle
quali vengono effettuate le inizializzazioni per tutti i nodi, pi`
u nello specifico,
le righe 3,4 settano le distanze dal vertice sorgente agli altri nodi a , la riga
5 setta la distanza del vertice sorgente a 0, e infine la riga 6 crea linsieme Q il
quale contiene tutti i nodi del grafo dato in input. Per chiarire meglio quanto
mostriamo un esempio.
Lesempio mostrato accetta in input il grafo di fig. 6 e si prende come vertice sorgente v1. Le righe 3,4, come gi`a detto, settano le distanze di tutti i
vertici al vertice sorgente ad , tale distanza viene indicata ponendo vicino al
vertice interessato il suo valore, mentre la riga 5 setta la distanza del vertice
sorgente a 0. Infine vi `e la riga 6, la quale crea linsieme di tutti i vertici del
grafo Q, nel caso dai noi analizzato, al momento dellinizializzazione, linsieme
Q = {v1 , v2 , v3 , v4 , v5 , v6 }.
La seconda parte dellalgoritmo analizza il grafo per estrarne i cammini minimi,
essa va dalla riga 7 alla riga 16.
Possiamo subito notare che essa `e composta da un ciclo principale (while Q is
not empty:) dal quale poi si diramano gli altri cicli, tale ciclo termina ovviamente quanto linsieme Q `e vuoto.
La riga 8 prende dallinsieme Q il vertice che ha distanza minore, poiche tutti
i vertici eccetto v 1 hanno distanza infinita, verr`a selezionato v1 dallinsieme Q.
La riga 9 consiste in un if, il quale in tal caso non verr`a preso in considerazione
in quanto dist[v 1 ] = 0 6= . La riga 11 eliminer`
a in vertice v 1 dallinsieme Q
il quale ora diventer`
a Q = {v2 , v3 , v4 , v5 , v6 }. La riga 12 da origine ad un altro
ciclo, il quale analizza i pesi degli archi che connettono i vertici, tale ciclo prende
in analisi tutti i vertici che sono collegati direttamente a v 1 e ne analizza il peso
degli archi che li uniscono, viene quindi preso in considerazione v 2 il quale ha
una distanza (peso dellarco) 3 con v 1 , a tal proposito nella riga 13 viene creata
una variabile temporale alt la quale sommer`a il peso dellarco che unisce i vertici
con la distanza del vertice preso in considerazione poich`e la distanza {v 1 v,2 } =
3, e poich`e v1 ha in origine distanza = 0, alt = 0 + 3 = 3. Una volta calcolata
tale distanza, se tale distanza `e minore di quella presente nel vertice vicino a
Anche gli altri vertici vicini a v 1 vengono selezionati e viene calcolata la distanza
mediante lanalisi dei pesi degli archi che li uniscono.
Una volta effettuata tale operazione, il processo inizia nuovamente, il ciclo while
esegue unaltra iterazione e si passa alla linea 8, la quale scegliera il vertice con
la distanza pi`
u piccolo allinterno dellinsieme Q, `e da ricordare che la linea 11
aveva modificato il contenuto di Q, dunque ora verr`a selezionato come vertice
da analizzare, v 4 , poich`e esso ha la distanza minore tra tutti i vertici di Q. Le
linee 9,10 anche in questo caso non vengono prese in cosiderazione poich`e v 4
= 1 6= , dunque la linea 11 eliminera lelemento v4 dallinsieme Q, il quale
ora risulta essere composto da Q = {v 2 , v3 , v5 , v6 }. Una volta effettuata tale
operazione si entra nel ciclo for, il quale andra ad analizzare (come gi`a visto
per v1 ) tutti i vertici ad esso collegati, nellesempio mostrato lunico ad essere
vicino a v 4 `e v 6 , la riga 13 crea la variabile alt = 1 + 13 = 14, la riga 14 indica
che se la distanza di v6 > alt allora tale distanza deve essere sovrascritta con
il valore di alt, dunque poich`e 30 > 14 ne segue che il valore delle distanza di
v6 , viene settato a 14 (riga 15), infine la riga 16 aggiunge allarray il vertice v 4 ,
il quale conter`
a ora previous[] = {v 1 , v4 }, viene mostrato graficamente quanto
descritto.
fig. 11 v 4 `
e il vertice con distanza minore
Come si pu`
o notare dalla fig. 11 tra tutti i vertici, v 4 `e quello con distanza
minore, e poich`e esso ha come unico vicino v 6 , verr`a calcolata la sua distanza
basandosi sul peso dellarco che li unisce, poiche tale distanza `e uguale a 14,
mentre la distanza precedente `e uguale a 30, tale distanza viene aggiornata
mettendo il valore minore dei due.
Tale processo continua per tutti i vertici rimanenti fino a quando essi non verranno esaminati tutti, cio`e quando linsieme Q che contiene tutti i vertici `e vuolo
Q = {}. Alla fine di tale processo il grafo apparir`a come in figura.