Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 36

Mate.

Discreta - Trabajo Parcial - Entrega Final


Matemática Discreta (MA265)

Universidad Peruana de Ciencias Aplicadas

Ingeniería de Sistemas y Computación |Ingeniería de Ciencias de la Computación

ORDENAMIENTO
TOPOLÓGICO DE UN
GRAFO ACÍCLICO DIRIGIDO

Trabajo Parcial
Team Members

Campos Elias, Julio Joaquín u202018789

Izquierdo Cristobal, Farid Josue u202015215

Hernández López Nicolás Martín u201011264

Picon La Torre, Xiomara Alessandra u202015999

Sanchez Villogas, Keni Abel u202018789

Ciclo 2021-01

Matemática Discreta

Profesor: Jonathan Sueros Zarat e


7 0
Sección: SI35
2

CONTENIDO

CONTENIDO................................................................................................................................
CONTENIDO................................................................................................................................ 2
INTRODUCCIÓN ......................................................................................................................... 3
¿Por qué es importante este trabajo? ......................................................................................................... 3
¿Qué software ha usado y por qué lo ha usado? ........................................................................................ 4
FUNDAMENTO TEÓRICO ................................ ........................................................................... 5
...........................................................................................................
1. Teoría de matemática ............................................................................................................... 5
1.1. ¿Qué es un grafo acíclico dirigido o DAG? ........................................................................................... 5
1.1.2 ¿Qué es un grafo?.............................................................................................................................. 7
1.1.3 ¿Qué es el ordenamiento topológico? ................................................................................................ 8
1.1.4 ¿Dónde se utiliza? // Aplicación en la vida real .................................................................................. 9
1.1.5 Terminología: ................................................................................................................................... 10
2. Teoría de Progra mació
Programació n.......................................................................................................... 15
mación
IDEA CONCEB IDA ..................................................................................................................... 18
CONCEBIDA
3.1 Mapa conceptual del programa ........................................................................................................... 19
3.2 Diagrama de flujo del programa .......................................................................................................... 20
IMPLEMENTACIÓN
IMPLEMENTAC IÓN ................................................................................................................... 21
3.1 Código del programa ........................................................................................................................... 21
3.2 Pantallazos del programa ejecutado ................................................................................................... 33
CONCLUSIONES....................................................................................................................... 35
BIBLIOGRAFÍA .......................................................................................................................... 36

Mat em át ica Discret a SI35

7 0
3

CHAP
INTRODUCCIÓN

1
El t ema investigado en el present e t rabajo es Ordenamient o Topológico, un algorit mo
que está diseñado para encont rar el orden de sus vértices de manera linear en un grafo
acíclico dirigido. Con él nos podemos dar cuent a acerca de la importancia de las
mat emát icas en la aplicación de algorit mos comput acionales, ya que nos demuest ran
cómo podemos ordenar valores aut omát icament e de una manera sencilla. Los
algorit mos empleados no sólo resuelven problem as relacionado a un orden, sino que
también desarrollan nuest ra capacidad lógica para gest ionar el orden de algunas tareas
de nuest ro día a día. Un ejemplo claro es el de ponerse los calcet ines antes de los zapat os,
o gest ionar el t iem po dedicado de una acción y ordenarlos por su importancia. Con este
enfoque en ment e, nuest ro objet ivo durant e este t rabajo ha sido el de im plement ar un
algorit mo que busque dar respuesta a la tarea encomendada.

¿Por q u é es i m p or t an t e est e t r ab aj o?
El t em a escogido, se enfrent a a la disyunt iva de enfocarnos en un t ipo específico de
grafos, dado nuestro enunciado. Los grafos acíclicos dirigidos o DAG, por su significado
en ingles Direct ed Acyclic Graph, son ut ilizados para relacionar datos ent re ellos sin que
terminen volviéndose un ciclo cerrado. Es important e est e t rabajo, ya que se va
comprendiendo, aprendiendo y analizando más sobre este tema, además, es el más
usado, porque permit e int erpret ar y entender el funcionamient o de fenómenos en
ciencias de la comput ación. Por ejemplo, en gest ión de tareas y análisis de redes
bayesianas. Esta última sirve para saber las probabilidades de las variables no
conocidas en base a variables que sí conocemos.

Mat em át ica Discret a SI35

7 0
4

¿Qu é so f t w ar e h a u sad o y p or q u é l o h a u sad o?


Para este proyect o hemos escogido trabajar el lenguaje de programación C++. Un
lenguaje robusto que ha sido ut ilizado como base para nuestra enseñanza desde el
inicio en la universidad en los cursos de la rama de programación. Est o t ambién nos
beneficia, ya que, como grupo diverso, nos encont ramos en diferentes ramas y ciclos
dent ro de la Escuela de Sistemas de la Información. La base ha sido la misma de t odas,
así que ut ilizaremos la consola de C++ una compet encia adquirida en el curso de
Programación 1.

Al mismo t iem po, hemos usado como IDLE o ent orno de programación a Visual St udio
2019, ya que consideramos que es el soft ware más complet o, que t iene las herramient as
necesarias para el t est ing y debugging cuando se programa. Adicionalment e también
resaltamos que el ent orno de trabajo es bastant e amigable.

Finalment e, para el desarrollo eficient e del present e trabajo como equipo, se ut ilizaron
herramient as colaborat ivas que nos permit ieron compart ir nuest ros punt os de vist a
fácilment e. Las herramient as que ut ilizaron fueron: What sApp, para la comunicación
constant e. Google Drive para compartir archivos, Discord y Google Meet para l as
llamadas y videoconferencias.

Mat em át ica Discret a SI35

7 0
5

CHAP
FUNDAMENTO TEÓRICO

2
1. Teoría de mat emát ica

1.1. ¿Qu é es u n g r af o acícl i co d i r i g i d o o DA


DAGG?
Un grafo acíclico dirigido o DAG, por su nombre en inglés Directed Acyclic Graph, es un
tipo de grafo que se utiliza en las ciencias de la computación y las mat emát icas que
represent an dat os relacionados ent re sí pero que no tiene ciclos cerrados. Es decir, que
cada vért ice se conect a con otro vértice y est e jamás vuelve al vértice inicial. Por
ejemplo, v →u no puede ser un subconjunto de u →v. En términos informales, se podría
decir que un DAG avanza en una sola dirección.

Not aci
acióón m at em át i ca d e u n g r af o acícl
acíclii co d i r i g i d o :

● Un grafo acíclico dirigido G es un par (V, E).


● V = {1, , n} es el conjunto de vértices.
● E ⊂ {(u, v): u, v ∈ V, u } es el conjunto de arcos.
● No hay ciclos dirigidos en G.

Mat em át ica Discret a SI35

7 0
6

Li st a d e A d y ace
acen
n ci
cia:
a: Representación de un grafo como list a de adyacencia

0 → 1 → 2 → 3
1 → 3 → 6
2 → 4
3 \ →
4 → 6 → 7
5 → 1
6 \ →
7 \

M at r i z d e ad y acen
cencci a: Represent ación de un grafo como mat riz de adyacencia

0 1 2 3 4 5 6 7
0 1 1 1
1 1 1
2 1
3
4 1 1
5 1
6
7

Rep r esen t aci


ación
ón g r áf
áfii ca:

Mat em át ica Discret a SI35

7 0
7

1.1.2 ¿Qu é es u n g r af o ?
Los grafos son un conjunt o de objet os llamados nodos o vért ices donde se almacenan
dat os, gráficament e estos se representan por punt os o círculos. Est os puntos a su vez
est án unidos por unos enlaces llamados arist as, que están represent ados gráficament e
por unas líneas.

A lo largo del t iempo, los grafos se han utilizado para est udiar las int errelaciones que
exist en ent re las unidades que int eract úan unas con otras.

La import ancia de los grafos en el mundo actual es de gran import ancia, ya que nos
permit e modelar problemas que trascienden las ciencias exactas (mat emát icas,
comput acionales, et c.). Actualment e, se ut ilizan con gran frecuencia para resolver
problemas de ciencias sociales y est án present es en toda la era de la nube y las redes
sociales.

Mat em át ica Discret a SI35

7 0
8

1.1.3 ¿Qu é es el or d en am i en t o t op
opool óg i co
co??
El ordenamient o t opológico es un ordenamient o lineal de todos los nodos de un grafo.
Donde los diferent es nodos empleados en el ordenamient o poseen un valor o peso
(usualment e establecido por el usuario). De tal manera que, si un element o X t iene un
valor mayor al element o Y, ent onces el elemento X es posicionado primero. En
programación se ut iliza el algoritmo DFS para resolver est e problem a, que a su vez
utiliza la recurrencia como mét odo eficiente.

Mat em át ica Discret a SI35

7 0
9

1.1.4 ¿Dón d e se u t i l i za
za?
? / / A p l i caci
acióón en l a v i d a r eal
Casos donde podemos utilizar los grafos:

● Algorit mos de Scheduling o gest ión de tareas en los sist emas operat ivos. Los DAGson
usados para generar grafos de asignación de recursos. Est o permit e crear un grafo
para la ejecución de procesos de acuerdo con los dist intos parámet ros del sist ema.

● Análisis de redes bayesianas, es un m odelo gráfico probabilístico que represent a un


conjunt o de variables aleat orias y sus dependencias condicionales a t rav és de un
grafo acíclico dirigido. Est o result a muy útil en computación y en ot ras ramas de las
ciencias como epidemiología y la inteligencia art ificial.

Los DAG han result ado de gran ut ilidad, ya que perm it e interpretar y ent ender el
funcionamient o de fenómenos dent ro de cada rama de las ciencias en computación.

Mat em át ica Discret a SI35

7 0
10

1.1.5 Ter m i n ol og ía
ía::

● Gr af o: Conjunt o de objet os formados por nodos y aristas.


● Or d en am
amii en co:: Tipo de ordenamient o lineal de todos los nodos de
entt o T op ol óg i co
un grafo.
● Gr af o A cíc
ícll i co: Un tipo de grafo donde no exist en bucles o ciclos.
● DFS
FS:: Por su nombre en inglés Depth First Search, es un algorit mo de búsqueda
de profundidad ut ilizado para recorrer todos los nodos de un grafo de manera
ordenada.

Ej er
ercci ci o 1:

1-Preparación de panqueque, t al como se m uestra en el grafo se ve los pasos para


preparar un panqueque, puede result ar un poco confuso al leerlo.

Mat em át ica Discret a SI35

7 0
11

Por ello, se aplicó el t ema que est amos viendo, el cual es ordenamiento t opológico a
nuest ro grafo. Dando como resultado el siguient e gráfico, donde se puede apreciar
mejor los pasos de la preparación de un panqueque.

Los cuales son:

Se agrega una cucharadit a de aceit e junto con un huevo y ¾ de leche a una taza de
mezcla. Luego, caliente el jarabe y se vierte ¼ de la taza. Por consiguient e, se voltea
cuando est a burbujee mient ras se calent aba la plancha. Finalment e, a comer.

Mat em át ica Discret a SI35

7 0
12

Ej er
ercci ci o 2:

2-Iniciar sesión en Facebook, t al como se muest ra en el grafo se ve los pasos para


ingresar a Facebook, puede result ar un poco confuso al leerlo.

Por ello, se aplicó el ordenamient o t opológico a nuest ro grafo. Dando como resultado el
siguient e gráfico, donde se puede apreciar mejor los pasos de cómo ingresar a
Facebook.

Los cuales son:

Primero se debe prender la comput adora, luego revisar la conexión de int ernet .
Después abrir el navegador de Google y buscar Facebook. Luego, ingresa t u correo y
contraseña. Finalment e, iniciar sesión.

Mat em át ica Discret a SI35

7 0
13

Ej er
ercci ci o 3:

3-Preparar Limonada, t al como se muest ra en el grafo se ve los pasos para preparar una
rica limonada, puede result ar un poco confuso al leerlo.

Por ello, se aplicó el ordenamient o t opológico a nuest ro grafo. Dando como result ado el
siguient e gráfico, donde se puede apreciar mejor los pasos de cómo preparar una rica
lim onada.

Los cuales son:

Primero se debe cortar los limones, luego exprimir los limones. Después, vert er en una
jarra m ient ras echas el agua hervida, luego echar azúcar y remover. Finalment e servir y
a disfrut ar la limonada.

Mat em át ica Discret a SI35

7 0
14

Ej er
ercci ci o 4:

4-Est udiar para un examen, t al como se muestra en el grafo se ve los pasos que se debe
hacer para est udiar en un examen, puede result ar un poco confuso al leerlo.

Por ello, se aplicó el ordenamient o t opológico a nuest ro grafo. Dando como result ado el
siguient e gráfico, donde se puede apreciar m ejor los pasos de cómo estudiar para un
examen.

Los cuales son:

Primero se debe saber la fecha del examen para poder escoger el día que se v a a
est udiar. Después, se debe ver el curso del cual es el examen, luego agarrar el cuaderno
para ver qué temas se van a estudiar. Finalment e, leer y est udiar, suert e en el examen.

Mat em át ica Discret a SI35

7 0
15

2. Teoría de Programación
Para la t eoría de la programación vamos a hacer uso del ordenamient o topológico. El
ordenamient o t opológico es un mét odo de ordenamient o que se vale de más de un
algorit mo para poder llevar a cabo sus tareas. Para nuestros fines hemos ut ilizado el
algorit mo Depth-First Search, más conocido por su acrónimo DFS.

Dept h-First Search o DFS es un algorit mo para recorrer o buscar est ructuras de dat os en
un árbol o grafo. El algorit mo comienza en el nodo raíz (seleccionando aleat oriament e)
y se expande dent ro de una de las ramas has que encuentre lo más profundo de un
árbol, solo si la búsqueda conduce a un callejón sin salida, se reviert e la búsqueda y se
expande hacia los nodos de niveles menos profundos. La est ructura de datos en la que
se apoya el DFS es una pila.

Una pila o stack es una est ructura de dat os ordenada que permit e almacenar y
recuperar dat os, siendo el modo de acceso a sus element os de tipo LIFO (del inglés Last

dos operaciones básica: primero, apilar (push), que coloca un objet o en la pila y
segundo, desapilar (pop), que ret ira el últ imo element o apilado.

Mat em át ica Discret a SI35

7 0
16

• A l g or i t m o DFS
DFS::

Algorit mo 1: DFS
Dat a: G: grafo, s: vértice de inicio
Result: Recorrido DFS del grafo
1 visit ado[s] ← True;
2 para cada arist a (s; v) hacer
3 si no visit ado[v] ent onces
4 DFS(G,v)
Orden Topológico
• A l g or i t m o DFS m od i f i cad
adoo p ar
araa or
ordd en ar d e m an er a t op ol óg i ca:

Algorit mo 2: DFS
Dat a: G: grafo, s: vért ice de inicio
Result: Recorrido DFS del grafo
1 visit ado[s] ← True;
2 para cada arist a (s; v) hacer
3 si no visit ado[v] ent onces
4 DFS(G,v)
5 ot ← ot U {v}
Orden Topológico
• Gr áfi
áfi co q u e d em
emuu estr
st r a d e in
in i ci o a f i n com o t r ab
abaaj a p aso
aso a p aso
aso el alg
alg or i t m o d e
DFS
FS::

Mat em át ica Discret a SI35

7 0
17

Finalment e, para nuest ro proyecto, hemos decidido utilizar el IDE Visual St udio 2019,
ya que creemos que es el más adecuado debido a que tiene las bibliot ecas y
herramient as virt uales necesarias para un t rabajo eficient e. Además de tener
conocimient o sobre el manejo de esta herramient a, sobre t odo aplicado al lenguaje C++.
La vent aja principal es que t odo nuest ro grupo conoce est e software y los conceptos del
lenguaje C++ gracias a los cursos de Programación 1 y 2. Si bien es cierto, el ecosist ema
es bastant e como de trabajar, su desvent aja más evidente es que est e softw are no
adm it e el trabajo colaborat ivo.

Mat em át ica Discret a SI35

7 0
18

Ciclo 2018-02 | Sección XXXX


CHAP
IDEA CONCEBIDA

3
El proyect o consist e en aplicar una variant e del tradicional algorit mo de ordenam ient o
topológico, ya que, para est e enunciado, hemos tenido que utilizar una combinación de
métodos para lograr nuest ro objet ivo. Básicament e nuestra meta es hacer una
búsqueda dent ro de un grafo acíclico dirigido, donde cada nodo cuenta con un peso
diferent e, t al que ordene los diferentes grupos de cada grupo de manera descendent e
gracias a sus respect ivos pesos. Si el nodo X cont iene las caract erísticas para est ar antes
o después del nodo, se alt eraría su posición. Mayorment e est e t ipo de ordenamient o es
aplicado con rut inas o t areas diarias, de tal manera que hay una precedencia a la hora
de ejecutar dichas t areas. Finalmente se obtiene una lista lineal ordenada de los nodos
est ablecidos.

Para entender más este trabajo se realizará un mapa conceptual donde est e explicado
su funcionamient o. Además, se hará un diagrama flujo del código para su
entendimient o. Finalment e, cada part e del mapa concept ual est ará detallado más
abajo.

Mat em át ica Discret a SI35

7 0
19

3.1 M ap a con cep


eptt u al d el p r og r am
amaa

1. Primero se crea una clase nodo la cual t iene como variable nodo, un booleano
guardado y u vect or nodo.

2. Luego se creará una función mayor la cual será para hallar el mayor valor del
nodo.

3. Después de creará una función validación error, en la cuales se mostrará un


mensaje de error cuando el ordenamient o falle.

4. Finalment e se validará en el Main, donde crearemos nodos con un for, además de


crear conexiones con dos for y dos if, est o servirá para poder crear las relaciones
que tiene cada nodo. Luego se mostrará la lista formada por los nodos y
conexiones, después se generarán y ordenarán grupos de nodos para que sea
más fácil saber cuál ira primero, segundo y así sucesivament e.

Mat em át ica Discret a SI35

7 0
20

3.2 Di ag r am
amaa d e f l u j o d el p r og r am a

Fi g ur a 1: Di ag r am a d e f l u jo d el p r og
ogrr am a

Nuest ro diagrama de flujo tiene un solo m aiain


n t h r ead como se puede apreciar en la
imagen. Nuestro program a se puede dividir en dos grandes aspect os el programa, part e
manual, donde se necesit a a un usuario y part e automática a cargo del algorit mo. En la
parte manual est án se encuent ran los dos primeros pasos. Primer paso, ejecut ar el
programa. Segundo paso, ingresar un input que en est e caso det ermina el número de
nodos, el número de nodos N ∈ [9, 12] . La part e aut omát ica est á a cargo de nuest ro
algorit mo que crea nodos con valores aleat orios, t ambién crea las conexiones, revisa
que no sea exist a un ciclo cerrado, ya que buscamos crear un grafo acíclico dirigido,
mostramos nuest ra list a de adyacencia y luego la ordenamos recorriendo cada nodo y
comparando sus conexiones. Finalment e, most ramos nuest ra list a de adyacencia
ordenada y si existe un error por ser núm eros y arist as aleat orias, mostramos el error.

Mat em át ica Discret a SI35

7 0
21

Ciclo 2018-02 | Sección XXXX


CHAP
IMPLEMENTACIÓN

4
En est e capít ulo se evidencia el código implement ado para resolver el enunciado. Este
código cuenta con un menú principal, una present ación del enunciado invest igado,
donde se det allan algunos conceptos básicos necesarios para ent ender que es un grafo
acíclico dirigido y que algorit mo se ut ilizado, así como t ambién el programa en sí y
finalment e, una breve descripción de los int egrant es.

3.1 Có d i g o d el p r og r am
amaa
1 #include <iostream>
2 #include <windows.h>
3 #include<conio.h>
4 #include <vector>
5 #include <time.h>
6 using namespace std;
7 using namespace System;
8 class Nodo
9 {
10 public:
11 int peso;
12
bool guardado = false;
13
vector<Nodo*> conexiones;
14
};
15
16
int Mayor(vector<Nodo*>& nodos)
17
{
18
int mayor = -1;
19
for (int i = 0; i < nodos.size(); i++)
20
{
Mat em át ica Discret a SI35

7 0
22

21 if (nodos[i]->peso > mayor)


22 mayor = nodos[i]->peso;
23 }
24 return mayor;
25 }
26
27 void ejecuta(int n, int& cont, bool& error, int& nErrores) {
28
29 srand(time(NULL));
30 //int n = 9;
31
32
//CREAR NODOS
33
vector<Nodo*> nodos;
34
for (int i = 0; i < n; i++)
{
Nodo* n = new Nodo();
n->peso = rand() % 100;
nodos.push_back(n);
}

// CREAR CONEXIONES
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (rand() % 2 == 0)
{
if (rand() % 3 == 0)
nodos[i]->conexiones.push_back(nodos[j]);
}
}
}

//GENERAR GRUPOS
vector<vector<Nodo*>> grupos;
for (int i = 0; i < n; i++)
{
Mat em át ica Discret a SI35

7 0
23

if (nodos[i]->guardado == false) // Verificar si ya fue visitado


{
vector<Nodo*> grupo;

grupo.push_back(nodos[i]); // Añadir a un grupo


nodos[i]->guardado = true; // Marcar como visitado

vector<Nodo*> conexiones = nodos[i]->conexiones; // Vector de


conexion para el grupo

//cout << "conexiones: " << conexiones.size();


while (conexiones.size() > 0) //Si el nodo tiene conexiones
{
if (cont > 100) {
error = true;
nErrores++;
return;
}
cont++;
//cout << "nodo: " << nodos[i]->guardado;
for (int j = 0; j < conexiones.size(); j++)
{
// cout << "conexion: " << conexiones[j];
if (conexiones[j]->guardado == false)
{
grupo.push_back(conexiones[j]);
conexiones[j]->guardado = true;
conexiones = conexiones[j]->conexiones; //Conexion del siguiente
nodo
break;
}
}
}

if (grupo.size() > 0)
{
grupos.push_back(grupo);
Mat em át ica Discret a SI35

7 0
24

}
}

}
error = false;

//MOSTRAR LISTA ENLAZADA

Console::SetCursorPosition(15, 9);
Console::ResetColor();
cout << "Grafo aciclico dirigido no ordenado:" << endl;
int x = 15;
int y = 10;
for (int i = 0; i < n; i++)
{
Console::SetCursorPosition(x, y);
cout << "[" << i << "] " << nodos[i]->peso << " -> ";
for (int j = 0; j < nodos[i]->conexiones.size(); j++)
cout << nodos[i]->conexiones[j]->peso << " ";
cout << endl;
y++;
}

//ORDENANDO LOS GRUPOS


for (int i = 0; i < grupos.size(); i++)
{
for (int j = 0; j < grupos.size(); j++)
{
if (Mayor(grupos[i]) > Mayor(grupos[j]))
{
swap(grupos[i], grupos[j]);
}
}
}

//CREAR RESPUESTA
Mat em át ica Discret a SI35

7 0
25

vector<Nodo*> res;
for (int i = 0; i < grupos.size(); i++)
{
for (int j = 0; j < grupos[i].size(); j++)
{
res.push_back(grupos[i][j]);
}
}

Console::ForegroundColor = ConsoleColor::Yellow;

Console::SetCursorPosition(15, 24);
cout << "-------Se despreciaron los pesos-------" << endl;
Console::SetCursorPosition(15, 25);
Console::ForegroundColor = ConsoleColor::White;
cout << "Grafico ordenado:" << endl;
x = 15;
y = 27;
//MOSTRAR LISTA ENLAZADA
for (int i = 0; i < n; i++)
{
Console::SetCursorPosition(x, y);
cout << "[" << i << "] " << res[i]->peso << " -> ";
for (int j = 0; j < res[i]->conexiones.size(); j++)
cout << res[i]->conexiones[j]->peso << " ";
cout << endl;
y++;
}
Console::ForegroundColor = ConsoleColor::Green;
Console::SetCursorPosition(40, 39);
cout << "Presione Enter para volver al menu...";
Console::ResetColor();

}
void bienvenida()
{
Mat em át ica Discret a SI35

7 0
26

Console::ForegroundColor = ConsoleColor::Blue;
for (int i = 2; i < 100; i++) {// linea horizontal
Console::SetCursorPosition(i, 3); cout << char(205);// linea horizontal parte
de arriba
Console::SetCursorPosition(i, 40); cout << char(205);// linea horizontal
parte de abajo
}
for (int i = 4; i < 40; i++) {// linea vertical
Console::SetCursorPosition(2, i); cout << char(186);// linea vertical primera
Console::SetCursorPosition(100, i); cout << char(186);// linea vertical
segunda

// para las termianciones de esquina


Console::SetCursorPosition(100, 3); cout << char(187);
Console::SetCursorPosition(100, 40); cout << char(188);
Console::SetCursorPosition(2, 40); cout << char(200);
Console::SetCursorPosition(2, 3); cout << char(201);
}

Console::SetCursorPosition(25, 6);
Console::ForegroundColor = ConsoleColor::Cyan;
cout << "Ordenamiento Topologico en un Grafo Aciclico Dirigido";
Console::ForegroundColor = ConsoleColor::White;
Console::SetCursorPosition(10, 10);
cout << "Definicion: ";
Console::SetCursorPosition(10, 11);
cout << "Un grafo aciclico dirigido es un tipo de grafo que representa datos
relacionados";
Console::SetCursorPosition(10, 12);
cout << "entre si pero que no cuenta con ciclos cerrados. Es decir, que cada
vertice del";
Console::SetCursorPosition(10, 13);
cout << "grafo se conecta con otro vertice y este jamas vuelve a apuntar al
vertice";
Console::SetCursorPosition(10, 14);
cout << "inicial. Por ejemplo, v-> u no puede ser un subconjunto de u-> v. En
terminos";
Mat em át ica Discret a SI35

7 0
27

Console::SetCursorPosition(10, 15);
cout << "informales, también podriamos decir que el grafo avanza en una sola
direccion";

Console::SetCursorPosition(10, 17);
cout << "Algoritmo:";
Console::SetCursorPosition(10, 18);
cout << "Para nuestros propositos hemos investigado sobre el funcionamiento
del algoritmo";
Console::SetCursorPosition(10, 19);
cout << "ordenamiento topologico en un grafo aciclico dirigido con pesos. Para
comenzar,";
Console::SetCursorPosition(10, 20);
cout << "debemos mencionar que el objetivo de este algoritmo es la ordenación
lineal de ";
Console::SetCursorPosition(10, 21);
cout << "todos los nodos del grafo. Por otro lado, este algoritmo tiene un
tiempo";
Console::SetCursorPosition(10, 22);
cout << "asintotico de O(|V|+|E|), es decir que el tiempo de ejecucion es la
cantidad ";
Console::SetCursorPosition(10, 23);
cout << "maxima de nodos mas la cantidad de aristas.";
Console::ForegroundColor = ConsoleColor::Green;
Console::SetCursorPosition(40, 27);
cout << "Presione Enter para volver al menu...";
Console::ResetColor();
}

void integrantes()
{
Console::ForegroundColor = ConsoleColor::Blue;
for (int i = 2; i < 100; i++) {// linea horizontal
Console::SetCursorPosition(i, 3); cout << char(205);// linea horizontal parte
de arriba
Console::SetCursorPosition(i, 40); cout << char(205);// linea horizontal
parte de abajo
Mat em át ica Discret a SI35

7 0
28

}
for (int i = 4; i < 40; i++) {// linea vertical
Console::SetCursorPosition(2, i); cout << char(186);// linea vertical primera
Console::SetCursorPosition(100, i); cout << char(186);// linea vertical
segunda

// para las termianciones de esquina


Console::SetCursorPosition(100, 3); cout << char(187);
Console::SetCursorPosition(100, 40); cout << char(188);
Console::SetCursorPosition(2, 40); cout << char(200);
Console::SetCursorPosition(2, 3); cout << char(201);
}
Console::SetCursorPosition(10, 10);
Console::ForegroundColor = ConsoleColor::Cyan;
cout << "Integrantes:" << endl;
Console::ForegroundColor = ConsoleColor::Yellow;
Console::SetCursorPosition(10, 12);
cout << "Xiomara Alessandra Picon La Torre" << endl;
Console::SetCursorPosition(10, 14);
cout << "Farid Josue Izquierdo Cristobal" << endl;
Console::SetCursorPosition(10, 16);
cout << "Julio Joaquin Elias Campos" << endl;
Console::SetCursorPosition(10, 18);
cout << "Keni Abel Sanchez Villogas" << endl;
Console::SetCursorPosition(10, 20);
cout << "Nicolas Martin Hernandez Lopez" << endl;

Console::ForegroundColor = ConsoleColor::DarkMagenta;
Console::SetCursorPosition(10, 23);
cout << "Seccion: SI35" << endl;
Console::SetCursorPosition(10, 24);
cout << "Profesor: Jonathan Sueros Zarate";
Console::ResetColor();

int main()
Mat em át ica Discret a SI35

7 0
29

{
int n, cont, nErrores = 0;
bool error, validaN = false;

int opc;
do
{
Console::Clear();

Console::ForegroundColor = ConsoleColor::DarkMagenta;
Console::SetCursorPosition(30, 0);
cout << "==========================================";
Console::SetCursorPosition(30, 1);
cout << "| Curso: Matematica Discreta |" << endl;
Console::SetCursorPosition(30, 2);
cout << "| Seccion: SI35 |" << endl;
Console::SetCursorPosition(30, 3);
cout << "| Profesor: Jonathan Sueros Zarate |";
Console::SetCursorPosition(30, 4);
cout << "==========================================";

Console::SetCursorPosition(10, 7);
Console::ForegroundColor = ConsoleColor::Cyan;
cout << "Ordenamiento Topologico en un Grafo Aciclico Dirigido." << endl
<<endl <<endl;

Console::ForegroundColor = ConsoleColor::White;
cout << "|| El presente programa es producto de nuestra investigacion
realizada || " << endl;
cout << "|| para el curso de Matematica Discreta. || " <<
endl;
cout << "|| || " << endl;
cout << "|| Este curso es dictado por el profesor Jonathan Sueros Zarate en el
|| " << endl;

Mat em át ica Discret a SI35

7 0
30

cout << "|| ciclo 2021-I para las carreras de la Escuela de Ingenieria de ||
" << endl;
cout << "|| Sistemas y Computacion de la UPC. || " <<
endl;
cout << "|| || " << endl << endl;

Console::SetCursorPosition(30, 17);
Console::ForegroundColor = ConsoleColor::DarkRed;
cout << "MENU" << endl;
Console::ForegroundColor = ConsoleColor::White;
Console::SetCursorPosition(20, 19);
cout << "1. Presentacion" << endl;
Console::SetCursorPosition(20, 20);
cout << "2. Ejecutar programa" << endl;
Console::SetCursorPosition(20, 21);
cout << "3. Integrantes" << endl;
Console::SetCursorPosition(20, 22);
cout << "4. Salir" << endl;
Console::SetCursorPosition(20, 23);
cout << "Ingrese opcion: ";
cin >> opc;

system("cls");
if (opc == 1)
{
bienvenida();
Console::CursorVisible = false;
_getch();
}
else if (opc == 2)
{
do {
validaN = false;
Console::ForegroundColor = ConsoleColor::Blue;
for (int i = 2; i < 100; i++) {// linea horizontal

Mat em át ica Discret a SI35

7 0
31

Console::SetCursorPosition(i, 1); cout << char(205);// linea


horizontal parte de arriba
Console::SetCursorPosition(i, 40); cout << char(205);// linea
horizontal parte de abajo
}
for (int i = 4; i < 40; i++) {// linea vertical
Console::SetCursorPosition(2, i); cout << char(186);// linea vertical
primera
Console::SetCursorPosition(100, i); cout << char(186);// linea
vertical segunda

// para las termianciones de esquina


Console::SetCursorPosition(100, 1); cout << char(187);
Console::SetCursorPosition(100, 40); cout << char(188);
Console::SetCursorPosition(2, 40); cout << char(200);
Console::SetCursorPosition(2, 1); cout << char(201);
}
//Console::SetCursorPosition(15, 2);
//cout << "";

Console::ForegroundColor = ConsoleColor::White;
Console::SetCursorPosition(15, 4);
cout << "En este primer paso, te pedimos que ingreses un numero entre
9 y 12, para" << endl;
Console::SetCursorPosition(15, 5);
cout << "generar un grafo de n aristas. Cuando hayas finalizado
presiona Enter. " << endl << endl;
Console::SetCursorPosition(15, 7);
Console::ForegroundColor = ConsoleColor::DarkMagenta;
cout << "Ingresa el valor: ";

cin >> n;
if (n < 9 || n > 12)
validaN = true;
else
break;
} while (validaN);
Mat em át ica Discret a SI35

7 0
32

do {
cont = 0;

ejecuta(n, cont, error, nErrores);


} while (error);

_getch();
}
else if (opc == 3)
{
integrantes();
Console::CursorVisible = false;
_getch();
}
else if (opc == 4) {
Console::SetCursorPosition(20, 10);
Console::ForegroundColor = ConsoleColor::Green;
cout << "Fue un gusto conocernos... Adios!";
Sleep(2000);
exit(3);
return 3;
}

} while (opc != 4);


_getch();

system("pause");
return 0;
}

Mat em át ica Discret a SI35

7 0
33

3.2 Pan t al l azo


zoss d el p r og r am
amaa ejecu
ecutt ad o
En est a sección se han colocado los pant allazos del proyecto finalizado.

• Pant alla de inicio

• Present ación

• Programa ejecutado correctamente sin errores:

Mat em át ica Discret a SI35

7 0
34

• Int egrantes

Mat em át ica Discret a SI35

7 0
35

Ciclo 2018-02 | Sección XXXX


CHAP
CONCLUSIONES

5
1. La realización de est e t rabajo demanda una serie de conocimientos previos de
Programación I y II.

2. Para la realización del código se t iene que realizar un diagrama de flujos para
poder dist ribuir las funcionalidades del programa.

3. Es import ant e la actit ud del grupo al ser aut odidact a sobre los t emas ext ernos, ya
que hemos invest igado las distint as variedades de comandos y algorit mos que
se necesit ó para implement ar el código.

4. El trabajo ha sido complicado, pero de mucha ayuda, ya que nos permit e


entender conceptos informát icos avanzados, así como sus aplicaciones en
dist intos aspectos de la vida cotidiana.

5. Es de mucha ayuda cont ar con un ent orno de desarrollo interactivo, para facilit ar
la programación, es muy út il con los errores inesperados, ya que nos muest ra
pequeños errores de sintaxis en t iempo real. En est e caso, para el lenguaje C++
utilizamos Visual St udio que cuent a con Intellisense.

Mat em át ica Discret a SI35

7 0
36

BIBLIOGRAFÍA

Gonzáles, J. (2002). Definiciones: conjuntos, grafos y árboles. Recuperado de


ht tp://www.profesores.elo.ut fsm.cl/~agv/elo320/01and02/definiciones/set GraphTre
e.pdf.

Coto, E. (2003). Algorit mos Básicos de Grafos. Recuperado de


ht tps://d1wqtxts1xzle7.cloudfront.net /40820165/CotoND200302.pdf?1450563931

Werlinger, F. (2018). Aplicación de grafo acíclicos dirigidos en la evaluación de un set


mínimo de ajust e de confusores: complement o al modelamient o estadístico en
est udios epidemiológicos observacionales. Recuperado de
ht tps://scielo.conicyt .cl/pdf/rmc/v146n7/0034-9887-rmc-146-07-0907.pdf.

Velarde, A. (2018). Generación de grafos dirigidos acíclicos mediant e mét odos


aleat orios para la planificación de t areas. Recuperado de
ht tps://dialnet .unirioja.es/servlet /articulo?codigo=6839147

Mat em át ica Discret a SI35

7 0

También podría gustarte