You are on page 1of 22

l Algortimo de Dijkstra, también denominado Algoritmo de caminos mínimos, es

un modelo que se clasifica dentro de los algoritmos de búsqueda. Su objetivo, es


determinar la ruta más corta, desde el nodo origen, hasta cualquier nodo de la red.
Su metodología se basa en iteraciones, de manera tal que en la práctica, su
desarrollo se dificulta a medida que el tamaño de la red aumenta, dejándolo en clara
desventaja, frente a métodos de optimización basados en programación
matemática.
¿Qué tipos de redes pueden resolverse por
medio del Algoritmo de Dijkstra?
Este algoritmo, al igual que el método de Floyd, tienen la capacidad de resolver el
problema de la ruta más corta, tanto para redes cíclicas, como para redes acíclicas.
De manera tal que los bucles que presente una red, no restringen el uso del
algoritmo.

El algoritmo de Dijkstra hace uso y define etiquetas a partir del nodo origen y para
cada uno de los nodos subsiguientes. Estas etiquetas contienen información
relacionada con un valor acumulado del tamaño de los arcos y con la procedencia
más próxima de la ruta.

Las etiquetas corresponden a los nodos, no a los arcos. En el algortimo de Dijkstra,


estas etiquetas son temporales y permanentes. Las etiquetas temporales son
aquellas que son susceptibles de modificarse mientras exista la posibilidad de hallar
para sí, una ruta más corta; de lo contrario, dicha etiqueta pasa a ser permanente.

Etiqueta = [acumulado, nodo procedente] iteración


Algoritmo de Dijkstra - Ejemplo
Teniendo en cuenta la siguiente red, que tiene como origen el nodo 1:
Procedemos con las iteraciones, partimos de la iteración 0, es decir, asignar la
etiqueta para el nodo origen:
Iteración 0

En este paso, asignamos una etiqueta permanente para el nodo


origen. Recordemos que la etiqueta se compone por un valor acumulado, que en
este caso debe ser 0, ya que es el punto base y que no existe procedencia:

Etiqueta nodo 1 = [valor acumulado, procedencia] iteración


Etiqueta nodo 1 = [0, -] 0

Iteración 1

En este paso, evaluamos a cuáles nodos se puede llegar desde el nodo 1. En este
caso se puede llegar a los nodos 2 y 3. De manera que debemos asignar las
etiquetas para cada nodo:

Etiqueta nodo 2 = [valor acumulado, procedencia] iteración


Etiqueta nodo 2 = [0 + 100, 1] 1

0 es el valor acumulado en la etiqueta del nodo de procedencia, en este caso el


valor acumulado para el nodo 1. 100 es el valor del arco que une el
nodo procedencia (1) y el nodo destino (2). 1 es el número de la iteración.

Etiqueta nodo 3 = [valor acumulado, procedencia] iteración


Etiqueta nodo 3 = [0 + 30, 1] 1

En este caso, podemos observar que la etiqueta del nodo 3, ya contiene el menor
valor acumulado posible para llegar a este. Ya que 30 es la mínima distancia
posible, toda vez que para llegar al nodo 3 por medio del nodo 2, tendrá que recorrer
como mínimo el valor absoluto del arco que une el origen con el nodo 2 = 100. Así
entonces, la etiqueta del nodo 3 pasa a ser permanente.

Tabulamos la iteración 1:

Iteración 2:

En este paso, evaluamos las posibles salidas desde el nodo 3, es decir los nodos 4
y 5. De manera que debemos asignar las etiquetas para cada nodo:

Etiqueta nodo 4 = [valor acumulado, procedencia] iteración


Etiqueta nodo 4 = [30 + 10, 3] 2
Etiqueta nodo 4 = [40, 3] 2

30 es el valor acumulado en la etiqueta del nodo de procedencia, en este caso el


valor acumulado para el nodo 3. 10 es el valor del arco que une el
nodo procedencia (3) y el nodo destino (4). 2 es el número de la iteración.

Etiqueta nodo 5 = [valor acumulado, procedencia] iteración


Etiqueta nodo 5 = [30 + 60, 3] 2
Etiqueta nodo 4 = [90, 3] 2
30 es el valor acumulado en la etiqueta del nodo de procedencia, en este caso el
valor acumulado para el nodo 3. 60 es el valor del arco que une el
nodo procedencia (3) y el nodo destino (5). 2 es el número de la iteración.

En este caso, podemos observar que la etiqueta del nodo 4, contiene el menor valor
acumulado posible para llegar a este. Así entonces, la etiqueta del nodo 4 pasa a
ser permanente.

Tabulamos la iteración 2:

Iteración 3:

En este paso, evaluamos las posibles salidas desde el nodo 4, es decir los nodos 2
y 5. De manera que debemos asignar las etiquetas para cada nodo:

Etiqueta nodo 2 = [valor acumulado, procedencia] iteración


Etiqueta nodo 2 = [40 + 15, 4] 3
Etiqueta nodo 2 = [55, 4] 3
40 es el valor acumulado en la etiqueta del nodo de procedencia, en este caso el
valor acumulado para el nodo 4. 15 es el valor del arco que une el
nodo procedencia (4) y el nodo destino (2). 3 es el número de la iteración.

Etiqueta nodo 5 = [valor acumulado, procedencia] iteración


Etiqueta nodo 5 = [40 + 50, 4] 3
Etiqueta nodo 5 = [90, 4] 3

40 es el valor acumulado en la etiqueta del nodo de procedencia, en este caso el


valor acumulado para el nodo 3. 50 es el valor del arco que une el
nodo procedencia (4) y el nodo destino (5). 3 es el número de la iteración.

En este caso, podemos observar que el nodo 2 ahora cuenta con 2 etiquetas
temporales, y definitivas, ya que no existe otra ruta hacia dicho nodo. De manera
que se elige la etiqueta que tenga el menor valor acumulado. Así entonces, la
etiqueta del nodo 2 con procedencia del nodo 4, pasa a ser permanente.

Tabulamos la iteración 3:
Iteración 4:

En este paso, evaluamos las posibles salidas desde el nodo 2 y el nodo 5. Sin
embargo, el nodo 2 solo tiene un posible destino, el nodo 3, el cual ya tiene una
etiqueta permanente, de manera que no puede ser reetiquetado. Ahora, evaluamos
el nodo 5 y es un nodo que no tiene destinos. Así entonces, su etiqueta temporal
pasa a ser permanente, en este caso cuenta con 2 etiquetas que tienen el mismo
valor, es decir, alternativas óptimas. De esta manera concluye el algortimo de
Dijkstra.
¿Cuál es la ruta más corta?

La ruta más corta entre el nodo 1 (origen) y cualquier otro nodo de la red (destino),
se determina partiendo desde el nodo destino y recorriendo las procedencias de sus
etiquetas. Por ejemplo:

¿Cuál es la ruta más corta entre el nodo 1 y el nodo 4?

En este caso, debemos partir desde la etiqueta del nodo 4.


La ruta más corta entre el nodo 1 y el nodo 4 tiene un valor acumulado de: 40

Es necesario considerar, que los valores utilizados en los arcos de la red objeto de
estudio del algoritmo de Dijkstra, no necesariamente representan distancias. Si
bien, es un modelo que aborda el denominado "problema de la ruta más corta"; en
la práctica, puede utilizarse para optimizar: distancia, costos, tiempo.

De hecho, los sistemas de ruteo utilizados en la actualidad, priorizan los costos y el


tiempo como variable decisión de los modelos de optimización.
Algoritmo de Dijkstra
Algoritmo de Dijkstra

Concepto: El algoritmo de Dijkstra, también llamado


algoritmo de caminos mínimos, es un
algoritmo para la determinación del
camino más corto dado un vértice origen al
resto de vértices en un grafo con pesos en
cada arista. Su nombre se refiere a Edsger
Dijkstra, quien lo describió por primera vez
en 1959.

Aplicaciones
En múltiples aplicaciones donde se aplican los grafos,
es necesario conocer el camino de menor costo entre
dos vértices dados:

Distribución de productos a una red de establecimientos


comerciales.

Distribución de correos postales.


Algoritmo de
Dijkstra. También llamado Sea G = (V, A) un grafo dirigido ponderado.
algoritmo de caminos
mínimos, es un algoritmo El problema del camino más corto de un vértice a otro
para la determinación del consiste en determinar el camino de menor costo,
camino más corto dado un desde un vértice u a otro vértice v. El costo de un
vértice origen al resto de camino es la suma de los costos (pesos) de los arcos
vértices en un grafo con que lo conforman.
pesos en cada arista. Su
nombre se refiere a Edsger
Dijkstra, quien lo describió
Características del algoritmo
por primera vez en 1959.  Es un algoritmo greddy.
Algoritmo 24.1: Algoritmo  Trabaja por etapas, y toma en cada etapa la mejor
de Dijkstra. Inicialización. solución sin considerar consecuencias futuras.
 El óptimo encontrado en una etapa puede modificarse
posteriormente si surge una solución mejor.
 Sea V un conjunto de
vértices de un grafo.
 Sea C una matriz de costos Pasos del algoritmo
de las aristas del grafo,
donde en C[u,v] se
almacena el costo de la
arista entre u y v.
 Sea S un conjunto que contendrá los vértices para los cuales ya se tiene determinado
el camino mínimo.
 Sea D un arreglo unidimensional tal que D[v] es el costo del camino mínimo del vértice
origen al vértice v.
 Sea P un arreglo unidimensional tal que P[v] es el vértice predecesor de v en el camino
mínimo que se tiene construido.
 Sea vinicial el vértice origen. Recordar que el Algoritmo Dijkstra determina los caminos
mínimos que existen partiendo de un vértice origen al resto de los vértices.

Paso 1. S ← {vinicial} //Inicialmente S contendrá el vértice //origen


Paso 2. Para cada v∈V, v ≠ vinicial, hacer
2.1. D[v] ← C[vinicial, v] //Inicialmente el costo del //camino mí
nimo de vinicial a v es lo contenido en //la matriz de costos
2.2. P[v] ← vinicial //Inicialmente, el //predecesor de v en el ca
mino mínimo construido //hasta el momento es vinicial
Paso 3. Mientras (V – S ≠ ∅) hacer //Mientras existan vértices para /
/los cuales no se ha determinado el //camino mínimo
3.1. Elegir un vértice w∈(V-S) tal que D[w] sea el mínimo.
3.2. S ← S ∪ {w} //Se agrega w al conjunto S, pues ya se //tiene e
l camino mínimo hacia w
3.3. Para cada v∈(V-S) hacer
3.3.1. D[v] ← min(D[v],D[w]+C[w,v]) //Se escoge, entre //el camino
mínimo hacia v que se tiene //hasta el momento, y el camino hacia v //
pasando por w mediante su camino mínimo, //el de menor costo.
3.3.2. Si min(D[v],D[w]+C[w,v]) = D[w]+C[w,v] entonces P[v] ← w //
Si se escoge ir por w entonces //el predecesor de v por el momento es
w
Paso 4. Fin

Ejecución de algoritmo
 Paso 1: Inicialización

 Paso 2: Elegir un vértice w ∈ V - {A} tal que D[w] sea mínimo, y agregar w al
conjunto solución S
 Paso 3: cada v ∈ {C, D, E} hacer D[v] ← min( D[v], D[w]+C[w, v] )
 Paso 4: Elegir un vértice w ∈ V - {A, B} tal que D[w] sea mínimo, y agregar w al
conjunto solución S.

 Paso 5: Para cada v ∈ {C, E} hacer D[v] ← min( D[v], D[w]+C[w, v]

Archivo:Algo09.JPG

 Paso 6: Elegir un vértice w ∈ V - {A, B, D} tal que D[w] sea mínimo, y agregar w al
conjunto solución S.
 Paso 7: Para cada v ∈ { E} hacer D[v] ← min( D[v], D[w]+C[w, v]
 Paso 8: Elegir un vértice w ∈ V - {A, B, D, C} tal que D[w] sea mínimo, y agregar w
al conjunto solución S.
Final del Proceso de Ejecución
Luego del paso 8 tenemos la siguiente situación:

 El conjunto de vértices V = {A, B, C, D, E}


 El conjunto de vértices para los que ya se determinó el camino mínimo S = {A, B, D, C,
E}

Por lo que como V-S=Ø se termina el algoritmo, pues para cada nodo del grafo se
ha determinado cuál es su camino mínimo. Como resultado de la ejecución del
algoritmo tenemos:

D[B] D[C] D[D] D[E] P[B] P[C] P[D] P[E]


10 50 30 60 A D A C

Al finalizar la ejecución del algoritmo Dijkstra, en el arreglo D quedan almacenados


los costos de los caminos mínimos que parten del vértice origen al resto de los
vértices. Por tanto, en nuestro ejemplo, el camino mínimo de A hacia B tiene costo
10, el camino mínimo de A hacia C tiene costo 50, el camino mínimo de A hacia D
tiene costo 30 y el camino mínimo de A hacia E tiene costo 60.
Veamos cómo se pueden obtener los caminos mínimos a partir del arreglo de
predecesores. Los caminos se reconstruyen partiendo del vértice destino hasta
llegar al vértice origen.

CaminoMínimo (A, B) = AB ya que P[B]=A


CaminoMínimo (A, C) = ADC ya que P[C]=D y P[D]=A
CaminoMínimo (A, D) = AD ya que P[D]=A
CaminoMínimo (A, E) = ADCE ya que P[E]=C, P[C]=D y P[D]=A

Finalmente, el camino mínimo que incluye todos los vértices del grafo es ADCE.

Pseudocódigo
Cola de prioridad

DIJKSTRA (Grafo G, nodo_fuente s)


para u ∈ V[G] hacer
distancia[u] = INFINITO
padre[u] = NULL
distancia[s] = 0
adicionar (cola, (s,distancia[s]))
mientras que cola no es vacía hacer
u = extraer_minimo(cola)
para todos v ∈ adyacencia[u] hacer
si distancia[v] > distancia[u] + peso (u, v) hacer
distancia[v] = distancia[u] + peso (u, v)
padre[v] = u
adicionar(cola,(v,distancia[v]))

Sin cola de prioridad

función Dijkstra (Grafo G, nodo_salida s)


//Usaremos un vector para guardar las distancias del nodo salida al r
esto entero distancia[n]
//Inicializamos el vector con distancias iniciales booleano visto[n
]
//vector de boleanos para controlar los vertices de los que ya tenem
os la distancia mínima
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 número 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 función
import pygtk
pygtk.require('2.0')
import gtk

class HelloWorld:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.button = gtk.Button("Hello World")
self.button.connect("clicked", self.say_hello, None)
self.window.add(self.button)
self.button.show()
self.window.show()

def main(self):
gtk.main()

def say_hello(self, widget, data=None):


print "Hello World"

hello = HelloWorld()
hello.main()

APLICACIÓN DEL ALGORITMO DE DIJKSTRA PARA EL TRABAJO FINAL:

1) Distribución de productos a una red de establecimientos comerciales.


2) Distribución de correos postales.
 Edsger W. Dijkstra nació en Rotterdam. Su padre, quien fuera Presidente de la
Sociedad Holandesa de Química, había aprendido química durante la secundaria y
más tarde de su superintendente. Su madre era matemática, pero nunca tuvo un
trabajo formal.12
 Dijkstra siempre había considerado emprender una carrera en Derecho y representar
a los Países Bajos en las Naciones Unidas. Sin embargo, tras graduarse en la escuela
en 1948, bajo la dirección de sus padres estudió matemáticas y física, y finalmente
pasó a estudiar Física teórica en la Universidad de Leiden.3 Más tarde trabajó como
investigador para Burroughs Corporation a principios de los años 1970. En la
Universidad de Texas en Austin, Estados Unidos, ocupó el Schlumberger
Centennial Chair in Computer Sciences. En 1965 dio lugar al primer paper en el
campo de la computación concurrente y la programación concurrente.4 Entre sus
contribuciones a las ciencias de la computación está la la solución del problema del
camino más corto, también conocido como el algoritmo de Dijkstra, la notación
polaca inversa y el relacionado algoritmo shunting yard, THE multiprogramming
system, el algoritmo del banquero y la construcción del semáforo para coordinar
múltiples procesadores y programas. Otro concepto debido a Dijkstra, en el campo
de la computación distribuida, es el de la auto-estabilización, una vía alternativa
para garantizar la confiabilidad del sistema. El algoritmo de Dijkstra es usado en la
ruta más corta primero (SPF) que es usado en el protocolo de enrutamiento Open
Shortest Path First (OSPF). También se le debe la autoría de la expresión «Crisis
del software», aparecida en su libro The Humble Programmer y usada ampliamente
en la famosa reunión de la OTAN de 1968 sobre desarrollo del software. Recibió el
Premio Turing en 1972.
 Era conocido por que alertó sobre los peligros de la sentencia GOTO en la
programación, que culminó en 1968 con la carta al editor que se publicó con el
título Go To Statement Considered Harmful (La sentencia Goto considerada
perjudicial), visto como un paso importante hacia el rechazo de la expresión GOTO
y de su eficaz reemplazo por estructuras de control tales como el bucle while. El
famoso título del artículo no era obra de Dijkstra, sino de Niklaus Wirth, entonces
redactor de Comunicaciones del ACM. Dijkstra era un aficionado bien conocido de
ALGOL, y trabajó en el equipo que desarrolló el primer compilador para este
lenguaje. En ese mismo año creó el primer sistema operativo con estructura
jerárquica, de niveles o capas. Fue denominado THE (Technische Hogeschool,
Eindhoven) que se utilizó con fines didácticos.
 Desde los años 1970, el principal interés de Dijkstra fue la verificación formal. La
opinión que prevalecía entonces era que uno debe primero escribir un programa y
seguidamente proporcionar una prueba matemática de su corrección. Dijkstra objetó
que las pruebas que resultan son largas e incómodas, y que la prueba no da ninguna
comprensión de cómo se desarrolló el programa. Un método alternativo es la
derivación de programas, «desarrollar prueba y programa conjuntamente». Uno
comienza con una especificación matemática del programa que se supone va a hacer
y aplica transformaciones matemáticas a la especificación hasta que se transforma
en un programa que pueda ser ejecutado. El programa que resulta entonces es
sabido correcto por la construcción. Muchos de los últimos trabajos de Dijkstra
tratan sobre las maneras de hacer fluida la argumentación matemática.
 Respecto a su carácter árido y ácido, conocidas son su oposición a la instrucción
GOTO y al lenguaje BASIC («mutila la mente más allá de toda recuperación»).
Alan Kay expuso que5 en informática, la arrogancia se mide en nanodijkstras.
 Dijkstra murió el 6 de agosto de 2002 después de una larga lucha contra el cáncer.

You might also like