INTRODUCCIN
El algoritmo de Dijkstra, tambin conocido como el algoritmo del
camino mnimo fue creado en 1950 por el holands Edsger Wybe
Dijkstra. Entre los otros aportes de Dijkstra a la computacin se destaca
la notacin polaca inversa, el algoritmo del banquero y la estructura del
semforo para coordinar el uso de recursos compartidos entre diferentes
procesos.
Este algoritmo resuelve el problema del camino ms corto, es
decir, encontrar en un grafo dirigido ponderado el camino entre dos
vrtices tal que la suma del peso de sus aristas sea mnima.
ALGORITMO DE DIJKSTRA
1. QUE ES UN ALGORITMO?
Es un conjunto prescrito de instrucciones o reglas bien definidas,
ordenadas y finitas que permite realizar una actividad mediante pasos
sucesivos que no generen dudas a quien deba realizar dicha
actividad. Dados un estado inicial y una entrada, siguiendo los pasos
sucesivos se llega a un estado final y se obtiene una solucin.
2. ALGORITMO DE DIJKSTRA
Bsicamente podemos decir que el
algoritmo
dijkstra nos permite determinar dado
dos nodos de un grafo la ruta ms corta que los une.
de
Tambin llamado algoritmo de caminos mnimos, es un algoritmo para la
determinacin del camino ms corto dado un vrtice origen al resto de
vrtices en un grafo con pesos en cada arista.
3. POR QU DIJKSTRA?
Su nombre se refiere a Edsger Dijkstra, quien lo describi por primera
vez
en
1959.
La idea subyacente en este algoritmo consiste en ir explorando todos los
caminos ms cortos que parten del vrtice origen y que llevan a todos
los dems vrtices; cuando se obtiene el camino ms corto desde el
vrtice origen, al resto de vrtices que componen el grafo, el algoritmo
se detiene. El algoritmo es una especializacin de la bsqueda de costo
uniforme, y como tal, no funciona en grafos con aristas de costo
negativo (al elegir siempre el nodo con distancia menor, pueden quedar
excluidos de la bsqueda nodos que en prximas iteraciones bajaran el
costo general del camino al pasar por una arista con costo negativo).
4. CAMINO MAS CORTO: Se da en los grafos ponderados dirigidos y no
dirigidos
-Grafos Ponderados:
Un grafo simple G = (V,A) diremos que es un grafo ponderado si cada
arista/arco tiene un peso.
-Peso de una arista:
Es cuando a la etiqueta de una arista se le asocia un nmero, se denota
por la letra w.
-Camino:
Es una secuencia de vrtices tal que exista una arista entre cada vrtice
y el siguiente. Es una ruta entre dos vrtices dados.
-Peso de un camino:
Es la suma de los pesos de las aristas/arcos que lo forman
5. Algoritmo
Teniendo un grafo dirigido ponderado de N nodos no aislados, sea x el
nodo inicial, un vector D de tamao N guardar al final del algoritmo las
distancias desde x al resto de los nodos.
1. Inicializar todas las distancias en D con un valor infinito relativo
ya que son desconocidas al principio, exceptuando la de x que
se debe colocar en 0 debido a que la distancia de x a x sera 0.
2. Sea a = x (tomamos a como nodo actual).
3. Recorremos todos los nodos adyacentes de a, excepto los nodos
marcados, llamaremos a estos vi.
4. Si la distancia desde x hasta vi guardada en D es mayor que la
distancia desde x hasta a sumada a la distancia desde a hasta
vi; esta se sustituye con la segunda nombrada, esto es:
si (Di > Da + d(a, vi)) entonces Di = Da + d(a, vi)
5. Marcamos como completo el nodo a.
6. Tomamos como prximo nodo actual el de menor valor en D
(puede hacerse almacenando los valores en una cola de
prioridad) y volvemos al paso 3 mientras existan nodos no
marcados.
7. Una vez terminado al algoritmo, D estar completamente lleno.
6.seudo-cdigo
(Grafo G, nodo_salida s)
//Usaremos un vector para guardar las distancias del nodo salida al resto
entero distancia[n] //Inicializamos el vector con distancias iniciales
booleano visto[n] //vector de boleanos para controlar los vertices de los que ya
tenemos la distancia mnima
**para cada** w V[G] **hacer**
**Si** (no existe arista entre s y w) **entonces**
distancia[w] = Infinito //puedes marcar la casilla con un -1 por ejemplo
**Si_no**
distancia[w] = peso (s, w)
**fin si**
**fin para**
distancia[s] = 0
visto[s] = cierto
//n es el nmero de vertices que tiene el Grafo
**mientras que** (no_esten_vistos_todos) **hacer**
vertice = coger_el_minimo_del_vector distancia y que no este visto;
visto[vertice] = cierto;
**para cada** w sucesores (G, vertice) **hacer**
**si** distancia[w]>distancia[vertice]+peso (vertice, w) **entonces**
distancia[w] = distancia[vertice]+peso (vertice, w)
**fin si**
**fin para**
**fin mientras**
**fin funcin**
Ejemplo:
El siguiente ejemplo se desarrollar con el fin de encontrar el camino ms
corto desde a hasta z:
Rojo: Aristas y vrtices pertenecientes a la solucin momentnea.
Azul: Aristas y vrtices candidatos.
Paso 1
En este primer paso, podemos apreciar que hay tres candidatos: Los vrtices b, c y d. En este
caso, hacemos el camino desde el vrtice a, hasta el vrtice d, ya que es el camino ms corto de
los tres.
Solucin momentnea:
Camino: AD
Distancia:5
Paso 2
Ahora, vemos que se aade un nuevo candidato, el vrtice e, y el vrtice c, pero esta vez a travs
del d. Pero el camino mnimo surge al aadir el vrtice c.
Solucin momentnea:
Camino: ADC
Distancia:9
Paso 3
En este paso no se aade ningn candidato ms puesto que el ltimo vrtice es el mismo que en el
paso anterior. En este caso el camino mnimo hallado es el siguiente:
Solucin momentnea:
Camino: ADCB
Distancia:11
Paso 4
Como podemos comprobar, se han aadido dos candidatos nuevos, los vrtices f y g, ambos a
travs del vrtice b. El mnimo camino hallado en todo el grafo hasta ahora es el siguiente:
Solucin momentnea:
Camino: ADCBF
Distancia:15
Paso 5
En este antepenltimo paso, se aaden tres vrtices candidatos, los vrtices g, z y e. Este ltimo
ya estaba pero en esta ocasin aparece a travs del vrtice f. En este caso el camino mnimo, que
cambia un poco con respecto al anterior, es:
Solucin momentnea:
Camino: ADCBF
Distancia:17
Paso 6
En el penltimo paso, vuelve a aparecer otro candidato: el vrtice z, pero esta vez a travs del
vrtice g. De todas formas, el camino mnimo vuelve a cambiar para retomar el camino que vena
siguiendo en los pasos anteriores:
Solucin momentneeea:
Camino: ADCBFE
Distancia:18
Paso 7
Por fin, llegamos al ltimo paso, en el que slo se aade un candidato, el vrtice z a travs del e. El
camino mnimo y final obtenido es:
Solucin Final:
Camino: ADCBFEZ
Distancia:23
Observaciones:
1. Los pesos de las aristas deben ser no negativos.
2. El algoritmo de Dijkstra NO proporciona un rbol generador mnimo.
7. Caso prctico:
Antes de empezar pensemos que nuestros nodos pueden tener
dos
propiedades acumulado Peso y otro llamando nodo Antecesor,
el manejo de estas variables las
aprenderemos
en la medida que las vallamos usndolas.
Para
efectos
de
grafo de la siguiente figura:
esta
explicacin
usaremos
(Primera iteracin) Escogemos un nodo inicio, en este caso
usaremos el nodo A, e
inicializamos sus variables de la siguiente forma:
acumuladoPeso = 0;
nodoAntecesor = nulo;
el
Al ser nuestro nodo inicio, no tiene pesos acumulados ni nodo
antecesor, adems lo cambiamos de color para indicar que ya
lo usamos, quedando segn la siguiente figura.
(Segunda iteracion) Marcamos los nodos adyacentes de A,
inicializando sus variables de la siguiente forma:
acumuladoPeso = [acumuladoPeso del nodo
antecesor (en este caso el de A)] + peso de la arista que los une;
nodoAntecesor = el nombre del nodo antecesor;
Asi para B:
acumuladoPeso = 0 + 6 = 6;
nodoAntecesor = A;
Para D:
acumuladoPeso = 0 + 5 = 5;
nodoAntecesor = A;
Para G:
acumuladoPeso = 0 + 8 = 8;
nodoAntecesor = A;
Quedando segn la siguiente figura:
(Tercera iteracin) Localizamos de los nodos visitados y que no est
marcado con el color verde y que tenga menor peso
acumulado(acumuladoPeso), en caso que tengamos ms de uno con la
caracterstica antes descritas estamos ella libertad de escoger
cualquiera de estos, una vez localizado lo marcamos de color verde.
Para nuestro caso el nodo a escoger es el D yaque su peso acumulado
es el menor de todoscon 5, quedando segn la siguiente figura:
(Cuarta iteracion) Nos ubicamos en el nodo Del cual escogimos en
el paso anterior y marcamos sus nodos adyacentes siempre y
cuando no lo hallamos usado, es decir no este
de color verde. (ver como este paso es analogola iteracin 2)Para este
caso
los
nodos
adyacentes
de
D
no usados son: C, E, H, B; inicializamos los valores de nuestros nodos
adyancentes asi:
Para C:
acumuladoPeso = 5 + 4 = 9;
nodoAntecesor = D;
Para E:
acumuladoPeso = 5 + 6 = 11;
nodoAntecesor = D;
Para H:
acumuladoPeso = 5 + 3 = 8;
nodoAntecesor = D;
Para B:
Como el nodo B ya est marcado (por el
nodo A), primero calculamos el peso acumulado asi:
acumuladoPeso = 5 + 1 = 6;
como el nuevo acumuladoPeso no generar
un valor ms pequeo del que ya estaba , es decir
no lo mejora, el nodo B no lo modificamos.
Recordemos que el numero 5 corresponde al
acumuladoPeso del nodo antecesor.
Quedando segn la siguiente figura:
(Quinta iteracin) Localizamos de los nodos visitados y que no
est marcado con el color verde y que tenga menor peso
acumulado(acumuladoPeso), en caso que tengamos ms de uno
con
la
caracterstica
antes
descritas estamos en
la libertar de escoger cualquiera de estos.
Una vez localizado lo marcamos de color verde. (Ver como este paso es
anlogo a la tercera iteracin)
Para nuestro caso el nodo a escoger es el B yaque es el de menor peso a
cumulado con 6.
Quedando segn la siguiente figura:
(Sexta iteracin) Nos ubicamos en el nodo B, el cual escogimos
en
el
paso
anterior
y marcamos
sus
nodos
adyacentes
siempre
ycuando no lo hallamos usado, es decir
no estede color verde. (Ver como este paso es analogoa la segunda y cu
arta iteracion).
Para este caso el nico nodo adyacentes de B no usado es C.
Inicializamos los valores de nuestro nodo adyacente as:
Para C:
Como el
nodo C ya est marcado (por el
D), primero calculamos el peso acumulado as:
acumuladoPeso = 6 + 7 = 13;
nodo
Como
el
nuevo
acumuladoPeso
no
generar
valor ms pequeo del
que ya estaba, es decir
lo mejora, el nodo C no lo modificamos.
Recordemos
que
el
numero
6
corresponde
acumuladoPeso del nodo antecesor.
Nuestro grafico no sufre ningn cambio.
un
no
al
(Sptima iteracin) Localizamos de los nodos visitados y que no
est marcado con el color verde
y
que
tenga
menor peso
acumulado(acumuladoPeso), en caso que tengamos ms de uno
con
la
caracterstica
antes
descritas
estamos en
la libertar de escoger cualquiera de estos.
Una vez localizado lo marcamos de color verde.(ver como este paso
es anlogo a la tercera y quinta iteracin)
Para nuestro caso podemos escoger entre los nodos G,H ya que el
peso acumulado en cada uno de ellos son los menores con 8; nos
inclinaremos
a usar
el
nodo
H (si
usamos
el
nodo G el resultado final no vara).
Quedando segn la siguiente figura:
(Octava iteracin) Nos ubicamos en el nodo H, el cual escogimos
en el paso anterior y marcamos sus nodos adyacentes siempre y
cuando
no lo hayamos
usado,
es decir no
este
de
color verde. (Ver como este paso es analogoa la segunda, cuarta y sexta
iteracion).
Para este caso los nodos adyacentes de H no usados son: F, G.
Inicializamos los valores de nuestros nodosadyancentes asi:
Para F:
acumuladoPeso = 8 + 4 = 12;
nodoAntecesor = H;
Para G:
Como el nodo G ya est marcado
calculamos el peso acumulado as:
(por
el nodo A), primero
acumuladoPeso = 8 + 2 = 10;
Como
el
nuevo
acumuladoPeso
no
generar
unvalor mas pequeo del que ya estaba, es decirno lo mejora, el nodo G
no lo modificamos.
Recordemos
que
el
numero
8
corresponde
al
acumuladoPeso del nodo antecesor.
Quedando segn la siguiente figura:
(Novena iteracion) Localizamos de los nodos visitados y que no
est marcado con el
color verde
y
que
tenga
menor peso
acumulado
(acumuladoPeso), en caso que tengamos ms de
uno
con
la
caracteristica
antes
descritas estamos en
la libertar de escoger cualquiera de estos.
Una vez localizado lo marcamos de color verde.
(ver
como
este
paso
tercera, quinta y septima iteracion)
es
analogo
la
Para nuestro caso el nodo a escoger es el G ya que su peso acumulado e
s el menor con 8.
Quedando segn la siguiente figura:
(Decima iteracin) Nos ubicamos en el nodo G, el cual escogimos
en el paso anterior y marcamos sus nodos adyacentes siempre
y cuando no lo hayamos usado, es decir no este de color verde. (Ver com
o este paso es anlogo a la segunda, cuarta, sexta iteracin, etc.).
Para este caso el nico nodo adyacentes de G no usado es E.
Inicializamos los valores de nuestro nodo adyacente as:
Para E:
Como el nodo E ya esta marcado (por el nodo D), primero calculamos
el peso acumulado asi:
acumuladoPeso = 8 + 10 = 18;
Como el nuevo acumuladoPeso no generar
unvalor ms pequeo del que ya estaba, es decir
no lo mejora, el nodo E no lo modificamos.
Recordemos que el numero 8 corresponde al
acumuladoPeso del nodo antecesor.
Nuestro grafico no sufre cambios.
(Dcimo primera iteracin) Localizamos de los nodos visitados y
que no est marcado con el color verde y que tenga menor peso
acumulado(acumuladoPeso), en caso que tengamos ms de uno con
la caracterstica antes descritas estamos en la libertar de escoger
cualquiera de estos.
Una vez localizado lo marcamos de color verde.(ver como este paso es
anlogo a la tercera, quinta, sptima iteracin, etc.).
Para nuestro caso el nodo a escoger es el C yaque su peso acumulado es
el menor con 9.
Quedando segn la siguiente figura:
(Dcimo segunda iteracin)
Nos
ubicamos en
El
nodo
C,
el cual escogimos en el paso anterior
y
marcamos
sus
nodos
adyacentes siempre y cuando no lo hayamos usado, es decir no este
de color verde. (Ver como este paso es anlogo a la segunda, cuarta,
sexta iteracin, etc.).
Para este caso los nodo adyacentes de C son E, F. Inicializamos los
valores de nuestros nodos Adyacente as:
Para E:
Como el nodo E ya est marcado (por
calculamos el peso acumulado asi:
el
nodo
D),
primero
acumuladoPeso = 9 + 11 = 20;
Como el nuevo acumuladoPeso no generar un valor ms pequeo del
que ya estaba, es decir no lo mejora, el nodo E no lo modificamos.
Para F:
Como el nodo F ya est marcado (por el
el peso acumulado asi:
nodo H), primero calculamos
acumuladoPeso = 9 + 2 = 11;
Como el valor cumulado de F es 12 y el que acabamos de
calcular es menor (11) es decir que si lo mejora, cambiamos el
valor acumulado
de F por 11 y el nodo antecesor por C por ser C quien lo mejoro.
Recordemos
que
el
numero
acumuladoPeso del nodo antecesor.
corresponde
al
Quedando segn la siguiente figura: (Observe la figura anterior y
que sigue para que compare el cambio que sufri el nodo F)
sta
(Dcimo tercera iteracion) Localizamos de los nodos
que
no
esta
marcado
y
con
visitados
el color verde y que tenga menor peso acumulado (acumuladoPeso),
en caso que tengamos mas de uno con la caracteristica antes
descritas estamos el la libertar de escoger cualquiera de estos.
Una vez localizado lo marcamos de color verde. (ver como este paso
es analogo a la tercera, quinta, septima iteracion, etc).
Para
nuestro
caso
tenemos
dos
nodo
que podemos usar por ser los de menor pesos E,F Cualquiera de los
dos que usemos esta bien, para este caso tomaremos el nodo E.
Quedando segn la siguiente figura:
(Dcimo cuarta iteracin)
Nos ubicamos en el nodo E, el cual escogimos en el paso
anterior
y marcamos
sus
nodos
adyacentes
siempre
y cuando no lo hayamos
usado, es decir no este
de color verde. (Ver como este paso es anlogo a la segunda, cuarta,
sexta iteracin, etc.).
Para este caso el nico nodo adyacente de E es F.
Inicializamos los valores de nuestro nodo adyacente as:
Para F:
Como el nodo F ya est marcado (por el
nodo C), primero calculamos el peso acumulado as:
acumuladoPeso = 11 + 2 = 13;
Como
el
nuevo
acumuladoPeso
no
generar
un valor ms pequeo del que ya estaba, es decir no lo mejora, el nodo
F no lo modificamos.
Recordemos
que
el
numero
acumuladoPeso del nodo antecesor.
11
corresponde
al
Nuestro grafico no sufre cambios.
(Dcimo quinta iteracion) Localizamos de los nodos visitados y
que
no
est
marcado
con
el color verde y que tenga menor peso acumulado (acumuladoPeso), en
caso que tengamos mas de
uno
con las caractersticas antes
descritas estamos en la libertar de escoger cualquiera de estos.
Una vez localizado lo marcamos de color verde.
(ver como este paso es analogo a la
tercera, quinta, septima iteracion, etc).
Para nuestro caso ya solo nos queda F.
Quedando segn la siguiente figura:
Listo, con la dcimo quinta iteracin terminamos de
aplicar
el
dijkstra
a
este
grafo,
ya
que marcamos todos nuestros nodo; ahora podemos identificar
el
camino ms corto de un nodo cualquiera al nodo A el cual
inicialmente escogimos como nodo inicio.
Y Cmo hacemos esto?:
digamos
ruta ms corta del nodo C al nodo A.
que
quiero conocer la
Primero
nos
ubicamos
en
el
C
y
miramos
cual es su nodo antecesor, grficamente vemos que es el nodo D.
Ahora
nos
ubicamos
en
el
nodo
D
miramos cul es su nodo antecesor, grficamente vemos que es A.
Como
finalmente
el
nodo
A
antecesor significa que hemos llegado al nodo inicio.
Fcilmente podemos ver que nuestra ruta es A, D y C.
no
y
tiene
Miremos este ltimo ejemplo Digamos que quiero conocer la ruta ms
corta del nodo F al nodo A.
Primero
nos
ubicamos
en
el
F
y
miramos
su nodo antecesor, grficamente vemos que es el nodo C.
cul
es
Nos ubicamos en el
nodo C y miramos cual
es su nodo antecesor, grficamente vemos que es D.
Ahora
nos
ubicamos
en
el nodo D
y
es su nodo antecesor, grficamente vemos que es A.
Como
finalmente
el
nodo
A
antecesor significa que hemos llegado al nodo inicio.
miramos
no
cul
tiene
Fcilmente podemos ver que nuestra ruta es A, D, C y F.
8. APLICACIONES del ALGORITMO DE DIJKSTRA
En mltiples aplicaciones donde se aplican los grafos, es necesario conocer el
camino de menor costo entre dos vrtices dados:
Distribucin de productos a una red de establecimientos comerciales.
Distribucin de correos postales.
Encontrar la ruta ms cercana entre un punto y otro en una ciudad.
9. Conclusion
El algortimo de dijkstra, asi como los algortimos de enrutamiento, son de gran
utilidad para aquellas empresas que estn encargadas de suministrar
artculos de cualquier ndole, ya que la obtencin del camino ms corto se ve
reflejado en la reduccin de costos en cuanto a tiempo y dinero.
Adems nos dimos cuenta que para poder aplicar el algoritmo de Dijkstra o
cualquier otro algoritmo de enrutamiento para el uso de GPS, se deben tener
en cuenta otros factores como son el trfico, las vialidades, la hora, entre
otras; ya que suponer el caso de que no existe ninguno de los factores
anteriores sera no hablar de un ejercicio de la vida cotidiana.