You are on page 1of 27

Algoritmo de Dijkstra

Algoritmo de Dijkstra

Ejecucin del algoritmo de Dijkstra Tipo Algoritmo de bsqueda

Problema que Problema del camino ms corto resuelve Estructura de Grafo datos Creador Fecha Clase de complejidad Edsger Dijkstra 1959 P

Tiempo de ejecucin Peor caso


El algoritmo de Dijkstra, tambin llamado algoritmo de caminos mnimos, es unalgoritmo para la determinacin del camino ms corto dado un vrtice origen al resto de vrtices 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 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).

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. 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 un montculo). Podemos estimar la complejidad computacional del algoritmo de Dijkstra (en trminos de sumas y

comparaciones). El algoritmo realiza a lo ms n-1 iteraciones, ya que en cada iteracin se aade un vrtice al conjunto distinguido. Para estimar el nmero total de operaciones basta estimar el nmero de operaciones que se llevan a cabo en cada iteracin. Podemos identificar el vrtice con la menor etiqueta entre los que no estn en Sk realizando n-1 comparaciones o menos. Despus hacemos una suma y una comparacin para actualizar la etiqueta de cada uno de los vrtices que no estn en Sk. Por tanto, en cada iteracin se realizan a lo sumo 2(n-1) operaciones, ya que no puede haber ms de n-1 etiquetas por actualizar en cada iteracin. Como no se realizan ms de n-1 iteraciones, cada una de las cuales supone a lo ms 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 ms corto entre dos vrtices de un grafo ponderado simple, conexo y no dirigido con n vrtices. [editar]Pseudocdigo

Estructura de datos auxiliar: Q = Estructura de datos Cola de prioridad (se puede implementar con un montculo)

DIJKSTRA (Grafo G, nodo_fuente s) para u V[G] hacer distancia[u] = INFINITO padre[u] = NULL distancia[s] = 0 adicionar (cola, (s,distance[s])) mientras que cola no es vaca 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

versin en pseudocdigo sin cola de prioridad


funcin Dijkstra (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 Al final tenemos en el vector distancia en cada posicin la distancia mnima del vertice salida a otro vertice cualquiera. [editar]Implementacin [editar]C++ // Declaraciones en el archivo .h int cn; //cantidad de nodos vector< vector<int> > ady; //matriz de adyacencia deque<int> path; // camino minimo de dijkstra int caminosPosibles; // cantidad de caminos posibles vector<int> dijkstra(int nodo, int final = 0); // el parmetro 'final' es opcional

// Devuelve un vector con las distancias minimas del nodo inicial al resto de los vertices. // Guarda en path los nodos que forman el camino minimo y muestra la cantidad de 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 infinito y marco todos los nodos como no visitados for(int i = 0; i < cn; i++){ distancias.push_back(INF); noVisitados.push_back(i); } // Actual es el nodo inicial y la distancia a si mismo es 0 int actual = inicial; distancias[inicial] = 0;

// Inicializo el camino minimo en infinito. path = deque<int>(cn, INF); while(!noVisitados.empty()){ // Para cada nodo no visitado, calculo la distancia tentativa al nodo actual; // si es menor que la distancia seteada, 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 nodo inicial se conecta con *itList path[*itList] = actual; } else if(distancias[*itList] == dt && *itList == final)

caminosPosibles++; } // Marco como visitado el nodo actual, la distancia seteada es la minima. noVisitados.remove(actual); // Si no lo pase como parametro final vale -1, en ese caso el if nunca da true. if(actual == final) break; // El nodo actual ahora es el nodo no visitado que tiene la menor distancia 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 parmetro obtengo el camino minimo y lo guardo en path

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

Camino mnimo final


Hay diferentes algoritmos para hallar un camino de longitud mnima entre dos vrtices de un grafo ponderado. Presentaremos un algoritmo descubierto por el matemtico holands Edsger Dijkstra en 1959. La versin que descubriremos resuelve este problema para grafos ponderados no dirigidos si todos los pesos son positivos. Este algorimo puede adaptarse fcilmente para resolver problemas de caminos de longitud mnima 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]Ejemplo
El siguiente ejemplo se desarrollar con el fin de encontrar el camino ms cortodesde a hasta z:

Leyenda:

Rojo: Aristas y vrtices pertenecientes a la solucin momentnea. Azul: Aristas y vrtices candidatos.

[editar]Paso

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

[editar]Paso

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

[editar]Paso

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

[editar]Paso

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:17

[editar]Paso

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 enterior, es: Solucin momentnea:

Camino: ADCBF Distancia:19

[editar]Paso

En el penltimo paso, vuelve a aparecer otro candidato: el vrtice e, pero esta vez a travs del vrtice f. De todas formas, el camino mnimo vuelve a cambiar para retomar el camino que vena siguiendo en los pasos anteriores: Solucin momentnea:

Camino: ADCBFE Distancia:18

[editar]Paso

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

Grafos: Algoritmo de Dijkstra


El algoritmo de dijkstra determina la ruta ms corta desde un nodo origen s hacia los dems nodos, las distancias se almacenan en un vector D. Bsicamente, el algoritmo toma en la i-sima iteracin 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 ms 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 mnima 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 todava 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 implementacin
A continuacin 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 dems 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

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) ); }

} } 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 informacin: 5 1 1 2 3 3 4 6 2 3 4 4 5 5

3 10 5 6 15 4

correspondiente al siguiente grafo:

La salida del programa fue, en la salida el primer nmero es el nodo y el valor entre parntesis 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 Nacimiento

Edsger Wybe Dijkstra 11 de mayo de 1930 Rotterdam, Pases Bajos

Fallecimiento

6 de agosto de 2002, 72 aos Nuenen, Pases Bajos holands Cientfico de la Computacin, fsico Premio Turing en 1972
tsxr wib dkstra (?i)) (Rotterdam, Pases Bajos, 11 de

Nacionalidad Ocupacin Premios

Edsger Wybe Dijkstra (AFI:

mayo de 1930 - Nuenen, Pases Bajos, 6 de agosto de 2002) fue un cientfico de la computacin de los Pases Bajos.

[editar]Biografa
Dijkstra estudi fsica terica en la Universidad de Leiden. Trabaj como investigador paraBurroughs Corporation a principios de los aos 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 computacin est la solucin del problema del camino ms corto, tambin conocido como el algoritmo de Dijkstra, la notacin polaca inversa y el relacionado algoritmo shunting yard, THE multiprogramming system, elalgoritmo del banquero y la construccin del semforo para coordinar mltiples procesadores y programas. Otro concepto debido a Dijkstra, en el campo de lacomputacin distribuida, es el de la auto-estabilizacin, una va alternativa para garantizar la confiabilidad del sistema. El algoritmo de Dijkstra es usado en la ruta ms corta primero(SPF) que es usado en el protocolo de enrutamiento Open Shortest Path First (OSPF). Tambin se le debe la autora de la expresin "Crisis del software", aparecida en su libro The Humble Programmer y usada ampliamente en la famosa reunin de la OTAN de 1968sobre desarrollo del software. Recibi el Premio Turing en 1972. Era conocido por su baja opinin de la sentencia GOTO en programacin, que culmin en 1968 con el artculo Go To Statement Considered Harmful (La sentencia Goto considerada perjudicial), visto como un paso importante hacia el rechazo de la expresin GOTO y de su eficaz reemplazo por estructuras de control tales como el bucle while. El famoso ttulo del artculo 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 ao cre el primer sistema operativo con estructura jerrquica, de niveles o capas. Fue denominado THE (Technische Hogeschool, Eindhoven) que se utiliz con fines didcticos.

Desde los aos 1970, el principal inters de Dijkstra fue la verificacin formal. La opinin que prevaleca entonces era que uno debe primero escribir un programa y seguidamente proporcionar una prueba matemtica de su correccin. Dijkstra objet que las pruebas que resultan son largas e incmodas, y que la prueba no da ninguna comprensin de cmo se desarroll el programa. Un mtodo alternativo es laderivacin de programas, desarrollar prueba y programa conjuntamente. Uno comienza con una especificacin matemtica del programa que se supone va a hacer y aplica transformaciones matemticas a la especificacin hasta que se transforma en un programa que pueda ser ejecutado. El programa que resulta entonces es sabido correcto por la construccin. Muchos de los ltimos trabajos de Dijkstra tratan sobre las maneras de hacer fluida la argumentacin matemtica. Respecto a su carcter rido y cido, conocidas son su oposicin a la instruccin GOTO y al lenguaje BASIC ("mutila la mente ms all de toda recuperacin"). Alan Kay expuso que "en informtica, la arrogancia se mide en nanodijkstras". Dijkstra muri el 6 de agosto de 2002 despus de una larga lucha contra el cncer.

Biografa de Edsger Wybe Dijkstra

El esfuerzo de utilizar las mquinas para emular el pensamiento humano siempre me ha parecido bastante estpido. Preferira 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 ms. Su padre era professor de fisica en la escuela secundaria de Rotterdam, mientras que su madre era matemtica. De joven, asisti a la escuela secundaria de Rotterdam. Djikstra quera estudiar Derecho y asi poder representar a los Paises Bajos en las Naciones Unidas. Pero, en 1948 realiz los exmenes finales de su etapa en la escuela secundaria y sac notas excelentes en matematicas, fsica, qumica y biologa, y tanto sus padres como sus profesores intentaron persuadirle para que se decantara por una carrera de ciencias. Finalmente, decidi estudiar fsica terica en la universidad de Leyden.

Tres aos despus, en 1951, Dijkstra vio un anuncio de la Universidad de Cambridge sobre un curso de tres semanas que trataba la programacin en computadores. Se interes mucho por este curso y decidi apuntarse, ya que lo vea como una oportunidad esta actividad, que consideraba muy ligada a su campo, la fsica terica.

Fue una experiencia espantosa: era la primera vez que sala de los Pases 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 Computacin del Centro Matemtico en Amsterdam, haba hecho el mismo curso en Cambridge en el ao anterior y cuando se enter de que Dijkstra haba terminado, le ofreci un puesto como programador del Centro de Matemticas. Dijkstra acept el cargo desde marzo de 1952, pero slo como una posicin a tiempo parcial, ya que segua siendo estudiante de fsica terica en la Universidad de Leyden. A pesar de esto, Dijkstra empezaba a decantarse ms por la programacin que por la fsica

teorica, ya que le supona un reto mayor, al ser una rama del saber prcticamente nueva, con mucho por descubrir. Despus de haber tomado la decisin, Dijkstra complet sus estudios en fsica terica en la universidad, gradundose en 1956. Tambin en 1956, el Centro de Matemticas de Amsterdam, en el que trabajaba complet la construccin de una nueva computadora y quera hacer una demostracin pblica. Para ello, Dijkstra, plante el problema de encontrar el camino mas corto entre dos ciudades de los Pases Bajos. Public su algoritmo, muy eficaz, que ha perdurado hasta nuestros das, y conocido popularmente como el algoritmo de Djikstra (o algoritmo de caminos mnimos). La idea de 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. Tambin en 1959 fue galardonado con el doctorado de la Universidad de Amsterdam por su tesis La comunicacin con un equipo automtico. Como curiosidad, destacar que en 1957 se cas con Mara 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 profesin para los registros, por lo que tuvo que decir que era fsico terico en el formulario. Dijkstra tambin colabor con el equipo de desarrollo del lenguaje de programacin ALGOL-60. Hizo varias contribuciones importantes: la introduccin explcita de la recursividad y la nocin de pila. Dijkstra, junto con uno de sus colegas en el Centro de Matemticas, escribi el primer compilador de ALGOL-60, que se complet en agosto de 1960. Ejemplo de cdigo en ALGOL-60 procedure Absmax(a) Dimensiones: (i, k); (n, m) Resultado: (y)Subndices:

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.

Los subndices 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, adems de Ada y Pascal. En 1962 Dijkstra fue nombrado profesor de Matemticas en la Universidad de Tecnologa de Eindhoven. En este momento esta universidad no tenia Departamento de Informtica, asi que l construy un equipo de cientficos de la computacin en el departamento de Matemticas, y desarroll el sistema operativo THE (Technische Hogeschool te Eindhoven). Muchas de las funciones de este sistema operativo se han convertido en caractersticas estndar en todos los sistemas operativos futuros. Entre ellas destaca el concepto de deadlock (interbloqueo). Su solucin fue a travs de semforos y regiones de cdigo con acceso exclusivo. Dijkstra describi el problema con la cena de los famosos cinco filsofos que slo tenan cinco palillos para comer arroz. Si ellos no se ponan de acuerdo y tomaban un palillo cada uno, creaban un deadlock y moran de hambre pues se necesitaban dos palillos para comer. Esta es la base de la programacin concurrente y una parte fundamental de cualquier sistema operativo.

Dijkstra acuo personalmente el trmino crisis del software, y desde los aos 1970, el principal inters de Dijkstra fue laverificacin formal (encontrar una demostracin o prueba de correccin de un programa). La opinin que prevaleca entonces era que uno debe primero escribir un programa y seguidamente proporcionar una prueba matemtica de su correccin. Dijkstra objet que las pruebas que resultan son largas e incmodas, y que la prueba no da ninguna comprensin de cmo se desarroll el programa. Un mtodo alternativo es la derivacin de programas, desarrollar prueba y programa conjuntamente. Uno comienza con una especificacin matemtica del programa que se supone va a hacer y aplica transformaciones matemticas a la especificacin hasta que se transforma en un programa que pueda ser ejecutado. El programa que resulta entonces es sabido correcto por la construccin. Muchos de los ltimos trabajos de Dijkstra tratan sobre las maneras de hacer llevadera la argumentacin matemtica. En 1972 recibi el premio Turing, y su discurso fue publicado en un artculo 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 ao 2002 en Nuenen, Holanda, tras una larga enfermedad de cncer. Si en 10 aos ms, cuando ustedes estn haciendo algo rpido 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 sera suficiente inmortalidad para mi.

E.W.Dijkstra

You might also like