algoritmo de dijkstra
Post on 19-Jul-2015
374 Views
Preview:
TRANSCRIPT
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
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).
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
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
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)
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
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
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;
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)
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
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
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:
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
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
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
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
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
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) );
}
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:
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
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.
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.
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
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.
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.
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”.
5/16/2018 Algoritmo de Dijkstra - slidepdf.com
http://slidepdf.com/reader/full/algoritmo-de-dijkstra-55ab587ac1982 27/27
E.W.Dijkstra
top related