ALGORITMOS Camino Mas Corto
ALGORITMOS Camino Mas Corto
ALGORITMOS Camino Mas Corto
BIANKA BARRIOS S.
b 1
1 3 45
10
2
20
s
3
4
3 c 2
55
40 25 50 4
25
30 15
Si importa cuantos caminos existen Si ya conozco un camino, pero encuentro uno mejor, sustituir
2 1.5 1
SAN
BIL
1.1
las rutas entre ciudades de una aerolnea. El peso de las aristas es el tiempo de vuelo.
1 1.2 1.2
0.9
BAR
MAD
1 2 1.5
VAL
1.2 1.3
SEV MAL
Algoritmo de Dijkstra
La idea principal es realizar una bsqueda a lo ancho ponderada empezando por el vrtice inicial f. De manera iterativa se construye un conjunto de vrtices seleccionados S que se toman del conjunto de vrtices candidatos C segn el menor peso (distancia) desde f. El algoritmo termina cuando no hay ms vrtices de G fuera del conjunto formado. El paradigma usado corresponde al mtodo voraz, en el que se trata de optimizar una funcin sobre una coleccin de objetos (menor peso). Se usa un vector d[v] para almacenar la distancia de v a f.
Algoritmo de Dijkstra
Cuando se aade un vrtice al conjunto S, el valor de d[v] contiene la distancia de f a v. Cuando se aade un nuevo vrtice u al conjunto S, es necesario comprobar si u es una mejor ruta para sus vrtices adyacentes z que estn en el conjunto C. Para ello se actualiza d con la relajacin de la arista (u, z): d[z] = min( d[z], d[u] + w[u, z] )
30
30
f f
60
90
z 100
100
S
Algoritmo de Dijkstra
Dijkstra(G, f) S = { f }, C = { V } d[f] = 0
d[u] = u f
while (C ) { seleccionar vrtice w C / d[w] es mnimo S = S {w}, C = C - {w} for cada vertex v Adyacente[w] { if (d[v] > d[w] + w(w, v)) d[v] = d[w] + w(w, v) } }
Algoritmo de Dijkstra
10 0 5
1 3 9 7 2
1 3 9 7
10 0 5 2
10 3
6 f
10 0 5 2
8 3
14 4 7
9 4 6
9
7
9
7
5 8 2 3
2 1 9 7
5
8
2
1 3
10 0 5 2
13
4
7
10 0 5
9
f
10 0 5 2
4
7
9
7
Algoritmo de Dijkstra
Para reconstruir los vrtices del camino ms corto desde el vrtice fuente a cada vrtice:
Se usa otro array p[v] que contiene el vrtice anterior a v en el camino. Se inicializa p[v] = f para todo v f Se actualiza p siempre que d[v] > d[w] + w(w, v) a: p[v] = w. El camino a cada vrtice se halla mediante una traza hacia atrs en el array p.
a f 10 0 2
1 3 9 7 4
9 b 6 7 d
5
c
Caminos ms cortos
Problema: Hallar los caminos mnimos entre cualquier par de nodos de un grafo. Se puede usar el algoritmo de Dijkstra tomando cada vrtice como fuente. Existe una manera ms directa: algoritmo de Floyd.