algoritmo dijkstra

Embed Size (px)

Citation preview

1) Determinar qu problema resuelve el algoritmo?El algoritmo de Dijkstra resuelve el problema para la determinacin delcamino ms cortodado unvrtice origen al resto de vrtices en ungrafocon pesos en cadaarista.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).2) Estructura de datos del algoritmo?Este algoritmo utiliza un tipo de estructura de colas llamado cola de prioridad. Una cola de prioridad es una estructura de datos en la que los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. 3) Cmo funciona el algoritmo 1- Seleccionamos el nodo no visitado con menor distancia acumulada( al iniciar, este ser siempre el nodo de inicio).2- Sumamos la distancia acumulada en dicho nodo con la distancia de las aristas a los nodos a los que podemos acceder. Comparamos la nueva distancia con la que tenamos acumulada en el nodo destino (en caso de tener ya alguna) y nos quedamos con la menor. 3- Marcamos el nodo actual como visitado y volvemos al paso 1.- Seguimiento pas a paso ejemplo.

4) Mostrar aplicaciones o usos del algoritmo. APLICACIN: El Algoritmo de Dijkstra realiza O(v2) 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, esto sin utilizar cola de prioridad. O((|E|+|V|) log |V|) utilizando cola de prioridad (por ejemplo un montculo).USO: Este algoritmo se usa bastante en redes de computadores, los nodos corresponden a routers y las aristas entre ellos las conexiones, a cada conexin se le asigna un costo (distancia) y de esta manera algunos protocolos de enrutamiento usan el algoritmo de Dijkstra para encontrar la mejor ruta entre nodos.

5) Mostrar cdigo fuente del algoritmo.

// Declaraciones en el archivo .h//Para usar Dijkstra, no tiene que haber aristas con peso negativo, por lo tanto//se puede tomar a infinito como -1const int INF = -1;int cn; //cantidad de nodosvector< vector > ady; //matriz de adyacenciadeque path; // camino mnimo de dijkstraint caminosPosibles; // cantidad de caminos posibles vector dijkstra(int nodo, int final = 0); // el parmetro 'final' es opcional // Devuelve un vector con las distancias mnimas del nodo inicial al resto de los vertices.// Guarda en path los nodos que forman el camino mnimo y muestra la cantidad de caminos posiblesvector Grafo :: dijkstra(int inicial, int final){ vector distancias; caminosPosibles = 0; //decremento para manejarme en [0, cn) // 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 mnimo en infinito. path = deque(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){ // Agrego a camino el nodo (actual) a travs 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 mnima. noVisitados.remove(actual); // Si no lo pase como parmetro 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 mnimo y lo guardo en path if(final != -1){ deque temp; int nodo = final; while(nodo != inicial){ temp.push_front(nodo); nodo = path[nodo]; } path = temp; if(ady[inicial][final] != INF) caminosPosibles++; cout