Algoritmo de Dijkstra

27
 Algoritmo de Dijkstra Algoritmo de Dijkstra Ejecución del algoritmo de Dijkstra Tipo Algoritmo de búsqueda Problema que resuelve Problema del camino más cortoEstructura de datos Grafo Creador Edsger Dijkstra Fecha 1959 Clase de complejidad P

Transcript of Algoritmo de Dijkstra

Page 1: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 1/27

Algoritmo de Dijkstra

Algoritmo de Dijkstra

Ejecución del algoritmo de Dijkstra

Tipo Algoritmo de

búsqueda

Problema queresuelve

Problema del

camino más corto 

Estructura dedatos

Grafo

Creador Edsger Dijkstra

Fecha 1959

Clase de

complejidad

P

Page 2: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 2/27

Tiempo de ejecución

Peor caso 

El algoritmo de Dijkstra, también llamado algoritmo de caminos mínimos, es unalgoritmo 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.

La idea subyacente en este algoritmo consiste en ir explorando todos los caminos más cortos que

parten del vértice origen y que llevan a todos los demás vértices; cuando se obtiene el camino más corto

desde el vértice origen, al resto de vértices que componen el grafo, el algoritmo se detiene. El algoritmo

es una especialización de la búsqueda 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

búsqueda nodos que en próximas iteraciones bajarían el costo general del camino al pasar por una

arista con costo negativo).

Algoritmo

Teniendo un grafo dirigido ponderado de N nodos no

aislados, sea x el nodo inicial, un vector D de tamaño

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

sería 0.

2. Sea a = x (tomamos a como nodo actual).

Page 3: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 3/27

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 próximo 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.

Una vez terminado al algoritmo, D estarácompletamente lleno.

[editar]Complejidad

Orden de complejidad del algoritmo: O (|V |2+|E|)

= O (|V |2) sin utilizar cola de prioridad, O ((|E |+|V |) log

|V |) utilizando cola de prioridad (por ejemplo unmontículo).

Podemos estimar la complejidad computacional del

algoritmo de Dijkstra (en términos de sumas y

Page 4: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 4/27

comparaciones). El algoritmo realiza a lo más n-1

iteraciones, ya que en cada iteración se añade un

vértice al conjunto distinguido. Para estimar elnúmero total de operaciones basta estimar el número

de operaciones que se llevan a cabo en cada

iteración. Podemos identificar el vértice con la menor

etiqueta entre los que no están en Sk realizando n-1

comparaciones o menos. Después hacemos una

suma y una comparación para actualizar la etiquetade cada uno de los vértices que no están en Sk. Por

tanto, en cada iteración se realizan a lo sumo 2(n-1)

operaciones, ya que no puede haber más de n-1

etiquetas por actualizar en cada iteración. Como no

se realizan más de n-1 iteraciones, cada una de las

cuales supone a lo más 2(n-1) operaciones, llegamos

al siguiente teorema.

TEOREMA: El Algoritmo de Dijkstra realiza O(n2)

operaciones (sumas y comparaciones) para

determinar la longitud del camino más corto entre dos

vértices de un grafo ponderado simple, conexo y no

dirigido con n vértices.

[editar]Pseudocódigo

Page 5: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 5/27

  Estructura de datos auxiliar: Q = Estructura de

datos Cola de prioridad (se puede implementar con

un montículo)DIJKSTRA (Grafo G , nodo_fuente s)

 para u ∈ V[G] hacer distancia[u] = INFINITOpadre[u] = NULL

distancia[s] = 0adicionar (cola,

(s,distance[s])) mientras que cola no es vacía

hacer u = extraer_minimo(cola)

 para 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,distance[v ]))

[editar]Otra versión en pseudocódigo

sin cola de prioridad

función Dijkstra (Grafo G, nodo_salidas)

Page 6: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 6/27

//Usaremos un vector para guardar lasdistancias del nodo salida al restoentero distancia[n] //Inicializamos

el vector con distancias inicialesbooleano visto[n] //vector de

boleanos para controlar los vertices delos que ya tenemos 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 -1por ejemplo

Si_no distancia[w] = peso (s, w)

fin si fin para 

distancia[s] = 0visto[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 yque no este visto;visto[vertice] = cierto;

 para cada w ∈ sucesores (G,vertice) hacer 

Page 7: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 7/27

  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 

Al final tenemos en el vector distancia en cada

posición la distancia mínima del vertice salida a otro

vertice cualquiera.

[editar]Implementación

[editar]C++ // Declaraciones en el archivo .h int cn; //cantidad de nodos vector< vector<int> > ady; //matriz deadyacencia deque<int> path; // camino minimo dedijkstra int caminosPosibles; // cantidad de

caminos posibles 

vector<int> dijkstra(int nodo, int final = 0); // el parámetro 'final' esopcional 

Page 8: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 8/27

 // Devuelve un vector con lasdistancias minimas del nodo inicial al

resto de los vertices. // Guarda en path los nodos que formanel camino minimo y muestra la cantidadde caminos posibles vector<int> Grafo :: dijkstra(int inicial, int final){ 

vector<int> distancias; list<int> noVisitados; list<int> :: iterator itList; 

caminosPosibles = 0; 

//decremento para manejarme en [0,cn) 

inicial--; final--; 

// Seteo las distancias en infinitoy marco todos los nodos como novisitados 

for(int i = 0; i < cn; i++){ distancias.push_back(INF); noVisitados.push_back(i); 

// Actual es el nodo inicial y ladistancia a si mismo es 0 

int actual = inicial; distancias[inicial] = 0; 

Page 9: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 9/27

 // Inicializo el camino minimo en

infinito. 

path = deque<int>(cn, INF); 

while(!noVisitados.empty()){ // Para cada nodo no visitado,

calculo la distancia tentativa al nodoactual; 

// si es menor que la distanciaseteada, la sobreescribo. 

for(itList = noVisitados.begin(); itList != noVisitados.end(); itList++){ 

// distancia tentativa =distancia del inicial al actual +distancia del actual al noVisitado 

int dt = distancias[actual] 

+ ady[actual][*itList]; if(distancias[*itList] > 

dt){ distancias[*itList] = 

dt; 

// Agrego a camino el

nodo (actual) a traves del cual el nodoinicial se conecta con *itList 

path[*itList] = actual; } else if(distancias[*itList] 

== dt && *itList == final) 

Page 10: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 10/27

caminosPosibles++; 

// Marco como visitado el nodoactual, la distancia seteada es laminima. 

noVisitados.remove(actual); 

// Si no lo pase como parametrofinal vale -1, en ese caso el if nuncada true. 

if(actual == final) break; 

// El nodo actual ahora es elnodo no visitado que tiene la menordistancia al nodo inicial. 

int min = INF; for(itList = 

noVisitados.begin(); itList != noVisitados.end(); itList++) 

if(min >= distancias[*itList]){ 

min = distancias[*itList]; 

actual = *itList; 

} } 

// Si final vino como parámetroobtengo el camino minimo y lo guardo enpath 

Page 11: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 11/27

  if(final != -1){ deque<int> temp; int nodo = final; 

while(nodo != inicial){ temp.push_front(nodo); nodo = path[nodo]; 

path = temp; 

if(ady[inicial][final] != INF) caminosPosibles++; 

cout << "Caminos Posibles " << caminosPosibles << endl; 

} return distancias; 

} Anexo:Ejemplo de Algoritmo de Dijkstra

Grafo inicial

Page 12: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 12/27

 

Camino mínimo final

Hay diferentes algoritmos para hallar un camino de longitud mínima entre dos vértices de un grafo

ponderado. Presentaremos un algoritmo descubierto por el matemático holandés Edsger Dijkstra en

1959. La versión que descubriremos resuelve este problema para grafos ponderados no dirigidos si

todos los pesos son positivos. Este algorimo puede adaptarse fácilmente para resolver problemas de

caminos de longitud mínima en grafo dirigidos.

A este algoritmo se le llama Algoritmo de Dijkstra: 

Contenido

[ocultar] 

1 Ejemplo o  1.1 Paso 1 

o  1.2 Paso 2 

o  1.3 Paso 3 

o  1.4 Paso 4 

o  1.5 Paso 5 

o  1.6 Paso 6 

o  1.7 Paso 7 

[editar]EjemploEl siguiente ejemplo se desarrollará con el fin de encontrar el camino más cortodesde a hasta z:

Page 13: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 13/27

 

Leyenda:  

  Rojo: Aristas y vértices pertenecientes a la solución momentánea.

  Azul: Aristas y vértices candidatos.

[editar]Paso 1

En este primer paso, podemos apreciar que hay tres candidatos: Los vértices b, c y d. En este caso,

hacemos el camino desde el vértice a, hasta el vértice d, ya que es el camino más corto de los tres.

Solución momentánea:  

  Camino: AD

  Distancia:5

[editar]Paso 2

Page 14: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 14/27

 

Ahora, vemos que se añade un nuevo candidato, el vértice e, y el vértice c, pero esta vez a través del d.

Pero el camino mínimo surge al añadir el vértice c.

Solución momentánea:  

  Camino: ADC

  Distancia:9

[editar]Paso 3

En este paso no se añade ningún candidato más puesto que el último vértice es el mismo que en el

paso anterior. En este caso el camino mínimo hallado es el siguiente:

Solución momentánea:  

  Camino: ADCB

  Distancia:11

Page 15: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 15/27

[editar]Paso 4

Como podemos comprobar, se han añadido dos candidatos nuevos, los vértices f y g, ambos a través

del vértice b. El mínimo camino hallado en todo el grafo hasta ahora es el siguiente:

Solución momentánea:  

  Camino: ADCBF

  Distancia:17

[editar]Paso 5

En este antepenúltimo paso, se añaden tres vértices candidatos, los vértices g, z y e. Este último ya

estaba pero en esta ocasión aparece a través del vértice f. En este caso el camino mínimo, que cambia

un poco con respecto al enterior, es:

Solución momentánea:  

  Camino: ADCBF

  Distancia:19

Page 16: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 16/27

[editar]Paso 6

En el penúltimo paso, vuelve a aparecer otro candidato: el vértice e, pero esta vez a través del vértice f.

De todas formas, el camino mínimo vuelve a cambiar para retomar el camino que venía siguiendo en los

pasos anteriores:

Solución momentánea:  

  Camino: ADCBFE

  Distancia:18

[editar]Paso 7

Por fin, llegamos al último paso, en el que sólo se añade un candidato, el vértice z a través del e. Elcamino mínimo y final obtenido es:

Solución Final:  

  Camino: ADCBFEZ

  Distancia:23

Page 17: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 17/27

Grafos: Algoritmo de Dijkstra

El algoritmo de dijkstra determina la ruta más corta desde un nodo origen s hacia los

demás nodos, las distancias se almacenan en un vector D. Básicamente, el algoritmo toma

en la i-ésima iteración al nodo que tiene la menor distancia, Vi, y ve si es posible disminuir

la distancia de sus nodos adyacentes, para hacerlo se verifica si la distancia hasta Vi más el

costo para ir de i al nodo adyacente, w(i,j), es menor a la distancia actual en el nodo

adyacente.

int[] Dijkstra(Grafo g, Nodo s) Construir un arreglo D[] con una celda por cada nodo en g;Hacer D[s] = 0 donde s es el nodo inicial;Hacer D[u] = infinito para todos los nodos u excepto el inicial;Construir una cola de prioridad mínima PQ que contenga cada nodo

n, con D[n] como su prioridad;while PQ no sea vacia hacer:

Vi = P.removeMinElement();para cada vertice Vj todavía en PQ adyacente a Vi hacer:if D[Vi] + w(Vi, Vj) < D[Vj] entonces:D[Vj] = D[Vi] + w(Vi, Vj);

Regresar D;

Ejemplo de implementación

A continuación se muestra un programa en el que se usa el algoritmo de dijkstra para

calcular la menor distancia desde cada uno de los nodos hacia los demás nodos.

#include <cstdio> #include <queue> #include <cstring> 

using namespace std;

#define INF 999 #define MAXN 100

// los nodos en el grafo van de 1 a n int C[MAXN][MAXN], // matriz de adyacencia, 0 si no estan

conectados // costo para ir de i a j si estan

conectados n, // numero de nodos e; // numero de aristas 

Page 18: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 18/27

void iniGrafo() { for (int i=1; <=n; i++) memset(&C[i][1], 0, n * sizeof(int));

void insertanodo(int a, int b, int c) { C[a][b] = C[b][a] = c;

int D[MAXN]; /* distancias minima desde s al nodo i

*/  int padre[MAXN]; /* ruta hacia el nodo i desde s */  int permanente[MAXN]; /* verdadero al tener la menor ruta al

nodo i */  

void dijkstra(int s) { priority_queue< pair<int,int> > pq;pair <int,int> nodotmp;int Vi, Vj;

// inicializacion for (int i=1; i<=n; i++) D[i] = INF,padre[i] = -1,permanente[i] = false;

// inicializacion del nodo inicial D[s] = 0;pq.push( pair <int,int> (D[s], s) );// calculamos las distancias while( !pq.empty() ) { nodotmp = pq.top(); pq.pop();Vi = nodotmp.second;if ( !permanente[Vi] ) { permanente[Vi] = true;

for (Vj = 1; Vj <= n; Vj++) if ( !permanente[Vj] && C[Vi][Vj] > 0 && D[Vi] +

C[Vi][Vj] < D[Vj] ) D[Vj] = D[Vi] + C[Vi][Vj],padre[Vj] = Vi,pq.push( pair <int,int> (-D[Vj], Vj) );

Page 19: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 19/27

  } } 

void imprimeGrafo(int n) { 

for (int i=1; i<=n; i++) printf("%d(%d) ", i, D[i]);printf("\n");

main() { int a, b, c;

// leemos el numero de nodos y aristas scanf("%d%d", &n, &e);// inicializamos el grafo iniGrafo();// leemos las aristas for (int i=0; i<e; i++) scanf("%d%d%d", &a, &b, &c),insertanodo(a, b, c);

// usamos dijkstra para calcular la menor distancia // desde el i-esimo nodo hacia los demas for (int i=1; i<=n; i++) dijkstra( i ),printf("La menor distancia desde el nodo %d" 

" hacia los otros nodos es:\n", i),

imprimeGrafo( n ),printf("\n");

Como entrada para el programa anterior se introdujo la siguiente información:

5 61 2 31 3 10

2 4 53 4 6

3 5 154 5 4 

correspondiente al siguiente grafo:

Page 20: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 20/27

La salida del programa fue, en la salida el primer número es el nodo y el valor entre

paréntesis es la distancia:

La menor distancia desde el nodo 1 hacia los otros nodos es:1(0) 2(3) 3(10) 4(8) 5(12) 

La menor distancia desde el nodo 2 hacia los otros nodos es:1(3) 2(0) 3(11) 4(5) 5(9)

La menor distancia desde el nodo 3 hacia los otros nodos es:1(10) 2(11) 3(0) 4(6) 5(10)

La menor distancia desde el nodo 4 hacia los otros nodos es:1(8) 2(5) 3(6) 4(0) 5(4)

La menor distancia desde el nodo 5 hacia los otros nodos es:

1(12) 2(9) 3(10) 4(4) 5(0)

Edsger Dijkstra

Edsger Dijkstra

Edsger Dijkstra en 2002.

Nombre Edsger Wybe Dijkstra

Nacimiento 11 de mayo de 1930 

Rotterdam, Países Bajos 

Page 21: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 21/27

Fallecimiento 6 de agosto de 2002, 72 años

Nuenen, Países Bajos 

Nacionalidad holandés  

Ocupación Científico de la Computación, físico 

Premios Premio Turing en 1972 

Edsger Wybe Dijkstra (AFI:  ˈɛtsxər ˈwibə ˈdɛɪkstra (?·i)) (Rotterdam, Países Bajos, 11 de

mayo de 1930 - Nuenen, Países Bajos, 6 de agosto de 2002) fue un científico de la computación de

los Países Bajos. 

[editar]BiografíaDijkstra estudió física teórica en la Universidad de Leiden. Trabajó como investigador paraBurroughs 

Corporation  a principios de los años 1970. En la Universidad de Texas enAustin, Estados Unidos, ocupó

el Schlumberger Centennial Chair in Computer Sciences . Se retiró en 2000. 

Entre sus contribuciones a las ciencias de la computación está 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 , elalgoritmo 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 lacomputació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 1968sobre desarrollo del

software. Recibió el Premio Turing en 1972. 

Era conocido por su baja opinión de la sentencia GOTO en programación, que culminó en 1968 con el

artículo 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.

Page 22: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 22/27

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

laderivació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 que "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. 

Biografía de Edsger Wybe Dijkstra

“El esfuerzo de utilizar las máquinas para emular el pensamiento humano

siempre me ha parecido bastante estúpido. Preferiría usarlas para emular 

algo mejor.”  E.W.Dijkstra. 

Edsger Wybe Dijkstra (1930 – 2002) nació en 1930 en Rotterdam, Holanda.

Era hijo de Wybe Douwe Dijkstra y Brechtje Cornelia Kruyper, y tenia tres

hermanos más. Su padre era professor de fisica en la escuela secundaria de

Rotterdam, mientras que su madre era matemática.

De joven, asistió a la escuela secundaria de Rotterdam. Djikstra quería

estudiar Derecho y asi poder representar a los Paises Bajos en las NacionesUnidas. Pero, en 1948 realizó los exámenes finales de su etapa en la

escuela secundaria y sacó notas excelentes en matematicas, física, química

y biología, y tanto sus padres como sus profesores intentaron persuadirle

para que se decantara por una carrera de ciencias. Finalmente, decidió

estudiar física teórica en la universidad de Leyden.

Page 23: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 23/27

Tres años después, en 1951, Dijkstra vio un anuncio de la Universidad de

Cambridge sobre un curso de tres semanas que trataba la programación en

computadores. Se interesó mucho por este curso y decidió apuntarse, ya

que lo veía como una oportunidad esta actividad, que consideraba muy

ligada a su campo, la física teórica.

 “Fue una experiencia espantosa: era la primera vez que salía de los Países

Bajos, la primera vez que tuve que entender a la gente de habla inglesa y 

de inmediato me vi, tratando de seguir un curso sobre un tema totalmente

nuevo. Pero me gustó mucho.”  

Aad van Wijngaarden, que era el director del Departamento de Ciencia de

la Computación del Centro Matemático en Amsterdam, había hecho el

mismo curso en Cambridge en el año anterior y cuando se enteró de queDijkstra había terminado, le ofreció un puesto como programador del

Centro de Matemáticas. Dijkstra aceptó el cargo desde marzo de 1952,

pero sólo como una posición a tiempo parcial, ya que seguía siendo

estudiante de física teórica en la Universidad de Leyden. A pesar de esto,

Dijkstra empezaba a decantarse más por la programación que por la física

Page 24: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 24/27

teorica, ya que le suponía un reto mayor, al ser una rama del saber

prácticamente nueva, con mucho por descubrir.

Después de haber tomado la decisión, Dijkstra completó sus estudios en

física teórica en la universidad, graduándose en 1956. También en 1956, el

Centro de Matemáticas de Amsterdam, en el que trabajaba completó la

construcción de una nueva computadora y quería hacer una demostración

pública. Para ello, Dijkstra, planteó el problema de encontrar el camino mas

corto entre dos ciudades de los Países Bajos. Publicó su algoritmo, muy

eficaz, que ha perdurado hasta nuestros días, y conocido popularmente

como “el algoritmo de Djikstra” (o algoritmo de caminos mínimos). La idea

de este algoritmo consiste en ir explorando todos los caminos más cortos

que parten del vértice origen y que llevan a todos los demás vértices;

cuando se obtiene el camino más corto desde el vértice origen, al resto de

vértices que componen el grafo, el algoritmo se detiene.

También en 1959 fue galardonado con el doctorado de la Universidad de

Amsterdam por su tesis La comunicación con un equipo automático. 

Como curiosidad, destacar que en 1957 se casó con María Debets , y tuvo

dos hijos y una hija. Sin embargo, tuvo un problema en su boda porque el

Juez de Paz no aceptaba “programador” como profesión para los registros,

por lo que tuvo que decir que era “físico teórico” en el formulario. 

Dijkstra también colaboró con el equipo de desarrollo del lenguaje de

programación ALGOL-60. Hizo varias contribuciones importantes: la

introducción explícita de la recursividad y la noción de „pila‟. Dijkstra, junto

con uno de sus colegas en el Centro de Matemáticas, escribió el primer

compilador de ALGOL-60, que se completó en agosto de 1960.

Ejemplo de código en ALGOL-60

procedure  Absmax (a) Dimensiones: (n, m) Resultado: (y )Subíndices:

(i , k );

value n, m; array a; integer n, m, i , k ; real y ;

comment De la matriz a se toma el elemento con el valor absoluto mayor

y se coloca en y.

Page 25: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 25/27

Los subíndices del elemento se colocan en i y k;

begin integer  p, q;

y := 0; i := k := 1;

for  p:= 1 step 1 until n do 

for q:= 1 step 1 until m do 

if  abs(a[ p, q]) > y  then 

begin y := abs(a[ p, q]);

i := p; k := q 

end 

end  Absmax  

Muy parecido a C, que fue uno de los sucesores de este lenguaje, además

de Ada y Pascal.

En 1962 Dijkstra fue nombrado profesor de Matemáticas en la Universidad

de Tecnología de Eindhoven. En este momento esta universidad no teniaDepartamento de Informática, asi que él construyó un equipo de científicos

de la computación en el departamento de Matemáticas, y desarrolló el

sistema operativo “THE” (Technische Hogeschool te Eindhoven). Muchas de

las funciones de este sistema operativo se han convertido en características

estándar en todos los sistemas operativos futuros. Entre ellas destaca el

concepto de “deadlock” (interbloqueo). Su solución fue a través de

semáforos y regiones de código con acceso exclusivo. Dijkstra describió el

problema con la cena de los famosos cinco filósofos que sólo tenían cinco

palillos para comer arroz. Si ellos no se ponían de acuerdo y tomaban unpalillo cada uno, creaban un deadlock y morían de hambre pues se

necesitaban dos palillos para comer. Esta es la base de la programación

concurrente y una parte fundamental de cualquier sistema operativo.

Page 26: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 26/27

 

Dijkstra acuño personalmente el término “crisis del software”, y desde los

años 1970, el principal interés de Dijkstra fue laverificación

formal (encontrar una demostración o prueba de corrección de un

programa). La opinión que prevalecía entonces era que uno debe primeroescribir 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 llevadera la

argumentación matemática.

En 1972 recibió el premio Turing, y su discurso fue publicado en un artículo

titulado “The Humble Programmer” (el programador humilde). 

En 1984 se le ofreció un puesto en el Burroughs Research Center de Austin,

Texas, donde permaneció hasta retirarse en 1999.

Finalmente murió en el año 2002 en Nuenen, Holanda, tras una largaenfermedad de cáncer.

“Si en 10 años más, cuando ustedes estén haciendo algo rápido y sucio,

repentinamente visualizan que yo estoy mirando por sobre sus hombros y 

se dicen a si mismos, – a Dijkstra no le hubiera gustado esto -, eso sería

suficiente inmortalidad para mi”. 

Page 27: Algoritmo de Dijkstra

5/16/2018 Algoritmo de Dijkstra - slidepdf.com

http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 27/27

E.W.Dijkstra