III Proyecto Programado

TABLA DE CONTENIDOS:

*Descripción del problema

*Diseño del problema
-Decisiones de diseño
-Algoritmos usados

*Análisis del resultados
-Objetivos alcanzados
-Objetivos no alcanzados
-Razones

*Manual de usuario

*Lecciones aprendidas

Descripción del problema:
El siguiente proyecto programado trata de cubrir las necesidades de una pequeña empresa de mensajería, que ostenta algunos problemas, para medir la distancia entre distintos puntos, para realizar los viaje mas corto entre el origen y el destino, de forma eficiente de a cuerdo a lo que establece las necesidades de dicha empresa, ademas de crear un mapeado (grafo) con la información de cada bodega, como, nombre, latitud, longitud, ID, tipo, etc.
Entonces, en base a esto, se creo un programa en el Lenguaje C, que mediante grafos, se pudo enlazar todas las bodegas, ademas de medir la distancia entre cada bodega, de forma que se puede señalar las medidas de menor tamaño para realizar los viajes de mensajería. De esta forma se cumplió con lo requerido ademas de añadir algunas funciones mas para la practicidad del programa.

Diseño del problema:
Se trata de cubrir las necesidades del cliente, para enlazar las bodegas y ademas, determinar el camino mas corto entre dichas bodegas.

Decisiones de diseño:
Para esto se implemento un grafo no dirigido, para que cada bodega al ser conectada se interconecten ambas, y no solo una en una dirección, ademas de hacer uso de una lista de adyacencia para poder establecer el grafo.

La lista de adyacencia que se uso, es una representación del grafo, en forma de listas.
Nuestra lista de adyacencia se puede adaptar a N bodegas, ademas de tener la capacidad de reconocer cuando una bodega es de tipo central, para asi conectarse con todo el resto de bodegas.
Dentro del código nos referimos a la lista vertical como Vectores, y a las listas horizontales como Aristas.
Los vectores guardan la posicion de memoria de cada bodega, mientras que en las Aristas solo se guardar una copia del ID de la bodega, mas no la posición de memoria, esto con el fin de operar libremente.
Nótese que cada lista de adyacencia esta ordenada de menor a mayor, esto para hacer mas eficiente el programa.

Nuestro proyecto, constituye, de 5 archivos esenciales:

– Main.c:
En este archivo podemos encontrar el menú de nuestro programa
-Funciones.c
Aquí se aloja todo el código fuente, las distintas funciones que nuestro programa necesita para realizar los distintos trabajos que el proyecto requiere.

– Funciones.h
Aqui podemos encontrar las librerías, las definiciones, las estructuras, y el nombre de cada funcion, con fines de ordenamiento, y fácil entendimiento de lo que el proyecto estipula.
– Archivo.csv
Archivo externo, con extencion .csv, que se usa para cargar un grafo, son datos del usuario que especifican las características de distintas bodegas.
– Makefile
Este nos permite ejecutar nuestro proyecto desde el terminal.


Ademas, Nuestro proyecto hizo uso de algunas librerías adicionales para realizar operaciones.
Aparte de las librerías ya conocidas como:
contiene las funciones básicas de C.
#include <stdio.h>

Hice uso de algunos comandos aparte de los conocidos, como, atoi, atof, atol para realizar conversiones de string a distintos tipos de datos.

#include <stdlib.h>

me permitio comparar srings

#include <string.h>

libreria con operadores matemáticos, usadas en haversine

#include <math.h>


Algoritmos usados:
Se hizo uso de una lista de adyacencia para representar el grafo, anteriormente mencionado.
Aparte del grafo se hicieron uso de algunos algoritmos para realizar trabajos específicos.

– Haversine:


La fórmula del semiverseno es una importante ecuación para la navegación astronómica, en cuanto al cálculo de la distancia de círculo máximo entre dos puntos de un globo sabiendo su longitud y su latitud.

Se uso haversine dentro del programa para poder calcular la posición del usuario y localizar la bodega mas cercana a su ubicación.


Floyd Warshall:

Es un algoritmo de análisis sobre grafos para encontrar el camino mínimo en grafos dirigidos
este algoritmo se uso para establecer el camino mas corto entre el origen y el destino.
Se hace uso de una matriz que es operada las veces que su vértice lo indica.
Se usa una serie de comparaciones entre variables de la matriz para establecer una tabla con todos los caminos mas cortos del grafo.

Análisis de Resultados:

a continuación se presentara los objetivos alcanzados y los no alcanzados, razones y métodos empleados.

Objetivos Alcanzados:

ConnectWarehouse:
Se logro conectar 2 bodegas entre si, con un distancia establecida, ademas de indicar si estas bodegas ya estaban conectadas o no.

DisconnectWarehouse: Se logro desconectar 2 bodegas, y validar la existencia de estas bodegas dentro del grafo.

LoadFile:
El programa es capaz de cargar un archivo .csv y crear un nuevo grafo a partir de estos datos.

DeleteWarehouse: El programa puede eliminar una bodega, y eliminar todas las conexiones que esta tenia.

PrinthGraph: Imprime un recorrido en anchura, se implemento la Cola, para poder realizar la impresión.

Haversine: El programa realiza las operaciones matemáticas necesarias para operar haversine, y dar como resultado la bodega mas cercana a tu ubicación

Floyd-Warshall:
El programa es capaz de ejecutar cuantas tablas sea necesaria a la hora de encontrar el camino mas corto, ademas de realizar las impresiones que se requieren y de resaltar las lineas que se mantienen.

Objetivos no alcanzados:
El programa no puede hacer un Pause y un clear, para limpiar el terminal.

Razones:
No se encontró una alternativa para System.pause y system.clear propios de windows.



Manual de usuario:

Al iniciar el programa Veremos el menú del usuario:

1- Conectar:
Esta opción nos permite conectar una bodega con otra, indicando un distancia entre ellas
Si los Ids ya se encuentra conectados, se retornara un aviso.

2- Desconectar:
Esta opción desconecta 2 bodegas conectadas, Si las bodegas no han sido conectadas anteriormente el programa lo especificara.

3- Agregar:
Con esta opción podremos conectar una bodega nueva, para ello tendremos que brindar algunos datos de la bodega tales como
– ID
– Nombre
– Latitud
– Longitud
– Tipo (puede ser auxiliar o central)

4- Eliminar:
Nos permite eliminar una bodega mediante ID.
Precaución- Si Usted elimina una bodega, eliminara también todas las conexiones que esta tenia, a su ves eliminaras la coneccion de otras bodegas hacia esta.


5- Imprimir Lista de adyacencia:

Al imprimir la lista de adyacencia se mostrara una lista de este estilo:

Donde la primera fila indicara los ID de los vectores, y al lado derecho de cada vector se ubicaran sus aristas.
Usamos “ // ” para definir a un valor nulo.


6- Imprimir Anchura:
Al imprimir Anchura veremos un tabla con tres indices.
1: GRAFO, es donde se almacenara el resultado del recorrido en anchura de arriba hacia abajo.
2: POP, Es el ultimo valor que sacamos de la cola, para efectos de revisión
3: COLA, El estado de la cola, es donde se encuentran los nodos que tengo que visitar y ver si se pueden agregar nuevos nodos descubiertos.

7- Cargar:
Carga un archivo .csv y lo agrega al grafo.

8- NextWarehouse:
Indicando tu Latitud y tu longitud determina la bodega mas cercana a tu posición.
Ademas de indicarte la distancia minina en la que se encuentra tu paquete y el nombre de la bodega en el que se encuentra.
Imprime también todas las tablas necesarias para llegar a la solución final de las distancias mínimas.


Lecciones aprendidas:
El uso de listas de adyacencias, matrices, y estructuras tipo grafo.
Ademas de reforzar los temas de arreglos, listas, y punteros.
Este proyecto, puso a prueba mis conocimientos en C, y estoy muy satisfecho de haberlo logrado, me hizo investigar muchas cosas, distintos tipos de comandos y librerías que me permitieran resolver los problemas que se me presentaron.
Agrego también que aprendí a usar el makefile, y de organizar mejor mi código, mediante un header, separando mis funciones, de mis estructuras y menú.

Progra 2 – Documentacion

Tabla de contenido

Descripcion del problema 2

Diseño del problema 2

Decisiones de diseño 2

Algoritmos usados 2

Análisis de resultados 2

Objetivos alcanzados 2

Objetivos no alcanzados 2

Razones 2

Manual de usuario 2

Lecciones aprendidas 3

Descripción del problema

El siguiente trabajo trata sobre un proyecto programado del curso Estructuras de datos. El proyecto se debe de realizar en le lenguaje de c y se trata de hacer un programa, acerca de los productos de un abastecedor, usando la estructura conocida como árbol para realizarlo. En el proyecto se debe de poder insertar nuevos productos, eliminar productos y también el buscar productos.

El trabajo quiere dar a entender el cómo se deben de manejar los productos de un abastecedor si usara un programa como este para la distribución de estos. Además de aprender el manejo de varios nodos en un mismo árbol.

Diseño del problema

Decisiones de diseño

Fácil menú. Una de las decisiones fue la de hacer un menú que fuera entendible para todo mundo y que no les resultara complicado a la hora de trata de entender como se usa el programa por lo que el menú trae bien claras las funciones que se pueden hacer.

El codigo del arbol fue lo mas eficiente y compacto posible, dentro de la funcion arbol, llama a otra funcion de balanceo, para darle valores a las distintas ramas que el arbol pueda adquirir.

Algoritmos usados

El algoritmo que se usará será el de una estructura de árbol binario autobalanceable AVL. La descripción de este tipo árbol es que siempre se mantiene balanceado el árbol y si acaso solo llega a diferir en una unidad el lado izquierdo que el derecho o viceversa. Si en algún momento se ingresa un nuevo nodo o se borra y el árbol no está balanceado entonces se procede a realizar unas rotaciones de los nodos para que al final el árbol quede balanceado.

Hay dos tipos de rotaciones: simples y dobles. Por un lado, las simples se dividen en simple a la izquierda y en simple a la derecha en las cuales solo hay que hacer un cambio en los nodos. Por otro lado, las dobles también se dividen en doble a la izquierda y en doble a la derecha y en estas hay que hacer un cambio antes de hacer la rotación simple.

Análisis de resultados

Objetivos alcanzados

-Manejo del árbol: El programa realiza la creación de un nuevo árbol, además de poder insertar nuevos nodos y eliminar estos.

-Rotaciones: Esta función se pudo hacer de manera exitosa, por lo que el árbol hace los movimientos necesarios a la hora de mover un nodo ya sea por cualquier razón.

-Inorden: Esta función era algo fácil de realizar ya que previamente se había hecho en la clase

Objetivos no alcanzados

No se pudo eliminar los nodos dentro del arbol avl.

No se pudo cargar un archivo.
No se pudo agregar productos.

Razones
eliminar nodos dentro del arbol, no se pudo por que eran muchas las validaciones, y no nos organizamos bien para poder dividirnos el trabajo.
No supimos como cargar un archivo csv



Manual de usuario

Después de que inicie el programa, este mismo lo guiara hacia un menú con el que podrá realizar las acciones de manera mas fácil. Una de las opciones que puede elegir es la de insertar un nuevo nodo con la que estará ingresando, en este caso, un nuevo producto del abastecedor. Si es el primero en ser ingresado, entonces se creará un nuevo árbol en el que se seguirán haciendo el resto de las inserciones mientras que, si ya existe un árbol, entonces solo se asegurará de que el árbol este balanceado y si no, hará los cambios respectivos.

Al igual que al ingresar, está la opción de eliminar un nodo, con lo que quitara el nodo solicitado y a la vez, si el árbol no está balanceado, se harán las rotaciones necesarias para que quede otra vez balanceado.

También está la opción de que el usuario pueda imprimir el árbol para así poder visualizar de una mejor forma lo que ha ido haciendo mientras insertaba y borraba nodos(si es que se han hecho).

Lecciones aprendidas

Este trabajo claramente nos hace manejar mejor los movimientos que pueden tener los nodos cuando se ocupan pasar de un nivel a otro. También se aprendió sobre la carga de otros tipos de archivo a un programa y que estos lo lean y ejecuten.

Reforzar los conocimientos en punteros, aplicación de arboles avl, y el correcto uso de la memoria.

Radix

Es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de forma individual, como los enteros pueden representar cadenas de caracteres (por ejemplo, nombres o fechas) y, especialmente, números en punto flotante especialmente formateados, radix sort no esta limitado a solo los enteros.
este método se puede considerar como una generalización de las urnas
consiste en hacer diversos montones de fichas cada uno caracterizado por tener en sus componentes un mismo dígito (letra si es alfabético) en la misma posición, estos montones se recogen en orden ascendente y se reparte en montones según el siguiente dígito de la clave

Resultado de imagen para Radix ordenamiento


Insercion

El algoritmo de ordenamiento por inserción es un algoritmo de fácil aplicación que permite el ordenamiento de una lista.

Su funcionamiento consiste en el recorrido por la lista seleccionando en cada iteración un valor como clave y compararlo con el resto insertándolo en el lugar correspondiente.


Resultado de imagen para ordenamiento por insercion

Merge Sort

El algoritmo de ordenamiento por mezcla, fue desarrollado por von neuman en 1945
La idea del algoritmo es dividir el problema en partes mas pequeñas, por eso es indispensable usar la recursividad
1- Si la lista es 0 o 1 entonces ya esta ordenada.
2- Dividir la lista desordenada en 2 sublista
3- Ordenar cada sublista recursivamente aplicando el ordenamiento Merge

El algoritmo Merge tiene el mismo tiempo de ejecución que el algoritmo Heap Sort




HEAP

Es un algorítmo de comparación que usa un heap para ordenar los elementos. También podemos decir que es un algorítmo de ordenamiento no recursivo, no estable con complejidad computacional.

Este algoritmo consiste en almacenar todos los elementos en un montículo y luego extraer el nodo que queda como raíz en iteraciones sucesivas obteniendo el conjunto ordenado.

Diseño 1
1. Se construye el Heap/Montículo a partir del arreglo original.
2. La raíz se coloca en el arreglo.
3. El último elemento del montículo se vuelve la raíz.
4. La nueva raíz se intercambia con el elemento de mayor valor de cada nivel.
5. Tras el paso anterior la raíz vuelve a ser el mayor del montículo.
6. Se repite el paso 2 hasta que quede el arreglo ordenado.


Resultado de imagen para heap sort


Burbuja-Intercambio

Publicado el 1962
Diseño:
1- Comparar A1, A,2 , si estan en orden se mantienen como estan, en caso contrario se intercambian entre si.
2- a continuacion se comparan los elementos 2 y 3 de nuevo se intercambian si es necesario.
3- El proceso continua hasta que cada elemento del vector ha sido comparado con sus elementos adyacentes y se han realizado con sus elementos adyacentes y se han realizado los intercambios necesarios.

El elemento cuyo valor es mayor sube posicion a posicion hacia el final de la lista, al igual que las burbujas de aire en un deposito o botella de agua.

Bucket Sort

Método de ordenamiento por casilleros

Clasificación de cubo es un algoritmo de comparación de clasificación que opera en elementos dividiéndolos en diferentes cubos y luego la clasificación de estos cubos individualmente. Cada cubo se clasifica individualmente usando un algoritmo de clasificación separado o aplicando el algoritmo de clasificación de cubo remisivamente. El ordenamiento de la cuchara es útil principalmente cuando la entrada está distribuida uniformemente en un intervalo.

«Cada casillero sólo puede contener los elementos que cumplan unas determinadas condiciones. En el ejemplo esas condiciones son intervalos de números. Las condiciones deben ser excluyentes entre sí, para evitar que un elemento pueda ser clasificado en dos casilleros distintos».