SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
UNIVERSIDAD TECNOLÓGICA
DE LOS ANDES
CARRERA PROFESIONAL
INGENIERÍA DE SISTEMAS E INFORMÁTICA
ALGORITMOS Y PROGRAMACION II
TEMA : Algoritmo de caminos más cortos con DAG (Directed Acyclic
Graph)
DOCENTE
Ing. Godofredo Poccori Umeres
ESTUDIANTES:
Johann Quispe Tecssi
Clarck Gervassi Bravo Paucar
Paloma Celeste Mamani Oliva
Carlos Daniel Palomino Dorado
Cusco-2023
Índice
Introducción.................................................................................................................................3
1.1. Contextualización del Problema......................................................................................3
1.2. Justificación de la Elección del Tema..............................................................................3
1.3. Objetivos de la Monografía ............................................................................................3
1.3.1. Objetivo General ....................................................................................................3
1.3.2. Objetivos Específicos .............................................................................................3
1.4. Metodología de Investigación .........................................................................................4
Capitulo 2 ....................................................................................................................................5
Concepto de grafos.......................................................................................................................5
2. Conceptos Básicos.............................................................................................................5
2.1. Recorrido De Grafos ................................................................................................5
2.2. Recorrido en profundidad............................................................................................6
2.3. Recorrido de anchura ..................................................................................................6
Capítulo 3 ....................................................................................................................................7
Grafos Dirigidos y Acíclicos (DAG) ..............................................................................................7
3. Definición.........................................................................................................................7
3.1. Características y Propiedades...................................................................................7
3.2. Aplicaciones de DAG en la Vida Real.......................................................................8
3.3. Algoritmo para la construcción de Gráfico Acíclico Dirigido: ..................................9
CAPITULO 3.............................................................................................................................10
Algoritmos de Caminos Más Cortos.............................................................................................10
4. Descripción.....................................................................................................................10
4.1. Tipos de problemas ................................................................................................10
4.2. Breve Revisión de Algoritmos Clásicos...................................................................10
4.3. Desafíos en la Aplicación de Algoritmos de Caminos Más Cortos...........................11
4.4. Necesidad de Adaptar Algoritmos para DAG.........................................................11
4.5. Ordenamiento Topológico ......................................................................................12
5. Problema de la ruta más corta...............................................................................................13
5.1. Código........................................................................................................................13
5.2. Terminal .....................................................................................................................14
CONCLUCION .........................................................................................................................16
Bibliografía ...............................................................................................................................17
Introducción
1.1. Contextualización del Problema
En el ámbito de la teoría de grafos y la optimización computacional, la búsqueda de caminos
más cortos es un problema crítico con diversas aplicaciones prácticas. Este estudio se enfoca
específicamente en el desarrollo de un "Algoritmo de caminos más cortos con DAG (Directed
Acyclic Graph)". Los DAG, al carecer de ciclos, ofrecen una representación estructuralmente
clara para modelar situaciones como planificación de proyectos, dependencias de tareas y
flujos en redes.
1.2. Justificación de la Elección del Tema
La elección de este tema se sustenta en la relevancia y la utilidad práctica que implica
la optimización de caminos más cortos en grafos dirigidos acíclicos. A medida que las
aplicaciones de la teoría de grafos se expanden en áreas como logística, redes de
transporte y planificación de proyectos, la necesidad de algoritmos eficientes para
DAG se vuelve crucial. Este estudio abordará las limitaciones de los enfoques
tradicionales y propondrá una solución innovadora y eficaz para este contexto
específico.
1.3. Objetivos de la Monografía
1.3.1. Objetivo General
El objetivo principal de esta monografía es desarrollar y analizar un algoritmo
eficiente para la búsqueda de caminos más cortos en grafos dirigidos acíclicos,
abordando las limitaciones de los enfoques convencionales y proponiendo una
solución que optimice la complejidad computacional asociada.
1.3.2. Objetivos Específicos
a. Revisar la teoría de grafos y los fundamentos de los DAG.
b. Identificar los desafíos específicos en la búsqueda de caminos más cortos en
DAG.
c. Realizar una exhaustiva revisión de la literatura relacionada con algoritmos para
DAG.
d. Diseñar un algoritmo eficiente que aproveche las características únicas de los
DAG.
e. Implementar el algoritmo propuesto y realizar pruebas de rendimiento en
diferentes conjuntos de datos y contextos aplicados.
f. Comparar los resultados obtenidos con enfoques tradicionales y evaluar la
eficacia del nuevo algoritmo.
1.4. Metodología de Investigación
Para alcanzar los objetivos propuestos, se seguirá una metodología estructurada. Se llevará a
cabo una revisión bibliográfica exhaustiva para comprender la teoría de grafos, los DAG y
los algoritmos existentes. Posteriormente, se identificarán los desafíos específicos
relacionados con la búsqueda de caminos más cortos en DAG. El diseño del nuevo algoritmo
se basará en la síntesis de conceptos teóricos y enfoques prácticos. La implementación y
evaluación del algoritmo se realizarán mediante pruebas en conjuntos de datos simulados y
situaciones aplicadas. Se utilizarán métricas específicas para comparar el rendimiento del
nuevo algoritmo con enfoques tradicionales. Esta metodología proporcionará una base sólida
para la investigación y la validación de resultados.
Capitulo 2
Concepto de grafos
2. Conceptos Básicos
Hablando intuitivamente, un grafo es un conjunto de nodos unidos por un conjunto
de líneas o flechas. Por lo general, los nodos son entes de procesamiento o estructuras
que contienen algún tipo de información y las líneas o flechas son conexiones o
relaciones entre estos entes. Si se utilizan flechas para conectar los nodos decimos que
el grafo es dirigido (también llamado digrafo) porque las relaciones entre los nodos
tienen una dirección. En caso contrario el grafo es no dirigido. En cualquiera de los
dos casos, bien sea que se utilicen líneas o flechas, a estas relaciones se les puede
llamar simplemente aristas. Frecuentemente las aristas también tienen algún tipo de
información asociada (distancia, costo, confiabilidad, etc.), en cuyo caso estamos en
presencia de un grafo pesado.
Las secuencias de aristas forman caminos o ciclos. Un ciclo es un camino que
termina en el mismo nodo donde comenzó. Si el camino recorre todos los nodos del
grafo es llamado tour. El número de aristas en un camino es la longitud del camino.
Se dice que un grafo es conexo si se puede llegar desde cualquier nodo hasta
cualquier otro mediante un camino. De lo contrario no es conexo, pero puede
dividirse en componentes conexas, que son subconjuntos de nodos y aristas del grafo
original que si son conexos. Un grafo conexo sin ciclos es llamado un árbol.
Estos son apenas unos cuantos conceptos de lo que se conoce como la Teoría de
Grafos. El objetivo de estas notas no es cubrir por completo dicha teoría sino
enfocarnos en la implementación de este tipo de estructuras y las operaciones y
algoritmos más comunes e importantes que se aplican sobre las mismas. (Coto, 2003)
2.1. Recorrido De Grafos
Cualquier algoritmo de recorrido de grafos consiste básicamente en
visitar un nodo del grafo y luego ir visitando los nodos conectados a este.
Este principio se aplica recursivamente comenzando desde un nodo
inicial cualquiera del grafo.
Lo que diferencia un algoritmo de recorrido de otro es, una vez ubicado
en un nodo en particular, la forma en que se visitan los nodos conectados
a este. Por supuesto, estos algoritmos pueden ser aplicados en grafos
dirigidos o no dirigidos.
Los dos algoritmos “clásicos” de recorrido de grafos son el recorrido en
profundidad y en anchura. Precisamente por ser “clásicos” han sido
estudiados con anterioridad y se les conoce su orden de complejidad en
tiempo y todos los beneficios de aplicarlos.
2.2. Recorrido en profundidad
Para efectuar un recorrido en profundidad de un grafo, se selecciona
cualquier nodo como punto de partida (por lo general el primer nodo del
grafo) y se marcan todos los nodos del grafo como “no visitados”.
Se dice que el recorrido es en profundidad, porque para visitar otro nodo
adyacente del nodo inicial, primero se deben visitar TODOS los nodos
adyacentes al que se eligió antes. Es así, como el número de ambientes
recursivos varía dependiendo de la profundidad que alcance el algoritmo.
2.3. Recorrido de anchura
Este algoritmo puede crear menos ambientes recursivos que el anterior
porque visita mas nodos en un mismo ambiente, pero esto depende de
cómo este construido el grafo.
Este algoritmo tiene exactamente el mismo orden en tiempo de ejecución
del algoritmo de recorrido en profundidad y también se puede obtener el
conjunto de aristas de cubrimiento mínimo del grafo.
Capítulo 3
Grafos Dirigidos y Acíclicos (DAG)
3. Definición
Es un grafo dirigido que no tiene ciclos, es decir, para cada nodo del grafo no hay un
camino directo que comience y finalice en dicho nodo. Un vértice se conecta a otro,
pero nunca a si mismo. Así mismo, puede ser utilizado para representar la estructura
de bloques básicos, para visualizar el flujo de valores entre bloques básicos y para
proporcionar técnicas de optimización en el bloque básico. Para aplicar una técnica de
optimización a un bloque básico, un DAG es un código de tres direcciones que se
genera como resultado de una generación de código intermedio. (Sahu, 2021)
Por otro lado es un gráfico dirigido finito sin ciclos dirigidos. Es decir, consta de un
número finito de vértices y aristas, con cada arista dirigida de un vértice a otro, de
modo que no hay forma de comenzar en ningún vértice v y seguir una secuencia
consistentemente dirigida de aristas que eventualmente regresa a v nuevamente. . De
manera equivalente, un DAG es un gráfico dirigido que tiene un ordenamiento
topológico, una secuencia de vértices tal que cada arista se dirige desde el principio
hacia el final de la secuencia.
Los DAG se pueden utilizar para modelar muchos tipos diferentes de información. La
relación de accesibilidad en un DAG forma un orden parcial, y cualquier orden parcial
finito puede representarse mediante un DAG utilizando la accesibilidad. La técnica de
evaluación y revisión de programas utiliza DAG para modelar los hitos y actividades
de grandes proyectos humanos y programar estos proyectos para utilizar el menor
tiempo total posible.
• Los gráficos acíclicos dirigidos son un tipo de estructura de datos y se utilizan
para aplicar transformaciones a bloques básicos.
• El gráfico acíclico dirigido (DAG) facilita la transformación de bloques
básicos. DAG es un método eficaz para identificar subexpresiones comunes.
• Demuestra cómo se utiliza el valor calculado de la declaración en
declaraciones posteriores.
3.1. Características y Propiedades
Un gráfico acíclico dirigido para bloque básico es un gráfico acíclico dirigido con las
siguientes etiquetas en los nodos. (Sahu, 2021)
• Cada una de las hojas del gráfico tiene un identificador único, que puede ser
nombres de variables o constantes.
• Los nodos interiores del gráfico están etiquetados con un símbolo de operador.
• Además, los nodos reciben una cadena de identificadores para usar como
etiquetas para almacenar el valor calculado.
• Los gráficos acíclicos dirigidos tienen sus propias definiciones de cierre
transitivo y reducción transitiva.
• Los gráficos acíclicos dirigidos tienen ordenamientos topológicos definidos.
3.2. Aplicaciones de DAG en la Vida Real
El modelo de DAG puede diseñar y evaluar modelos gráficos directed
acyclic (DAG) con estructura de causa suficiente para valorar
relaciones causales entre un conjunto de variables clínicas médica-
odontológica, psicológicas, molécula-celulares y los fenotipos
multifactoriales de enfermedades complejas. (Brunotto, 2017)
También encuentran aplicaciones en una variedad de campos. Algunos ejemplos
prácticos incluyen:
a) Planificación de Proyectos: La planificación de tareas, es un problema que se ha
abordado con diferentes técnicas de programación para optimizar los recursos de los
sistemas de cómputo.
b) Compiladores: Representan la secuencia de compilación sin redundancias para
garantizar la eficiencia en la generación de código.
c) Flujos de Datos: Utilizados en el diseño de circuitos y en la optimización de procesos
que involucran la transferencia de información.
El Grafo Acíclico Dirigido (DAG) tiene aplicaciones significativas en la optimización
y análisis de código. Se utiliza para determinar subexpresiones comunes, así como los
nombres utilizados dentro y fuera de un bloque de código. El DAG permite identificar
declaraciones cuyos valores pueden calcularse fuera del bloque, lo que es útil para la
eficiente eliminación de subexpresiones repetidas por parte del compilador.
Ilustración 1 Ejemplo de (DAG)
En muchos lenguajes de programación, los valores están interconectados mediante un
DAG. Cuando un valor cambia, sus dependencias se recalculan, ya que cada valor en
el DAG se evalúa en función de sus predecesores. Esta representación gráfica del
código facilita la comprensión de las dependencias y relaciones entre las operaciones
aritméticas, lo que permite al compilador realizar optimizaciones como la eliminación
de subexpresiones comunes de manera más efectiva. (Mohmed Fekry, 2016)
3.3. Algoritmo para la construcción de Gráfico Acíclico Dirigido:
para cada operación, verificas si los operandos están definidos como nodos. Si no lo
están, los creas. Luego, creas un nodo de operación con esos operandos. Repites este
proceso para cada parte de la expresión.
Este enfoque te permite construir un DAG que representa la estructura de la expresión
matemática de manera clara y sin ciclos (acíclico).
Ejemplo:
T1 = a + b
T2 = T1 + c
T3 = T1 x T2
CAPITULO 3
Algoritmos de Caminos Más Cortos
4. Descripción
En la teoría de grafos, el problema del camino más corto es el problema que consiste en
encontrar un camino entre dos vértices o nodos, de tal manera que la suma de los pesos de las
aristas que lo constituyen sea mínima. Al camino más corto entre dos vértices también se le
conoce como geodésica. (Wasserman & Faust, 2013)
Todo camino en un dígrafo pesado tiene un peso asociado, el cual es la suma de los pesos de
las aristas del camino. Esta medida esencial nos permite formular problemas como el de
encontrar el camino con el menor peso entre dos vértices. El tópico de esta sección es el
cálculo de este tipo de camino, donde la longitud del camino no se mide en base al número de
aristas del mismo, sino en base al peso del camino. Con esto último en mente, definiremos al
camino más corto entre dos nodos de un dígrafo pesado, como el camino dirigido que tenga
la propiedad de tener el peso mínimo entre todos los caminos que existan entre dicho par de
nodos.
4.1. Tipos de problemas
• Camino más corto origen-destino: Dados dos nodos v y w de un grafo, encontrar el
camino más corto que comience en v y culmine w.
• Camino más corto a partir de un origen: Dado un nodo v de un grafo, encontrar el
camino más corto desde v hasta cada uno de los demás nodos.
• Camino más corto entre cada par de nodos
4.2. Breve Revisión de Algoritmos Clásicos
4.2.1. Algoritmo de Dijkstra
El algoritmo de Dijkstra es una técnica clásica para encontrar el camino más
corto entre dos nodos en un grafo ponderado no dirigido o dirigido. Basado en
la lógica de selección de nodos con la distancia mínima conocida en cada
iteración, el algoritmo garantiza la obtención del camino más corto en grafos
sin aristas con pesos negativos. (Sanchez Torrubia & Loranzo Terrazas, 2001)
4.2.2. Algoritmo de Bellman-Ford
(Correa & Salazar, 2011) indican que el Algoritmo de Bellman Ford, permite
solucionar, el enigma de la ruta más adyacente, con estilo más pluralizado que
el Algoritmo de Dijkstra, pues permite lograr valores adversos en los arcos. El
algoritmo arroja un valor booleano si encuentra un circuito o lazo de peso
adverso, de ser lo opuesto, calcula y retorna el camino mínimo con su coste.
Para cada vértice v perteneciente a V, se mantiene el atributo d[v] como cota
superior o costo del camino mínimo desde el principio s al vértice v.
4.3. Desafíos en la Aplicación de Algoritmos de Caminos Más Cortos
La aplicación de los algoritmos clásicos de caminos más cortos presenta desafíos específicos
en ciertos contextos, especialmente cuando se trabaja con Grafos Dirigidos Acíclicos (DAG)
que poseen propiedades estructurales distintas.
Entre los desafíos comunes se encuentran:
a. Ciclos Negativos: Los algoritmos clásicos pueden verse afectados por ciclos negativos,
provocando resultados imprecisos o infinitos en ciertos casos.
b. Redundancia en DAG: La estructura acíclica de los DAG permite la existencia de
múltiples caminos mínimos entre dos nodos, lo que plantea la necesidad de adaptar los
algoritmos para evitar la redundancia en la solución.
4.4. Necesidad de Adaptar Algoritmos para DAG
La especificidad de los DAG requiere enfoques adaptativos para la búsqueda de caminos más
cortos. La ausencia de ciclos simplifica el proceso y ofrece oportunidades para optimizar la
eficiencia computacional. Adaptar los algoritmos clásicos a la topología de los DAG implica
reconsiderar los mecanismos de selección de nodos, la gestión de ciclos, y la optimización de
la identificación de caminos mínimos en este contexto particular.
Esta sección establece la base para la necesidad de desarrollar un nuevo algoritmo que
aproveche las características únicas de los Grafos Dirigidos Acíclicos, abordando los desafíos
presentados por los enfoques clásicos en este contexto específico. La revisión de estos
algoritmos proporciona una comprensión crítica de las limitaciones que el nuevo algoritmo
propuesto buscará superar.
4.5. Ordenamiento Topológico
El objetivo del ordenamiento topológico (topological sorting) es el de ser capaz de procesar
los nodos de un dígrafo acíclico (DAG - directed acyclic graph) de tal forma de que cada
nodo sea procesado antes que todos los nodos a los que apunta. (Coto, 2003)
Hay dos maneras naturales de definir esta operación básica, aunque son
esencialmente la misma, a saber:
• Re etiquetado: Dado un DAG, reetiquetar sus nodos de tal forma que cada arista
dirigida vaya de un nodo con un identificador bajo en número a un nodo con un
identificador cuyo identificador sea mayor.
• Reposicionado: Dado un DAG, reposicionar sus nodos en una línea horizontal
de tal forma de que todas sus aristas dirigidas apunte de izquierda a derecha.
Por lo general, se usa el término de ordenamiento topológico para referirse a la
versión de reposicionado.
5. Problema de la ruta más corta
Has sido asignado para desarrollar un programa que pueda encontrar los caminos más
cortos en un grafo dirigido acíclico (DAG) desde un nodo de inicio dado. Se te
proporciona un grafo representado como un diccionario, donde las claves son los
nodos y los valores son diccionarios que contienen los nodos vecinos y los pesos de
las aristas hacia esos vecinos.
Implementa una función llamada topological_sort(graph) que tome un grafo dirigido
acíclico como entrada y realice una ordenación topológica. La función debe devolver
una lista que represente el orden topológico de los nodos en el grafo.
5.1. Código
def topological_sort(graph):
# Realiza una ordenación topológica del grafo
stack = []
visited = set()
def dfs(node):
visited.add(node)
for neighbor in graph[node]:
if neighbor not in visited:
dfs(neighbor)
stack.append(node)
for node in graph:
if node not in visited:
dfs(node)
return stack[::-1] # Invertir la pila para obtener el orden topológico
def shortest_path_dag(graph, start):
# Encuentra los caminos más cortos en un DAG desde el nodo de inicio
# Paso 1: Ordenación topológica
top_order = topological_sort(graph)
# Inicializa las distancias a infinito para todos los nodos excepto el
nodo de inicio
distances = {node: float('inf') for node in graph}
distances[start] = 0
# Paso 2: Algoritmo de relajación de distancias
for node in top_order:
for neighbor, weight in graph[node].items():
if distances[node] + weight < distances[neighbor]:
distances[neighbor] = distances[node] + weight
return distances
# Ejemplo de uso
graph = {
'A': {'B': 1, 'C': 4},
'B': {'D': 3},
'C': {'D': 1},
'D': {}
}
start_node = 'A'
result = shortest_path_dag(graph, start_node)
print("Distancias más cortas desde el nodo {}:".format(start_node))
for node, distance in result.items():
print("{}: {}".format(node, distance))
5.2. Terminal
5.3. Pseudocodigo
# Función para realizar la ordenación topológica del grafo
Función OrdenaciónTopológica(graph):
stack = PilaVacia()
visitados = ConjuntoVacio()
# Función de búsqueda en profundidad (DFS)
Función DFS(nodo):
visitados.Agregar(nodo)
Para cada vecino en graph[nodo]:
Si vecino no está en visitados:
DFS(vecino)
stack.Apilar(nodo)
# Iterar sobre todos los nodos del grafo
Para cada nodo en graph:
Si nodo no está en visitados:
DFS(nodo)
Devolver stack.Invertir() # Invertir la pila para obtener el orden topológico
# Función para encontrar los caminos más cortos en un DAG desde un nodo de inicio
Función CaminosMásCortosDAG(graph, inicio):
# Paso 1: Obtener la ordenación topológica
orden_topológico = OrdenaciónTopológica(graph)
# Paso 2: Inicializar las distancias
distancias = {nodo: Infinito para cada nodo en graph}
distancias[inicio] = 0
# Paso 3: Algoritmo de relajación de distancias
Para cada nodo en orden_topológico:
Para cada vecino, peso en graph[nodo]:
Si distancias[nodo] + peso < distancias[vecino]:
distancias[vecino] = distancias[nodo] + peso
Devolver distancias
# Ejemplo de uso
grafo = {
'A': {'B': 1, 'C': 4},
'B': {'D': 3},
'C': {'D': 1},
'D': {}
}
nodo_inicio = 'A'
resultado = CaminosMásCortosDAG(grafo, nodo_inicio)
Imprimir("Distancias más cortas desde el nodo {}: ".Format(nodo_inicio))
Para cada nodo, distancia en resultado:
Imprimir("{}: {}".Format(nodo, distancia))
CONCLUCION
Los grafos algoritmos con grafos dirigidos con DAG ((Directed Acyclic Graph) son muy efectivos y
su uso es común ya que se uso en las diferentes áreas como medicina es efectivo y necesario lo cual
nos lleva a la conclusión de que es un buen método de ordenamiento asi como lo es dijskra y for
El enfoque se desplazó hacia los algoritmos de recorrido de grafos, específicamente el recorrido en
profundidad y en anchura, proporcionando una comprensión clara de cómo visitar nodos en un grafo.
Se presentaron los desafíos y beneficios de estos algoritmos clásicos.
La sección final presentó la importancia del ordenamiento topológico en la resolución de problemas
relacionados con DAG y planteó un problema práctico: el desarrollo de un programa para encontrar
caminos más cortos en un DAG desde un nodo de inicio dado.
La información proporciona una visión integral de la teoría de grafos, desde los fundamentos hasta la
aplicación de algoritmos en situaciones del mundo real. Se destaca la versatilidad de los grafos en la
modelización de una amplia gama de problemas y la importancia de adaptar algoritmos a estructuras
específicas como los Grafos Dirigidos Acíclicos. Este conocimiento sienta las bases para abordar
problemas prácticos y desarrollar soluciones eficientes en diversos campos, desde la planificación de
proyectos hasta la optimización de código.
Bibliografía
Brunotto, M. (2017). Aplicación de modelos gráficos para enfermedades complejas con expresiones
orales. Cordoba: Revista de Odontología. .
Correa, A. C., & Salazar, J. (2011). Aplicación de la teoría de grafos en la solución de problemas con
impacto ambiental. . Portugal .
Coto, E. (2003). Algoritmos Básicos de Grafos. Caracas: Universidad Central de Venezuela. Facultad
de Ciencias.
Mohmed Fekry, A. (2016). Directed acyclic graph. Riad, Arabia Saudi : in linkedin.
Sahu, R. (2021). Directed Acyclic graph in Compiler Design (with examples). India: geeksfor.
Sanchez Torrubia, G., & Loranzo Terrazas, V. (2001). Algoritmo de Dijkstra. Un tutorial interactivo.
Palma de Mallorca: VII Jornadas de Enseñanza Universitaria de la Informática.
Wasserman, S., & Faust, K. (2013). Análisis de redes sociales: Métodos y aplicaciones. Madrid :
Centro de Investigaciones Sociologicas.

Más contenido relacionado

Similar a MONOGRAFIA DAG.pdf

Similar a MONOGRAFIA DAG.pdf (20)

Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
 
Tema 5 diapositivas de la teoría de grafos.pptx
Tema 5 diapositivas de la teoría de grafos.pptxTema 5 diapositivas de la teoría de grafos.pptx
Tema 5 diapositivas de la teoría de grafos.pptx
 
Apuntes ansys
Apuntes ansysApuntes ansys
Apuntes ansys
 
Aplicación de análisis numérico en alabes
Aplicación de análisis numérico en alabesAplicación de análisis numérico en alabes
Aplicación de análisis numérico en alabes
 
Presentación modelación superficies
Presentación modelación superficiesPresentación modelación superficies
Presentación modelación superficies
 
Minería de datos
Minería de datosMinería de datos
Minería de datos
 
Presentacion-sobre-algoritmos
Presentacion-sobre-algoritmosPresentacion-sobre-algoritmos
Presentacion-sobre-algoritmos
 
Clasificacion Supervisada Y Algoritmos Evolutivos
Clasificacion Supervisada Y Algoritmos EvolutivosClasificacion Supervisada Y Algoritmos Evolutivos
Clasificacion Supervisada Y Algoritmos Evolutivos
 
S4-SCBC.pptx
S4-SCBC.pptxS4-SCBC.pptx
S4-SCBC.pptx
 
S4-SCBC.pptx
S4-SCBC.pptxS4-SCBC.pptx
S4-SCBC.pptx
 
Taller 2 aplicacion de derivadas
Taller 2 aplicacion de derivadasTaller 2 aplicacion de derivadas
Taller 2 aplicacion de derivadas
 
Sig clima
Sig climaSig clima
Sig clima
 
Sistemas inteligentes
Sistemas inteligentesSistemas inteligentes
Sistemas inteligentes
 
Informatica
InformaticaInformatica
Informatica
 
Tap04 poo
Tap04 pooTap04 poo
Tap04 poo
 
Analisis Proyecto TETRAD V
 Analisis Proyecto TETRAD V Analisis Proyecto TETRAD V
Analisis Proyecto TETRAD V
 
Algoritmos_geneticos
Algoritmos_geneticosAlgoritmos_geneticos
Algoritmos_geneticos
 
Algoritmo De Dijkstra
Algoritmo De DijkstraAlgoritmo De Dijkstra
Algoritmo De Dijkstra
 
Elementos finitos
Elementos finitosElementos finitos
Elementos finitos
 
Elementos finitos
Elementos finitosElementos finitos
Elementos finitos
 

MONOGRAFIA DAG.pdf

  • 1. UNIVERSIDAD TECNOLÓGICA DE LOS ANDES CARRERA PROFESIONAL INGENIERÍA DE SISTEMAS E INFORMÁTICA ALGORITMOS Y PROGRAMACION II TEMA : Algoritmo de caminos más cortos con DAG (Directed Acyclic Graph) DOCENTE Ing. Godofredo Poccori Umeres ESTUDIANTES: Johann Quispe Tecssi Clarck Gervassi Bravo Paucar Paloma Celeste Mamani Oliva Carlos Daniel Palomino Dorado Cusco-2023
  • 2. Índice Introducción.................................................................................................................................3 1.1. Contextualización del Problema......................................................................................3 1.2. Justificación de la Elección del Tema..............................................................................3 1.3. Objetivos de la Monografía ............................................................................................3 1.3.1. Objetivo General ....................................................................................................3 1.3.2. Objetivos Específicos .............................................................................................3 1.4. Metodología de Investigación .........................................................................................4 Capitulo 2 ....................................................................................................................................5 Concepto de grafos.......................................................................................................................5 2. Conceptos Básicos.............................................................................................................5 2.1. Recorrido De Grafos ................................................................................................5 2.2. Recorrido en profundidad............................................................................................6 2.3. Recorrido de anchura ..................................................................................................6 Capítulo 3 ....................................................................................................................................7 Grafos Dirigidos y Acíclicos (DAG) ..............................................................................................7 3. Definición.........................................................................................................................7 3.1. Características y Propiedades...................................................................................7 3.2. Aplicaciones de DAG en la Vida Real.......................................................................8 3.3. Algoritmo para la construcción de Gráfico Acíclico Dirigido: ..................................9 CAPITULO 3.............................................................................................................................10 Algoritmos de Caminos Más Cortos.............................................................................................10 4. Descripción.....................................................................................................................10 4.1. Tipos de problemas ................................................................................................10 4.2. Breve Revisión de Algoritmos Clásicos...................................................................10 4.3. Desafíos en la Aplicación de Algoritmos de Caminos Más Cortos...........................11 4.4. Necesidad de Adaptar Algoritmos para DAG.........................................................11 4.5. Ordenamiento Topológico ......................................................................................12 5. Problema de la ruta más corta...............................................................................................13 5.1. Código........................................................................................................................13 5.2. Terminal .....................................................................................................................14 CONCLUCION .........................................................................................................................16 Bibliografía ...............................................................................................................................17
  • 3. Introducción 1.1. Contextualización del Problema En el ámbito de la teoría de grafos y la optimización computacional, la búsqueda de caminos más cortos es un problema crítico con diversas aplicaciones prácticas. Este estudio se enfoca específicamente en el desarrollo de un "Algoritmo de caminos más cortos con DAG (Directed Acyclic Graph)". Los DAG, al carecer de ciclos, ofrecen una representación estructuralmente clara para modelar situaciones como planificación de proyectos, dependencias de tareas y flujos en redes. 1.2. Justificación de la Elección del Tema La elección de este tema se sustenta en la relevancia y la utilidad práctica que implica la optimización de caminos más cortos en grafos dirigidos acíclicos. A medida que las aplicaciones de la teoría de grafos se expanden en áreas como logística, redes de transporte y planificación de proyectos, la necesidad de algoritmos eficientes para DAG se vuelve crucial. Este estudio abordará las limitaciones de los enfoques tradicionales y propondrá una solución innovadora y eficaz para este contexto específico. 1.3. Objetivos de la Monografía 1.3.1. Objetivo General El objetivo principal de esta monografía es desarrollar y analizar un algoritmo eficiente para la búsqueda de caminos más cortos en grafos dirigidos acíclicos, abordando las limitaciones de los enfoques convencionales y proponiendo una solución que optimice la complejidad computacional asociada. 1.3.2. Objetivos Específicos a. Revisar la teoría de grafos y los fundamentos de los DAG.
  • 4. b. Identificar los desafíos específicos en la búsqueda de caminos más cortos en DAG. c. Realizar una exhaustiva revisión de la literatura relacionada con algoritmos para DAG. d. Diseñar un algoritmo eficiente que aproveche las características únicas de los DAG. e. Implementar el algoritmo propuesto y realizar pruebas de rendimiento en diferentes conjuntos de datos y contextos aplicados. f. Comparar los resultados obtenidos con enfoques tradicionales y evaluar la eficacia del nuevo algoritmo. 1.4. Metodología de Investigación Para alcanzar los objetivos propuestos, se seguirá una metodología estructurada. Se llevará a cabo una revisión bibliográfica exhaustiva para comprender la teoría de grafos, los DAG y los algoritmos existentes. Posteriormente, se identificarán los desafíos específicos relacionados con la búsqueda de caminos más cortos en DAG. El diseño del nuevo algoritmo se basará en la síntesis de conceptos teóricos y enfoques prácticos. La implementación y evaluación del algoritmo se realizarán mediante pruebas en conjuntos de datos simulados y situaciones aplicadas. Se utilizarán métricas específicas para comparar el rendimiento del nuevo algoritmo con enfoques tradicionales. Esta metodología proporcionará una base sólida para la investigación y la validación de resultados.
  • 5. Capitulo 2 Concepto de grafos 2. Conceptos Básicos Hablando intuitivamente, un grafo es un conjunto de nodos unidos por un conjunto de líneas o flechas. Por lo general, los nodos son entes de procesamiento o estructuras que contienen algún tipo de información y las líneas o flechas son conexiones o relaciones entre estos entes. Si se utilizan flechas para conectar los nodos decimos que el grafo es dirigido (también llamado digrafo) porque las relaciones entre los nodos tienen una dirección. En caso contrario el grafo es no dirigido. En cualquiera de los dos casos, bien sea que se utilicen líneas o flechas, a estas relaciones se les puede llamar simplemente aristas. Frecuentemente las aristas también tienen algún tipo de información asociada (distancia, costo, confiabilidad, etc.), en cuyo caso estamos en presencia de un grafo pesado. Las secuencias de aristas forman caminos o ciclos. Un ciclo es un camino que termina en el mismo nodo donde comenzó. Si el camino recorre todos los nodos del grafo es llamado tour. El número de aristas en un camino es la longitud del camino. Se dice que un grafo es conexo si se puede llegar desde cualquier nodo hasta cualquier otro mediante un camino. De lo contrario no es conexo, pero puede dividirse en componentes conexas, que son subconjuntos de nodos y aristas del grafo original que si son conexos. Un grafo conexo sin ciclos es llamado un árbol. Estos son apenas unos cuantos conceptos de lo que se conoce como la Teoría de Grafos. El objetivo de estas notas no es cubrir por completo dicha teoría sino enfocarnos en la implementación de este tipo de estructuras y las operaciones y algoritmos más comunes e importantes que se aplican sobre las mismas. (Coto, 2003) 2.1. Recorrido De Grafos Cualquier algoritmo de recorrido de grafos consiste básicamente en visitar un nodo del grafo y luego ir visitando los nodos conectados a este. Este principio se aplica recursivamente comenzando desde un nodo inicial cualquiera del grafo. Lo que diferencia un algoritmo de recorrido de otro es, una vez ubicado en un nodo en particular, la forma en que se visitan los nodos conectados
  • 6. a este. Por supuesto, estos algoritmos pueden ser aplicados en grafos dirigidos o no dirigidos. Los dos algoritmos “clásicos” de recorrido de grafos son el recorrido en profundidad y en anchura. Precisamente por ser “clásicos” han sido estudiados con anterioridad y se les conoce su orden de complejidad en tiempo y todos los beneficios de aplicarlos. 2.2. Recorrido en profundidad Para efectuar un recorrido en profundidad de un grafo, se selecciona cualquier nodo como punto de partida (por lo general el primer nodo del grafo) y se marcan todos los nodos del grafo como “no visitados”. Se dice que el recorrido es en profundidad, porque para visitar otro nodo adyacente del nodo inicial, primero se deben visitar TODOS los nodos adyacentes al que se eligió antes. Es así, como el número de ambientes recursivos varía dependiendo de la profundidad que alcance el algoritmo. 2.3. Recorrido de anchura Este algoritmo puede crear menos ambientes recursivos que el anterior porque visita mas nodos en un mismo ambiente, pero esto depende de cómo este construido el grafo. Este algoritmo tiene exactamente el mismo orden en tiempo de ejecución del algoritmo de recorrido en profundidad y también se puede obtener el conjunto de aristas de cubrimiento mínimo del grafo.
  • 7. Capítulo 3 Grafos Dirigidos y Acíclicos (DAG) 3. Definición Es un grafo dirigido que no tiene ciclos, es decir, para cada nodo del grafo no hay un camino directo que comience y finalice en dicho nodo. Un vértice se conecta a otro, pero nunca a si mismo. Así mismo, puede ser utilizado para representar la estructura de bloques básicos, para visualizar el flujo de valores entre bloques básicos y para proporcionar técnicas de optimización en el bloque básico. Para aplicar una técnica de optimización a un bloque básico, un DAG es un código de tres direcciones que se genera como resultado de una generación de código intermedio. (Sahu, 2021) Por otro lado es un gráfico dirigido finito sin ciclos dirigidos. Es decir, consta de un número finito de vértices y aristas, con cada arista dirigida de un vértice a otro, de modo que no hay forma de comenzar en ningún vértice v y seguir una secuencia consistentemente dirigida de aristas que eventualmente regresa a v nuevamente. . De manera equivalente, un DAG es un gráfico dirigido que tiene un ordenamiento topológico, una secuencia de vértices tal que cada arista se dirige desde el principio hacia el final de la secuencia. Los DAG se pueden utilizar para modelar muchos tipos diferentes de información. La relación de accesibilidad en un DAG forma un orden parcial, y cualquier orden parcial finito puede representarse mediante un DAG utilizando la accesibilidad. La técnica de evaluación y revisión de programas utiliza DAG para modelar los hitos y actividades de grandes proyectos humanos y programar estos proyectos para utilizar el menor tiempo total posible. • Los gráficos acíclicos dirigidos son un tipo de estructura de datos y se utilizan para aplicar transformaciones a bloques básicos. • El gráfico acíclico dirigido (DAG) facilita la transformación de bloques básicos. DAG es un método eficaz para identificar subexpresiones comunes. • Demuestra cómo se utiliza el valor calculado de la declaración en declaraciones posteriores. 3.1. Características y Propiedades
  • 8. Un gráfico acíclico dirigido para bloque básico es un gráfico acíclico dirigido con las siguientes etiquetas en los nodos. (Sahu, 2021) • Cada una de las hojas del gráfico tiene un identificador único, que puede ser nombres de variables o constantes. • Los nodos interiores del gráfico están etiquetados con un símbolo de operador. • Además, los nodos reciben una cadena de identificadores para usar como etiquetas para almacenar el valor calculado. • Los gráficos acíclicos dirigidos tienen sus propias definiciones de cierre transitivo y reducción transitiva. • Los gráficos acíclicos dirigidos tienen ordenamientos topológicos definidos. 3.2. Aplicaciones de DAG en la Vida Real El modelo de DAG puede diseñar y evaluar modelos gráficos directed acyclic (DAG) con estructura de causa suficiente para valorar relaciones causales entre un conjunto de variables clínicas médica- odontológica, psicológicas, molécula-celulares y los fenotipos multifactoriales de enfermedades complejas. (Brunotto, 2017) También encuentran aplicaciones en una variedad de campos. Algunos ejemplos prácticos incluyen: a) Planificación de Proyectos: La planificación de tareas, es un problema que se ha abordado con diferentes técnicas de programación para optimizar los recursos de los sistemas de cómputo. b) Compiladores: Representan la secuencia de compilación sin redundancias para garantizar la eficiencia en la generación de código. c) Flujos de Datos: Utilizados en el diseño de circuitos y en la optimización de procesos que involucran la transferencia de información. El Grafo Acíclico Dirigido (DAG) tiene aplicaciones significativas en la optimización y análisis de código. Se utiliza para determinar subexpresiones comunes, así como los nombres utilizados dentro y fuera de un bloque de código. El DAG permite identificar declaraciones cuyos valores pueden calcularse fuera del bloque, lo que es útil para la eficiente eliminación de subexpresiones repetidas por parte del compilador.
  • 9. Ilustración 1 Ejemplo de (DAG) En muchos lenguajes de programación, los valores están interconectados mediante un DAG. Cuando un valor cambia, sus dependencias se recalculan, ya que cada valor en el DAG se evalúa en función de sus predecesores. Esta representación gráfica del código facilita la comprensión de las dependencias y relaciones entre las operaciones aritméticas, lo que permite al compilador realizar optimizaciones como la eliminación de subexpresiones comunes de manera más efectiva. (Mohmed Fekry, 2016) 3.3. Algoritmo para la construcción de Gráfico Acíclico Dirigido: para cada operación, verificas si los operandos están definidos como nodos. Si no lo están, los creas. Luego, creas un nodo de operación con esos operandos. Repites este proceso para cada parte de la expresión. Este enfoque te permite construir un DAG que representa la estructura de la expresión matemática de manera clara y sin ciclos (acíclico). Ejemplo: T1 = a + b T2 = T1 + c T3 = T1 x T2
  • 10. CAPITULO 3 Algoritmos de Caminos Más Cortos 4. Descripción En la teoría de grafos, el problema del camino más corto es el problema que consiste en encontrar un camino entre dos vértices o nodos, de tal manera que la suma de los pesos de las aristas que lo constituyen sea mínima. Al camino más corto entre dos vértices también se le conoce como geodésica. (Wasserman & Faust, 2013) Todo camino en un dígrafo pesado tiene un peso asociado, el cual es la suma de los pesos de las aristas del camino. Esta medida esencial nos permite formular problemas como el de encontrar el camino con el menor peso entre dos vértices. El tópico de esta sección es el cálculo de este tipo de camino, donde la longitud del camino no se mide en base al número de aristas del mismo, sino en base al peso del camino. Con esto último en mente, definiremos al camino más corto entre dos nodos de un dígrafo pesado, como el camino dirigido que tenga la propiedad de tener el peso mínimo entre todos los caminos que existan entre dicho par de nodos. 4.1. Tipos de problemas • Camino más corto origen-destino: Dados dos nodos v y w de un grafo, encontrar el camino más corto que comience en v y culmine w. • Camino más corto a partir de un origen: Dado un nodo v de un grafo, encontrar el camino más corto desde v hasta cada uno de los demás nodos. • Camino más corto entre cada par de nodos 4.2. Breve Revisión de Algoritmos Clásicos 4.2.1. Algoritmo de Dijkstra El algoritmo de Dijkstra es una técnica clásica para encontrar el camino más corto entre dos nodos en un grafo ponderado no dirigido o dirigido. Basado en la lógica de selección de nodos con la distancia mínima conocida en cada
  • 11. iteración, el algoritmo garantiza la obtención del camino más corto en grafos sin aristas con pesos negativos. (Sanchez Torrubia & Loranzo Terrazas, 2001) 4.2.2. Algoritmo de Bellman-Ford (Correa & Salazar, 2011) indican que el Algoritmo de Bellman Ford, permite solucionar, el enigma de la ruta más adyacente, con estilo más pluralizado que el Algoritmo de Dijkstra, pues permite lograr valores adversos en los arcos. El algoritmo arroja un valor booleano si encuentra un circuito o lazo de peso adverso, de ser lo opuesto, calcula y retorna el camino mínimo con su coste. Para cada vértice v perteneciente a V, se mantiene el atributo d[v] como cota superior o costo del camino mínimo desde el principio s al vértice v. 4.3. Desafíos en la Aplicación de Algoritmos de Caminos Más Cortos La aplicación de los algoritmos clásicos de caminos más cortos presenta desafíos específicos en ciertos contextos, especialmente cuando se trabaja con Grafos Dirigidos Acíclicos (DAG) que poseen propiedades estructurales distintas. Entre los desafíos comunes se encuentran: a. Ciclos Negativos: Los algoritmos clásicos pueden verse afectados por ciclos negativos, provocando resultados imprecisos o infinitos en ciertos casos. b. Redundancia en DAG: La estructura acíclica de los DAG permite la existencia de múltiples caminos mínimos entre dos nodos, lo que plantea la necesidad de adaptar los algoritmos para evitar la redundancia en la solución. 4.4. Necesidad de Adaptar Algoritmos para DAG La especificidad de los DAG requiere enfoques adaptativos para la búsqueda de caminos más cortos. La ausencia de ciclos simplifica el proceso y ofrece oportunidades para optimizar la eficiencia computacional. Adaptar los algoritmos clásicos a la topología de los DAG implica reconsiderar los mecanismos de selección de nodos, la gestión de ciclos, y la optimización de la identificación de caminos mínimos en este contexto particular. Esta sección establece la base para la necesidad de desarrollar un nuevo algoritmo que aproveche las características únicas de los Grafos Dirigidos Acíclicos, abordando los desafíos presentados por los enfoques clásicos en este contexto específico. La revisión de estos
  • 12. algoritmos proporciona una comprensión crítica de las limitaciones que el nuevo algoritmo propuesto buscará superar. 4.5. Ordenamiento Topológico El objetivo del ordenamiento topológico (topological sorting) es el de ser capaz de procesar los nodos de un dígrafo acíclico (DAG - directed acyclic graph) de tal forma de que cada nodo sea procesado antes que todos los nodos a los que apunta. (Coto, 2003) Hay dos maneras naturales de definir esta operación básica, aunque son esencialmente la misma, a saber: • Re etiquetado: Dado un DAG, reetiquetar sus nodos de tal forma que cada arista dirigida vaya de un nodo con un identificador bajo en número a un nodo con un identificador cuyo identificador sea mayor. • Reposicionado: Dado un DAG, reposicionar sus nodos en una línea horizontal de tal forma de que todas sus aristas dirigidas apunte de izquierda a derecha. Por lo general, se usa el término de ordenamiento topológico para referirse a la versión de reposicionado.
  • 13. 5. Problema de la ruta más corta Has sido asignado para desarrollar un programa que pueda encontrar los caminos más cortos en un grafo dirigido acíclico (DAG) desde un nodo de inicio dado. Se te proporciona un grafo representado como un diccionario, donde las claves son los nodos y los valores son diccionarios que contienen los nodos vecinos y los pesos de las aristas hacia esos vecinos. Implementa una función llamada topological_sort(graph) que tome un grafo dirigido acíclico como entrada y realice una ordenación topológica. La función debe devolver una lista que represente el orden topológico de los nodos en el grafo. 5.1. Código def topological_sort(graph): # Realiza una ordenación topológica del grafo stack = [] visited = set() def dfs(node): visited.add(node) for neighbor in graph[node]: if neighbor not in visited: dfs(neighbor) stack.append(node) for node in graph: if node not in visited: dfs(node) return stack[::-1] # Invertir la pila para obtener el orden topológico def shortest_path_dag(graph, start): # Encuentra los caminos más cortos en un DAG desde el nodo de inicio # Paso 1: Ordenación topológica top_order = topological_sort(graph) # Inicializa las distancias a infinito para todos los nodos excepto el nodo de inicio distances = {node: float('inf') for node in graph} distances[start] = 0 # Paso 2: Algoritmo de relajación de distancias for node in top_order: for neighbor, weight in graph[node].items(): if distances[node] + weight < distances[neighbor]:
  • 14. distances[neighbor] = distances[node] + weight return distances # Ejemplo de uso graph = { 'A': {'B': 1, 'C': 4}, 'B': {'D': 3}, 'C': {'D': 1}, 'D': {} } start_node = 'A' result = shortest_path_dag(graph, start_node) print("Distancias más cortas desde el nodo {}:".format(start_node)) for node, distance in result.items(): print("{}: {}".format(node, distance)) 5.2. Terminal 5.3. Pseudocodigo # Función para realizar la ordenación topológica del grafo Función OrdenaciónTopológica(graph): stack = PilaVacia() visitados = ConjuntoVacio() # Función de búsqueda en profundidad (DFS) Función DFS(nodo): visitados.Agregar(nodo) Para cada vecino en graph[nodo]: Si vecino no está en visitados: DFS(vecino) stack.Apilar(nodo)
  • 15. # Iterar sobre todos los nodos del grafo Para cada nodo en graph: Si nodo no está en visitados: DFS(nodo) Devolver stack.Invertir() # Invertir la pila para obtener el orden topológico # Función para encontrar los caminos más cortos en un DAG desde un nodo de inicio Función CaminosMásCortosDAG(graph, inicio): # Paso 1: Obtener la ordenación topológica orden_topológico = OrdenaciónTopológica(graph) # Paso 2: Inicializar las distancias distancias = {nodo: Infinito para cada nodo en graph} distancias[inicio] = 0 # Paso 3: Algoritmo de relajación de distancias Para cada nodo en orden_topológico: Para cada vecino, peso en graph[nodo]: Si distancias[nodo] + peso < distancias[vecino]: distancias[vecino] = distancias[nodo] + peso Devolver distancias # Ejemplo de uso grafo = { 'A': {'B': 1, 'C': 4}, 'B': {'D': 3}, 'C': {'D': 1}, 'D': {} } nodo_inicio = 'A' resultado = CaminosMásCortosDAG(grafo, nodo_inicio) Imprimir("Distancias más cortas desde el nodo {}: ".Format(nodo_inicio)) Para cada nodo, distancia en resultado: Imprimir("{}: {}".Format(nodo, distancia))
  • 16. CONCLUCION Los grafos algoritmos con grafos dirigidos con DAG ((Directed Acyclic Graph) son muy efectivos y su uso es común ya que se uso en las diferentes áreas como medicina es efectivo y necesario lo cual nos lleva a la conclusión de que es un buen método de ordenamiento asi como lo es dijskra y for El enfoque se desplazó hacia los algoritmos de recorrido de grafos, específicamente el recorrido en profundidad y en anchura, proporcionando una comprensión clara de cómo visitar nodos en un grafo. Se presentaron los desafíos y beneficios de estos algoritmos clásicos. La sección final presentó la importancia del ordenamiento topológico en la resolución de problemas relacionados con DAG y planteó un problema práctico: el desarrollo de un programa para encontrar caminos más cortos en un DAG desde un nodo de inicio dado. La información proporciona una visión integral de la teoría de grafos, desde los fundamentos hasta la aplicación de algoritmos en situaciones del mundo real. Se destaca la versatilidad de los grafos en la modelización de una amplia gama de problemas y la importancia de adaptar algoritmos a estructuras específicas como los Grafos Dirigidos Acíclicos. Este conocimiento sienta las bases para abordar problemas prácticos y desarrollar soluciones eficientes en diversos campos, desde la planificación de proyectos hasta la optimización de código.
  • 17. Bibliografía Brunotto, M. (2017). Aplicación de modelos gráficos para enfermedades complejas con expresiones orales. Cordoba: Revista de Odontología. . Correa, A. C., & Salazar, J. (2011). Aplicación de la teoría de grafos en la solución de problemas con impacto ambiental. . Portugal . Coto, E. (2003). Algoritmos Básicos de Grafos. Caracas: Universidad Central de Venezuela. Facultad de Ciencias. Mohmed Fekry, A. (2016). Directed acyclic graph. Riad, Arabia Saudi : in linkedin. Sahu, R. (2021). Directed Acyclic graph in Compiler Design (with examples). India: geeksfor. Sanchez Torrubia, G., & Loranzo Terrazas, V. (2001). Algoritmo de Dijkstra. Un tutorial interactivo. Palma de Mallorca: VII Jornadas de Enseñanza Universitaria de la Informática. Wasserman, S., & Faust, K. (2013). Análisis de redes sociales: Métodos y aplicaciones. Madrid : Centro de Investigaciones Sociologicas.