algoritmo de dijkstra

36
Caminos más cortos a partir de múltiples fuentes en un grafo Joemmanuel Ponce Galindo

Upload: joemmanuel-ponce

Post on 18-Jun-2015

63.545 views

Category:

Technology


3 download

DESCRIPTION

Analisis del Algoritmo de Dijkstra

TRANSCRIPT

Page 1: Algoritmo de Dijkstra

Caminos más cortos a partir de múltiples

fuentes en un grafo

Joemmanuel Ponce Galindo

Page 2: Algoritmo de Dijkstra

¿Qué es un grafo?

Page 3: Algoritmo de Dijkstra

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)

Page 4: Algoritmo de Dijkstra

Grafos ponderados

1

2

4

3 5

2 4

1

1

53

1

1

3

Page 5: Algoritmo de Dijkstra

Entonces

l(a) = peso de la arista ‘a’ l(x,y) = peso de la arista de x a y

Page 6: Algoritmo de Dijkstra

¿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

Page 7: Algoritmo de Dijkstra

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

Page 8: Algoritmo de Dijkstra

¿Cómo se resuelve?

Existen algoritmos genéricos para ello: Dijkstra Algorithm Floyd Algorithm Bellman-Ford Algorithm

Page 9: Algoritmo de Dijkstra

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

Page 10: Algoritmo de Dijkstra

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

Page 11: Algoritmo de Dijkstra

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|

Page 12: Algoritmo de Dijkstra

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

Page 13: Algoritmo de Dijkstra

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

Page 14: Algoritmo de Dijkstra

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

Page 15: Algoritmo de Dijkstra

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

Page 16: Algoritmo de Dijkstra

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

Page 17: Algoritmo de Dijkstra

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

Page 18: Algoritmo de Dijkstra

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

Page 19: Algoritmo de Dijkstra

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

Page 20: Algoritmo de Dijkstra

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

Page 21: Algoritmo de Dijkstra

¿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

Page 22: Algoritmo de Dijkstra

Demostración por contradicción

Suponga que u es el primer vértice añadido a S tal que Du≠delta(s,u)

Page 23: Algoritmo de Dijkstra

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.

Page 24: Algoritmo de Dijkstra

Suposición principal

Sea s->(p1)->x->y->(p2)->u el camino más corto de s a u.

Page 25: Algoritmo de Dijkstra

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

Page 26: Algoritmo de Dijkstra

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

Page 27: Algoritmo de Dijkstra

Finalmente

Así que:

Dy=delta(s,y) = Du=delta(s,u)

Page 28: Algoritmo de Dijkstra

El Multiple Source Shortest-Path Problem

1

2

4

3 5

2 4

1

1

53

1

1

3

Page 29: Algoritmo de Dijkstra

¿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) ?

Page 30: Algoritmo de Dijkstra

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

Page 31: Algoritmo de Dijkstra

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

Page 32: Algoritmo de Dijkstra

¿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

Page 33: Algoritmo de Dijkstra

¿Cómo lo resolvemos con Dijkstra?

Algoritmo glotón (greedy) Puntos de inicio Conjunto F Conjunto S Vector D

Page 34: Algoritmo de Dijkstra

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

Page 35: Algoritmo de Dijkstra

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

Page 36: Algoritmo de Dijkstra

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