algoritmo de dijkstra
DESCRIPTION
Analisis del Algoritmo de DijkstraTRANSCRIPT
Caminos más cortos a partir de múltiples
fuentes en un grafo
Joemmanuel Ponce Galindo
¿Qué es un grafo?
Un grafo es…
Una pareja ordenada G(V,E) con las siguientes características:
1. V es un conjunto de vértices
2. E es un conjunto de parejas de distintos vértices, entre los cuales se trazan líneas (aristas)
Grafos ponderados
1
2
4
3 5
2 4
1
1
53
1
1
3
Entonces
l(a) = peso de la arista ‘a’ l(x,y) = peso de la arista de x a y
¿Y qué podemos modelar?
1
0
3
56
4
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
5
3
86
1
2
43
5
11
11
1
2
4
2
3
3
2
1
3
Problema de la ruta mínima (Single Source)
¿Cómo llego del punto 1 a 4 de la manera más corta posible?
1
2
4
3 5
2 4
1
1
53
1
1
3
¿Cómo se resuelve?
Existen algoritmos genéricos para ello: Dijkstra Algorithm Floyd Algorithm Bellman-Ford Algorithm
Algoritmo de Dijkstra
Algoritmo glotón (greedy) Punto de inicio s Conjunto S Vector D
1
2
4
3 5
2 4
1
1
53
1
13
Condiciones iniciales
S={1} V-S={2,3,4,5} D=[0,2,1,∞,3] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
El algoritmo
Aumentar S agregando el elemento v en V-S tal que Dv sea el mínimo de ese conjunto.
Actualizar los valores de Di para todos los elementos i existentes en V-S.
Di=mínimo( Di, Dv+f(v, i) ) Terminar cuando |S|=|V|
Paso a paso (Iteración 1)
Buscar mínimo Di en V-S
S={1} V-S={2,3,4,5} D=[0,2,1,∞,3] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Paso a paso (Iteración 1)
Agregar elemento a S. Actualizar D
S={1,3} V-S={2,4,5} D=[0,2,1,∞,3] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Paso a paso (Iteración 2)
Buscar mínimo Di en V-S
S={1,3} V-S={2,4,5} D=[0,2,1,∞,2] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Paso a paso (Iteración 2)
Agregar elemento a S. Actualizar D
S={1,3,2} V-S={4,5} D=[0,2,1,∞,2] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Paso a paso (Iteración 3)
Buscar mínimo Di en V-S
S={1,3,2} V-S={4,5} D=[0,2,1,6,2] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Paso a paso (Iteración 3)
Agregar elemento a S. Actualizar D
S={1,3,2,5} V-S={4} D=[0,2,1,6,2] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Paso a paso (Iteración 4)
Buscar mínimo Di en V-S
S={1,3,2,5} V-S={4} D=[0,2,1,6,2] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Paso a paso (Iteración 4)
Agregar elemento a S. Actualizar D
S={1,3,2,5,4} V-S={ } D=[0,2,1,6,2] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Final
|S| = |V| La mejor manera de llegar al vértice u se
encuentra en Du
S={1,3,2,5,4} V-S={ } D=[0,2,1,6,2] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
¿Por qué funciona?
Supongamos delta(s,v) = Mejor manera de llegar de s a v
Si Dijkstra funciona: Du=delta(s,u) para toda u en V
Demostración por contradicción
Suponga que u es el primer vértice añadido a S tal que Du≠delta(s,u)
Propiedades que tendría u
u no puede ser s porque Ds = 0 Existe un camino de s a u, de lo contrario
Ds = ∞ Si existe un camino, entonces debe existir el
camino más corto.
Suposición principal
Sea s->(p1)->x->y->(p2)->u el camino más corto de s a u.
Propiedades de x y y
x ya fue insertado en S Dx=delta(s,x) Posteriormente se actualizó el vértice y, así
que Dy=delta(s,y), pero aun no es insertado en S
Entonces
Puesto que y se encuentra antes que u:
Dy=delta(s,y) ≤ Du ≤ delta(s,u) Pero partimos de que u esta siendo insertado
en S, así que se debe cumplir que: Dy ≥ Du
Finalmente
Así que:
Dy=delta(s,y) = Du=delta(s,u)
El Multiple Source Shortest-Path Problem
1
2
4
3 5
2 4
1
1
53
1
1
3
¿Cuál es el problema?
¿Cuál es la mejor manera de llegar al los puntos T (town o ciudad en naranja) a partir de cualquiera de los puntos S (fuente) ?
Consideraciones
Existe un conjunto de fuentes F En el camino más corto para llegar a u,
existe sólo una fuente: f1->(p1)->f2->(p2)->v > f2->(p2)->v
Un problema más real
Puntos Naranjas: Centros de Distribución Puntos Grises: Ciudades ¿De qué centro de distribución es mejor
partir a la ciudad X de tal manera de que gaste los menos recursos posibles?
5
1
2
4
3 5
2 4
1
1
3
1
1
3
¿Qué otro problema podemos resolver?
Puntos Naranjas: Centros de Distribución Puntos Grises: Ciudades Quiero construir un nuevo Punto de
Distribución ¿Cuál es el mejor lugar para hacerlo?
1
2
4
3 5
2 4
1
1
3
1
13
¿Cómo lo resolvemos con Dijkstra?
Algoritmo glotón (greedy) Puntos de inicio Conjunto F Conjunto S Vector D
Condiciones iniciales
S=F={1,2} V-S={3,4,5} D=[0,0,1,4,3] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Estado final
S={1,5,4,3,2} V-S={} D=[0,0,1,4,2] 1 2 3 4 5
1
2
4
3 5
2 4
1
1
53
1
13
Conclusiones
Complejidad O(v2) pudiéndose reducir a O(nlogn) con Busqueda Binaria
Procesa hasta 10,000 vértices en 1 segundo
El Algoritmo de Dijkstra es rápido Demostramos que resuelve eficazmente
nuestro problema