SlideShare una empresa de Scribd logo
1 de 9
¿EN QUE CONSISTE EL ALGORITMO DE DIJKSTRA?
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érticeorigen al resto de vértices en un grafo
con pesos en cada arista.
La idea de este algoritmo consiste en ir explorando todos los caminos más cortos que parten del vértice o
origen y que llevan o recorren a todos los demás vértices que lo componen.
Es cuando se obtiene el camino más corto desde el vértice y/o origen, al resto de los vértices que
componen el grafo.
PSEUDOCODIGO IMPLEMENTADO
// 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 -1 const int INF = -1; int cn; //
cantidad de nodos vector< vector<int> > ady; //
matriz de adyacencia deque<int> path; //
camino mínimo de dijkstra int caminosPosibles; //
cantidad de caminos posibles vector<int> dijkstra(int nodo, int final = 0); //
el parámetro 'final' es opcional //
Devuelve un vector con las distancias mínimas del nodo inicial al resto de los vértices. //
Guarda en path los nodos que forman el camino mínimo y muestra la cantidad de caminos posibles vector<int>
Grafo :: dijkstra(int inicial, int final)
vector<int> 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 mínimo 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){ //
Agrego a camino el nodo (actual) a través 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 mínima. noVisitados.remove(actual); //
Si no lo pase como parámetro 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 parámetro obtengo el camino mínimo 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; }
MATERIAL AUDIOVISUAL
http://www.youtube.com/watch?v=6rl0ghgPfK0&feature=player_detailpage
Ejercicio practico
COMPLEJIDAD
Podemos estimar la complejidad computacional del algoritmo de Dijkstra (en términos de sumas y
comparaciones). Para estimar el número total de operaciones basta estimar el número de
operaciones que se llevan a cabo en cada iteración.
Orden de complejidad del algoritmo:
O(|V|2+|E|) = O(|V|2) sin utilizar cola de prioridad,
O((|E|+|V|) log |V|) utilizandocola de prioridad.
APLICACIONES INFORMÁTICAS EN LAS CUALES SE IMPLEMENTA EL
ALGORITMO DE DIJKSTRA
Aplicadas en las tarjetas graficas NVIDIA
Las actuales unidades de procesamiento gráfico de NVIDIA disponen de una interfaz de
programación que permite utilizarlas para tareas de propósito general (GPGPU).
El objetivo de este algoritmo es acelerar la ejecución de algoritmos clásicos de
la teoría de grafos utilizando la interfaz de programación CUDA. Para ello, hemos
estudiado la formulación y posterior codificación de estos algoritmos en el modelo de
programación paralela de CUDA. En particular, los algoritmos estudiados son la búsqueda de
los caminos mínimos desde un único origen, la búsqueda del árbol de
recubrimiento mínimo y la búsqueda de todos los caminos mínimos entre pares de vértices.
Aplicada en IPHONE en la funcionalidad del GPS.
Calcular una ruta utilizando el algoritmo es suficientemente rápida como en un iPhone con datos de mapas
sin conexión. Se debe mantener la red de carreteras en la memoria y reutilización una vez cargado, el
enrutamiento incluso sobre un área grande como España o la mitad occidental de Canadá es prácticamente
instantáneo.
Toma datos de OpenStreetMap o elswhere y lo convierten en un dirigido gráfico, suponiendo (que es la
manera correcta de hacerlo según los que saben) que se unen los dos caminos compartiendo un punto con
el mismo ID. Asignar pesos a diferentes tipos de carreteras basados en la velocidad esperada, y si una parte
de una carretera es unidireccional crear sólo un único arco; dos vías carreteras obtienen dos arcos, uno en
cada dirección. Eso es prácticamente todo esto aparte de algún código de ad-hoc para evitar curvas
peligrosas y aplicación de restricciones de enrutamiento.

Más contenido relacionado

Destacado

Trastornos hipertensivos gestacionales. DR. FRANCISCOCRUZ T.
Trastornos hipertensivos gestacionales. DR. FRANCISCOCRUZ T.Trastornos hipertensivos gestacionales. DR. FRANCISCOCRUZ T.
Trastornos hipertensivos gestacionales. DR. FRANCISCOCRUZ T.DR FRANCISCO CRUZ TORRES
 
Transtornos hipertensivos gestacionales ANDREA PROAÑO VENEGAS
Transtornos hipertensivos gestacionales ANDREA PROAÑO VENEGASTranstornos hipertensivos gestacionales ANDREA PROAÑO VENEGAS
Transtornos hipertensivos gestacionales ANDREA PROAÑO VENEGASAndrea Proaño Venegas
 

Destacado (6)

Complicaciones preeclampsia severa
Complicaciones preeclampsia severaComplicaciones preeclampsia severa
Complicaciones preeclampsia severa
 
Ss 020 08_grr
Ss 020 08_grrSs 020 08_grr
Ss 020 08_grr
 
Cancer De Cervix.Powerpoint 7
Cancer De Cervix.Powerpoint 7Cancer De Cervix.Powerpoint 7
Cancer De Cervix.Powerpoint 7
 
Hipertensión en el embarazo
Hipertensión en el embarazoHipertensión en el embarazo
Hipertensión en el embarazo
 
Trastornos hipertensivos gestacionales. DR. FRANCISCOCRUZ T.
Trastornos hipertensivos gestacionales. DR. FRANCISCOCRUZ T.Trastornos hipertensivos gestacionales. DR. FRANCISCOCRUZ T.
Trastornos hipertensivos gestacionales. DR. FRANCISCOCRUZ T.
 
Transtornos hipertensivos gestacionales ANDREA PROAÑO VENEGAS
Transtornos hipertensivos gestacionales ANDREA PROAÑO VENEGASTranstornos hipertensivos gestacionales ANDREA PROAÑO VENEGAS
Transtornos hipertensivos gestacionales ANDREA PROAÑO VENEGAS
 

Similar a Análisis de algoritmos

Algoritmo de dijkstra
Algoritmo de dijkstraAlgoritmo de dijkstra
Algoritmo de dijkstraFANtochw
 
Diferencia entre algoritmo de path finding y algoritmo de dijkstra
Diferencia entre algoritmo de path finding y algoritmo de dijkstraDiferencia entre algoritmo de path finding y algoritmo de dijkstra
Diferencia entre algoritmo de path finding y algoritmo de dijkstranacasma
 
Claseeeeeeeeeeeeeeeeeessssssssssse_PA.pdf
Claseeeeeeeeeeeeeeeeeessssssssssse_PA.pdfClaseeeeeeeeeeeeeeeeeessssssssssse_PA.pdf
Claseeeeeeeeeeeeeeeeeessssssssssse_PA.pdfAbdias13
 
Tecnicas de Busqueda en IA
Tecnicas de Busqueda en IATecnicas de Busqueda en IA
Tecnicas de Busqueda en IAAlfredoAlejo1
 
Algoritmos de enrutamiento presentaciónnnnnnnnn
Algoritmos de enrutamiento presentaciónnnnnnnnnAlgoritmos de enrutamiento presentaciónnnnnnnnn
Algoritmos de enrutamiento presentaciónnnnnnnnnedwinjesus
 
Inteligencia Artificial - Leonys B
Inteligencia Artificial - Leonys BInteligencia Artificial - Leonys B
Inteligencia Artificial - Leonys BJose Andres
 
Algoritmo de enrutamiento
Algoritmo de enrutamientoAlgoritmo de enrutamiento
Algoritmo de enrutamientoRaul Nunez
 
Algoritmo de dijkstra tutorial interactivo
Algoritmo de dijkstra tutorial interactivoAlgoritmo de dijkstra tutorial interactivo
Algoritmo de dijkstra tutorial interactivohubapla
 
Ul rc_cap4_capa de red - encaminamiento ruteo
 Ul rc_cap4_capa de red - encaminamiento ruteo Ul rc_cap4_capa de red - encaminamiento ruteo
Ul rc_cap4_capa de red - encaminamiento ruteoc09271
 
2.5.3 Algoritmo de Dijkstra.pptx
2.5.3 Algoritmo de Dijkstra.pptx2.5.3 Algoritmo de Dijkstra.pptx
2.5.3 Algoritmo de Dijkstra.pptxFernando Solis
 
Móvil esquiva objetos
Móvil esquiva objetosMóvil esquiva objetos
Móvil esquiva objetosLucasPytel
 
Curso: Redes y comunicaciones básicas: 05 Algoritmos de enrutamiento
Curso: Redes y comunicaciones básicas: 05 Algoritmos de enrutamientoCurso: Redes y comunicaciones básicas: 05 Algoritmos de enrutamiento
Curso: Redes y comunicaciones básicas: 05 Algoritmos de enrutamientoJack Daniel Cáceres Meza
 

Similar a Análisis de algoritmos (20)

IO 2(REDES).pdf
IO 2(REDES).pdfIO 2(REDES).pdf
IO 2(REDES).pdf
 
Flujo en redes
Flujo en redesFlujo en redes
Flujo en redes
 
Algoritmo de dijkstra
Algoritmo de dijkstraAlgoritmo de dijkstra
Algoritmo de dijkstra
 
Algoritmo Dijkstra
Algoritmo DijkstraAlgoritmo Dijkstra
Algoritmo Dijkstra
 
Diferencia entre algoritmo de path finding y algoritmo de dijkstra
Diferencia entre algoritmo de path finding y algoritmo de dijkstraDiferencia entre algoritmo de path finding y algoritmo de dijkstra
Diferencia entre algoritmo de path finding y algoritmo de dijkstra
 
Dijkstra
DijkstraDijkstra
Dijkstra
 
Claseeeeeeeeeeeeeeeeeessssssssssse_PA.pdf
Claseeeeeeeeeeeeeeeeeessssssssssse_PA.pdfClaseeeeeeeeeeeeeeeeeessssssssssse_PA.pdf
Claseeeeeeeeeeeeeeeeeessssssssssse_PA.pdf
 
Algoritmos de enrolamiento
Algoritmos de enrolamientoAlgoritmos de enrolamiento
Algoritmos de enrolamiento
 
Tecnicas de Busqueda en IA
Tecnicas de Busqueda en IATecnicas de Busqueda en IA
Tecnicas de Busqueda en IA
 
Redes wan
Redes wanRedes wan
Redes wan
 
Algoritmos de enrutamiento presentaciónnnnnnnnn
Algoritmos de enrutamiento presentaciónnnnnnnnnAlgoritmos de enrutamiento presentaciónnnnnnnnn
Algoritmos de enrutamiento presentaciónnnnnnnnn
 
Inteligencia Artificial - Leonys B
Inteligencia Artificial - Leonys BInteligencia Artificial - Leonys B
Inteligencia Artificial - Leonys B
 
Taller 10
Taller 10Taller 10
Taller 10
 
Algoritmo de enrutamiento
Algoritmo de enrutamientoAlgoritmo de enrutamiento
Algoritmo de enrutamiento
 
Algoritmo a
Algoritmo aAlgoritmo a
Algoritmo a
 
Algoritmo de dijkstra tutorial interactivo
Algoritmo de dijkstra tutorial interactivoAlgoritmo de dijkstra tutorial interactivo
Algoritmo de dijkstra tutorial interactivo
 
Ul rc_cap4_capa de red - encaminamiento ruteo
 Ul rc_cap4_capa de red - encaminamiento ruteo Ul rc_cap4_capa de red - encaminamiento ruteo
Ul rc_cap4_capa de red - encaminamiento ruteo
 
2.5.3 Algoritmo de Dijkstra.pptx
2.5.3 Algoritmo de Dijkstra.pptx2.5.3 Algoritmo de Dijkstra.pptx
2.5.3 Algoritmo de Dijkstra.pptx
 
Móvil esquiva objetos
Móvil esquiva objetosMóvil esquiva objetos
Móvil esquiva objetos
 
Curso: Redes y comunicaciones básicas: 05 Algoritmos de enrutamiento
Curso: Redes y comunicaciones básicas: 05 Algoritmos de enrutamientoCurso: Redes y comunicaciones básicas: 05 Algoritmos de enrutamiento
Curso: Redes y comunicaciones básicas: 05 Algoritmos de enrutamiento
 

Análisis de algoritmos

  • 1.
  • 2. ¿EN QUE CONSISTE EL ALGORITMO DE DIJKSTRA? 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érticeorigen al resto de vértices en un grafo con pesos en cada arista. La idea de este algoritmo consiste en ir explorando todos los caminos más cortos que parten del vértice o origen y que llevan o recorren a todos los demás vértices que lo componen. Es cuando se obtiene el camino más corto desde el vértice y/o origen, al resto de los vértices que componen el grafo.
  • 3. PSEUDOCODIGO IMPLEMENTADO // 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 -1 const int INF = -1; int cn; // cantidad de nodos vector< vector<int> > ady; // matriz de adyacencia deque<int> path; // camino mínimo de dijkstra int caminosPosibles; // cantidad de caminos posibles vector<int> dijkstra(int nodo, int final = 0); // el parámetro 'final' es opcional // Devuelve un vector con las distancias mínimas del nodo inicial al resto de los vértices. // Guarda en path los nodos que forman el camino mínimo y muestra la cantidad de caminos posibles vector<int> Grafo :: dijkstra(int inicial, int final)
  • 4. vector<int> 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 mínimo 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){ // Agrego a camino el nodo (actual) a través del cual el nodo inicial se conecta con *itList path[*itList] = actual; } else if(distancias[*itList] == dt && *itList == final) caminosPosibles++; }
  • 5. // Marco como visitado el nodo actual, la distancia seteada es la mínima. noVisitados.remove(actual); // Si no lo pase como parámetro 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 parámetro obtengo el camino mínimo 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; }
  • 7. COMPLEJIDAD Podemos estimar la complejidad computacional del algoritmo de Dijkstra (en términos de sumas y comparaciones). Para estimar el número total de operaciones basta estimar el número de operaciones que se llevan a cabo en cada iteración. Orden de complejidad del algoritmo: O(|V|2+|E|) = O(|V|2) sin utilizar cola de prioridad, O((|E|+|V|) log |V|) utilizandocola de prioridad.
  • 8. APLICACIONES INFORMÁTICAS EN LAS CUALES SE IMPLEMENTA EL ALGORITMO DE DIJKSTRA Aplicadas en las tarjetas graficas NVIDIA Las actuales unidades de procesamiento gráfico de NVIDIA disponen de una interfaz de programación que permite utilizarlas para tareas de propósito general (GPGPU). El objetivo de este algoritmo es acelerar la ejecución de algoritmos clásicos de la teoría de grafos utilizando la interfaz de programación CUDA. Para ello, hemos estudiado la formulación y posterior codificación de estos algoritmos en el modelo de programación paralela de CUDA. En particular, los algoritmos estudiados son la búsqueda de los caminos mínimos desde un único origen, la búsqueda del árbol de recubrimiento mínimo y la búsqueda de todos los caminos mínimos entre pares de vértices.
  • 9. Aplicada en IPHONE en la funcionalidad del GPS. Calcular una ruta utilizando el algoritmo es suficientemente rápida como en un iPhone con datos de mapas sin conexión. Se debe mantener la red de carreteras en la memoria y reutilización una vez cargado, el enrutamiento incluso sobre un área grande como España o la mitad occidental de Canadá es prácticamente instantáneo. Toma datos de OpenStreetMap o elswhere y lo convierten en un dirigido gráfico, suponiendo (que es la manera correcta de hacerlo según los que saben) que se unen los dos caminos compartiendo un punto con el mismo ID. Asignar pesos a diferentes tipos de carreteras basados en la velocidad esperada, y si una parte de una carretera es unidireccional crear sólo un único arco; dos vías carreteras obtienen dos arcos, uno en cada dirección. Eso es prácticamente todo esto aparte de algún código de ad-hoc para evitar curvas peligrosas y aplicación de restricciones de enrutamiento.