1. Ing. Rolando Lara Sánchez
Creative Commons Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Licencia Pública Internacional — CC BY-NC-
ND 4.0
1
Programación
Avanzada
Presentación
Santa Cruz – Septiembre 2023
2. Ing. Rolando Lara Sánchez
Creative Commons Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Licencia Pública Internacional — CC BY-NC-
ND 4.0
2
Ing. Rolando Lara Sánchez
DIPLOMADO EDUCACIÓN SUP.(2021)
DIPLOMADO PLANIFICACIÓN Y
DESARR. DE COMPETENCIAS(2020)
CERTIFICACIÓN OSI (2013)
MAESTRÍA EN EDUCACIÓN SUP (2021
– CURSANDO)
AÑOS DE EXEPERIENCIA PROFESIONAL 15 AÑOS –
AÑOS DE EXPERIENCIA ESPECIFICA 8 AÑOS
INGENIERÍA DE SOFTWARE I
Docente Antiguo
INGENIERO INFORMÁTICO
Desarrollador de ERP (diferentes empresas)
PROGRAMACIÓN AVANZADA
Docente Antiguo
INGENIERO INFORMÁTICO
Desarrollador de ERP (diferentes empresas)
INTERNET DE LAS COSAS
Docente Antiguo
CERTIFICACIÓN OSI (2013)
Ingeniero Informático (2006)
Email : rlaras@doc.emi.edu.bo
rolylara@gmail.com
Tel : 77633693
3. 3
Ing. Rolando Lara Sánchez
Creative Commons Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Licencia Pública Internacional — CC BY-NC-
ND 4.0
5. 5
Competencias a desarrollar
“Aplica programación avanzada, analizando y optimizando algoritmos,
resolviendo problemas de ordenamiento y búsqueda, realizando grafos
transversales y con peso, aplicando búsqueda combinatoria y métodos
heurísticos, desarrollando programación dinámica, aplicando geometría
computacional, comprendiendo el proceso de compiladores de forma
eficiente.”
Programación
Avanzada
6. 6
Contenido de la asignatura
“Realiza grafos transversales y con peso aplicando
conceptos de estructura de datos, programando la
construcción de un grafo transversal, diseñando búsqueda
por la primera migaja y del primer profundo, aplicando
algoritmos pesados con el mínimo de árboles expandidos,
rutas cortas, flujo de redes y comparación bipartita,
diseñando grafos y no algoritmos.”
Programación
Avanzada
10. Programación
Avanzada
El algoritmo de Dijkstra, también llamado algoritmo de caminos mínimos, es
un algoritmo para determinar el camino más corto, dado un vértice origen,
hacia el resto de los vértices en un grafo que tiene pesos en cada arista.
Su nombre alude a Edsger Dijkstra, científico de la computación de los países
bajos que lo describió por primera vez en 1959.
10
Algoritmo de Dijkstra
11. 11
Programación
Avanzada
La idea principal 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 hasta
el resto de los vértices que componen el grafo, el algoritmo se detiene.
Algoritmo de Dijkstra
12. 12
Programación
Avanzada
Algoritmo de Dijkstra
Se trata de una especialización de la búsqueda de costo uniforme y , como tal,
no funciona en grafos con aristas de coste 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).
13. 13
Programación
Avanzada
Algoritmo de Dijkstra
Una de sus aplicaciones más importantes reside en el campo de la telemática.
Gracias a él, es posible resolver grafos con muchos nodos, lo que sería muy
complicado resolver sin dicho algoritmo, encontrando así las rutas más cortas
entre un origen y todos los destinos en una red.
14. 14
Programación
Avanzada
Algoritmo de Dijkstra
Algoritmo
Teniendo un grafo no dirigido ponderado de N nodos (vértices) no aislados,
sea x el nodo inicial. Un vector D de tamaño N guardará al final del algoritmo
las distancias desde x hasta el resto de los nodos.
15. 15
Programación
Avanzada
Algoritmo de Dijkstra
Algoritmo
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 (se toma a como nodo actual.)
3. Se recorren todos los nodos adyacentes de a, excepto los nodos marcados.
Se les llamará nodos no marcados vi .
16. 16
Programación
Avanzada
Algoritmo de Dijkstra
Algoritmo
4. Para el nodo actual, se calcula la distancia tentativa desde dicho nodo hasta
sus vecinos con la siguiente fórmula:
Es decir, la distancia tentativa del nodo ‘vi’ es la distancia que actualmente
tiene el nodo en el vector D más la distancia desde dicho nodo ‘a’ (el actual)
hasta el nodo vi.
18. 18
Programación
Avanzada
Algoritmo
5. Se marca como completo el nodo a.
6. Se toma como próximo nodo actual el de menor valor en d (puede hacerse
almacenando los valores en una cola de prioridad) y se regresa al paso 3,
mientras existan nodos no marcados.
Una vez terminado al algoritmo, d estará completamente lleno.
Algoritmo de Dijkstra
24. 24
Programación
Avanzada
El primer vértice que tomamos en cuenta es s. Se marca como definitivo,
como la distancia de s a s es 0. Debemos encontrar otros vértices
adyacentes a s.
Algoritmo de Dijkstra
25. 25
Programación
Avanzada
Adyacentes a s son b y c.
La distancia de b a s es 4. se coloca en la matriz.
La distancia de c a s es 2, se coloca en la matriz.
Algoritmo de Dijkstra
27. 27
Programación
Avanzada
Como s ya tiene la etiqueta definitiva se coloca asterisco a todos los pasos
de s. Significa que ya no vamos a considerar ninguno más de estos pasos.
La matriz queda de la siguiente manera.
Algoritmo de Dijkstra
28. 28
Programación
Avanzada
Del paso 1. Se debe obtener y copiar el de menor peso. Así que se traslada a
la siguiente columna.
Algoritmo de Dijkstra
30. 30
Programación
Avanzada
Como c ya tiene la etiqueta definitiva se coloca asterisco a todos los pasos
de c.
Lo que significa que ya no evaluaremos más c.
La matriz queda de la siguiente manera.
Algoritmo de Dijkstra
31. 31
Programación
Avanzada
Veamos los vértices adyacentes de c, tenemos s que no se evaluará, porque
ya es solución (tiene etiqueta definitiva). Tenemos b referido a c. Con el peso
de 1 pero debemos sumarle el peso de estar en c (2), por lo tanto se escribe
para el vértice b (3,c).
Algoritmo de Dijkstra
32. 32
Programación
Avanzada
Seguimos con los vértices adyacentes de c, tenemos s , b , realizados en el
anterior paso. Nos toca d y e, referidos a c. Con el peso de 8 respecto a d,
pero debemos sumarle el peso de estar en c (2), por lo tanto se escribe para
el vértice d (10,c).
Algoritmo de Dijkstra
33. 33
Programación
Avanzada
Seguimos con los vértices adyacentes de c, tenemos s , b , d, realizados en el
anterior paso. Nos toca e. referidos a c. Con el peso de 10 respecto a d, pero
debemos sumarle el peso de estar en c (2), por lo tanto se escribe para el
vértice e (12,c).
Algoritmo de Dijkstra
34. 34
Programación
Avanzada
Seguimos con los vértices adyacentes de c, tenemos s , b , d, e realizados en
el anterior paso. Para el vértice t que no es adyacente ponemos infinito.
Algoritmo de Dijkstra
35. 35
Programación
Avanzada
Evaluamos cual pesa menos. Trasladamos a la siguiente columna. Y la
etiquetamos definitivamente, y ponemos asteriscos a las demás columnas.
Algoritmo de Dijkstra
36. 36
Programación
Avanzada
Evaluamos d, puede ser referido a b de tal modo que el camino pese menos
que el que teníamos antes (pesaba 10). Considere de d a b (5) aumentarle 3
que cuesta estar en b. Entonces pesa 8 con respecto a b.
Algoritmo de Dijkstra
37. 37
Programación
Avanzada
Evaluamos e, puede ser referido a d de tal modo que el camino pese menos
que el que teníamos antes (pesaba 12). No porque pesa más entonces
dejamos con el peso anterior.
Algoritmo de Dijkstra
38. 38
Programación
Avanzada
Evaluamos cual pesa menos. Trasladamos a la siguiente columna. Y la
etiquetamos definitivamente, y ponemos asteriscos a las demás columnas.
Algoritmo de Dijkstra
40. 40
Programación
Avanzada
Evaluamos cual pesa menos. Trasladamos a la siguiente columna. Y la
etiquetamos definitivamente, y ponemos asteriscos a las demás columnas.
Algoritmo de Dijkstra