360 likes | 523 Views
Caminos más cortos a partir de múltiples fuentes en un grafo. ¿Qué es un grafo?. Un grafo es…. Una pareja ordenada G(V,E) con las siguientes características: V es un conjunto de vértices E es un conjunto de parejas de distintos vértices, entre los cuales se trazan líneas (aristas).
E N D
Caminos más cortos a partir de múltiples fuentes en un grafo
Un grafo es… • Una pareja ordenada G(V,E) con las siguientes características: • V es un conjunto de vértices • E es un conjunto de parejas de distintos vértices, entre los cuales se trazan líneas (aristas)
Grafos ponderados 2 4 2 4 1 1 1 3 3 5 1 3 5 1
Entonces • l(a) = peso de la arista ‘a’ • l(x,y) = peso de la arista de x a y
21 20 19 3 2 18 4 17 1 3 15 3 1 5 2 6 9 1 1 2 16 13 12 1 1 1 3 11 8 2 5 14 10 3 4 5 7 6 8 4 1 3 0 ¿Y qué podemos modelar?
Problema de la ruta mínima (Single Source) 2 4 2 4 1 1 1 3 3 5 1 3 5 1 ¿Cómo llego del punto 1 a 4 de la manera más corta posible?
¿Cómo se resuelve? • Existen algoritmos genéricos para ello: • Dijkstra Algorithm • Floyd Algorithm • Bellman-Ford Algorithm
2 4 2 4 1 1 1 3 3 5 1 3 5 1 Algoritmo de Dijkstra • Algoritmo glotón (greedy) • Punto de inicio s • Conjunto S • Vector D
2 4 2 4 1 1 1 3 3 5 1 3 5 1 Condiciones iniciales • S={1} • V-S={2,3,4,5} • D=[0,2,1,∞,3] • 1 2 3 4 5
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|
2 4 2 4 1 1 1 3 3 5 1 3 5 1 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
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 2 4 2 4 1 1 1 3 3 5 1 3 5 1
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 2 4 2 4 1 1 1 3 3 5 1 3 5 1
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 2 4 2 4 1 1 1 3 3 5 1 3 5 1
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 2 4 2 4 1 1 1 3 3 5 1 3 5 1
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 2 4 2 4 1 1 1 3 3 5 1 3 5 1
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 2 4 2 4 1 1 1 3 3 5 1 3 5 1
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 2 4 2 4 1 1 1 3 3 5 1 3 5 1
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 2 4 2 4 1 1 1 3 3 5 1 3 5 1
¿Por qué funciona? • Supongamos delta(s,v) = Mejor manera de llegar de sa 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 2 4 2 4 1 1 1 3 3 5 1 3 5 1
¿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
2 4 2 1 4 1 1 3 3 1 3 5 1 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
2 4 2 1 4 1 1 3 3 1 3 5 1 ¿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?
¿Cómo lo resolvemos con Dijkstra? • Algoritmo glotón (greedy) • Puntos de inicio Conjunto F • Conjunto S • Vector D
2 4 2 4 1 1 1 3 3 5 1 3 5 1 Condiciones iniciales • S=F={1,2} • V-S={3,4,5} • D=[0,0,1,4,3] • 1 2 3 4 5
2 4 2 4 1 1 1 3 3 5 1 3 5 1 Estado final • S={1,5,4,3,2} • V-S={} • D=[0,0,1,4,2] • 1 2 3 4 5
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