Para el problema de la ruta
corta tenemos varios algoritmos, en esta oportunidad se explicará el algoritmo
de dijkstra el cual usa una técnica voraz (greedy).
Descripción
El algoritmo de dijkstra
determina la ruta más corta desde un nodo origen hacia los demás nodos para
ello es requerido como entrada un grafo cuyas aristas posean pesos. Algunas
consideraciones:
- Si los pesos de mis aristas son de valor
1, entonces bastará con usar el algoritmo de
BFS(algoritmo de búsqueda: Breadth First Search).
- Si los pesos de mis aristas son negativos
no puedo usar el algoritmo de dijsktra, para pesos negativos tenemos otro
algoritmo llamado Algoritmo de Bellmand-Ford.
Como trabaja
Primero marcamos todos
los vértices como no utilizados. El algoritmo parte de un vértice origen que
será ingresado, a partir de ese vértices evaluaremos sus adyacentes, como
dijkstra usa una técnica greedy – La técnica greedy utiliza el
principio de que para que un camino sea optimo, todos los caminos que
contiene también deben ser óptimos- entre todos los vértices
adyacentes, buscamos el que esté más cerca de nuestro punto origen, lo tomamos
como punto intermedio y vemos si podemos llegar más rápido a través de este
vértice a los demás. Después escogemos al siguiente más cercano (con las
distancias ya actualizadas) y repetimos el proceso. Esto lo hacemos hasta que
el vértice no utilizado más cercano sea nuestro destino. Al proceso de
actualizar las distancias tomando como punto intermedio al nuevo vértice se le
conoce como relajación (relaxation).

Dijkstra es muy similar
a BFS, si
recordamos BFS usaba
una Cola para el recorrido para el caso de Dijkstra usaremos una Cola de
Prioridad o Heap, este Heap debe tener la propiedad de Min-Heap es decir cada
vez que extraiga un elemento del Heap me debe devolver el de menor valor, en
nuestro caso dicho valor será el peso acumulado en los nodos.
Tanto java como C++
cuentan con una cola de prioridad ambos implementan un Binary Heap aunque con
un Fibonacci Heap la complejidad de dijkstra se reduce haciéndolo más
eficiente, pero en un concurso más vale usar la librería que intentar programar
una nueva estructura como un Fibonacci Heap, claro que particularmente uno
puede investigar y programarlo para saber cómo funciona internamente.
Algoritmo en pseudocódigo
Considerar distancia[ i ]
como la distancia más corta del vértice origen ingresado al vértice i.
No hay comentarios:
Publicar un comentario