324 – T. P. Lapso 2016-1 1/8 UNIVERSIDAD NACIONAL ABIERTA VICERRECTORADO ACADÉMICO ÁREA INGENIERÍA TRABAJO PRÁCTICO: ASIGNATURA: COMPUTACIÓN II CÓDIGO: 324 FECHA DE ENTREGA DE LAS ESPECIFICACIONES AL ESTUDIANTE: A partir de la primera semana de aplicación de pruebas, a través del asesor de la asignatura en su centro local FECHA DE DEVOLUCIÓN DEL INFORME POR EL ESTUDIANTE: Adjunto a la Prueba Integral NOMBRE DEL ESTUDIANTE: CÉDULA DE IDENTIDAD: CORREO ELECTRÓNICO: TELEFONO: CENTRO LOCAL: CARRERA: 236 NÚMERO DE ORIGINALES: FIRMA DEL ESTUDIANTE: LAPSO: 2016-1 UTILICE ESTA MISMA PÁGINA COMO CARÁTULA DE SU TRABAJO RESULTADOS DE CORRECCIÓN: OBJ N° 5 6 7 0:NL 1:L Especialista: María E. Mazzei Ingeniería de Sistemas Evaluador. Sandra Sánchez 324 – T. P. Lapso 2016-1 2/8 ESPECIFICACIONES DEL TRABAJO PRÁCTICO Este trabajo se basará en el Objetivo No. 5 del Módulo II y los objetivos 6 y 7 correspondientes al Módulo III. En él se evidenciará las habilidades y destrezas adquiridas por el estudiante, al momento de implementar algoritmos para la resolución de problemas empleando la estructura de Grafos, así como algoritmos de ordenación y búsqueda en Lenguajes de Programación. Objetivo 5 Una empresa dedicada a la distribución, mantenimiento y surtido de máquinas expendedoras de café, debe realizar recorridos frecuentes a efecto de cumplir sus labores en las máquinas dispuestas en diferentes puntos de una región urbana. Para ello debe hacer un recorrido tal que partiendo de la sede principal, debe pasar por todos los lugares en donde están instaladas dichas máquinas. En vista de los gastos de gasolina, repuestos y otros factores incidentes en el funcionamiento de los vehículos, se requiere hacer un estudio de las rutas. Para ello usted deberá simular una región con M máquinas distribuidas en diferentes puntos y generar una red de vías que las conecte y determinar la mejor ruta a seguir. Sobre la base de la situación presentada, se pide elaborar un programa en lenguaje de programación C++ (o Dev C++) que realice lo siguiente: a- Lea un valor m > 20, que represente el número de máquinas distribuidas en la región, y construya los arcos correspondientes a la red de ubicación de dichas máquinas empleando números aleatorios. También debe asignar las longitudes de cada trayecto entre cada par de máquinas que estén comunicadas por una vía, empleando números aleatorios entre 1 y 100, (ver explicación sobre los números aleatorios al final). b- Imprima la matriz de Adyacencia que corresponde a la red generada. Se establecerá que la vía entre las máquinas i y j es la Especialista: María E. Mazzei Ingeniería de Sistemas Evaluador. Sandra Sánchez 324 – T. P. Lapso 2016-1 3/8 misma que la existente entre las máquinas j e i, por lo cual su distancia será la misma. c- Determine la ruta de costo mínimo que deberá seguir el vehículo que efectúa la ruta de mantenimiento y surtido de las máquinas, de manera que las visite a todas. Para ello se sugiere la aplicación de un algoritmo el cual se esbozará mas adelante. d- Imprima la ruta mínima y su costo (en Kms.). e- Presente en una hoja adjunta a su trabajo un esquema del TAD grafo con el que Ud. ha trabajado, que incluya las operaciones que permitieron resolver el problema e incluya otras operaciones posibles. Método a emplear Para obtener la red de costo mínimo que garantice que sean visitadas todas las máquinas, se debe construir el árbol mínimo expandido. Un árbol mínimo expandido es una estructura que contiene todos los vértices o nodos, conectados de manera que el costo de recorrido es mínimo y además es una forma de detectar si la red está conectada ya que el grafo original debe ser conexo. Existen dos algoritmos eficientes que permiten construir esta estructura que son: el algoritmo de Kruskal y el algoritmo de Prim. A continuación presentamos el esquema del algoritmo Kruskal en seudo lenguaje. Algoritmo Kruskal 1-Ordene todos los arcos en forma no decreciente de acuerdo a su peso(longitudes en Km) 2-Seleccione el arco con menor costo y verifique si este forma un ciclo con el árbol expandido que se ha obtenido hasta el momento. Si no forma un ciclo incluya este arco, si no descártelo. 3-Repita el paso hasta que haya |V| -1 arcos en el árbol expandido. (|V| es el número de nodos del grafo) Especialista: María E. Mazzei Ingeniería de Sistemas Evaluador. Sandra Sánchez 324 – T. P. Lapso 2016-1 4/8 Ud. podrá emplear el algoritmo Prim si así lo desea. Generación de números aleatorios: La matriz de Adyacencia debe crearse automáticamente, una vez solicitado el valor de N, utilizando un proceso de generación de números aleatorios (NA) para determinar si entre cada par de nodos i, j existe o no un arco. Un NA es un valor de una variable obtenido al azar, dicha variable se especifica según una función denominada función de distribución. En los computadores personales es fácil simular la generación de números aleatorios, mediante mecanismos internos de generación de números pseudoaleatorios, que sin ser aleatorios, aparentan serlo. En el lenguaje de programación C++ se puede emplear la función rand, para generar números aleatorios entre 0 y 1. Se sugiere implementar ésta, como se describe a continuación: ⎧0 si 0 ≤ NA ≤ 0,5 f(NA) = ⎨ ⎩1 si 0,5 < NA ≤ 1 De esta manera si se quiere determinar la relación existente entre los nodos i y j, y obtenemos un valor de f = 0 se deduce que no hay un arco entre i y j y si el valor de f es 1, se deduce que hay un arco con sentido desde i hasta j (un solo sentido). Empleando este proceso para cada par de nodos, se construye la matriz de Adyacencia. Tome en cuenta que el programa deberá generar diferentes secuencias en cada grafo que construye. Como el grafo debe ser conexo, el programa en cuestión deberá detectar cuando en la generación automática de la matriz de Adyacencia resulte una columna en la que todos sus elementos sean ceros y corregirla ya que esto implicaría que la máquina no está conectada con el resto. Para generar las longitudes de cada arco previamente obtenido por el proceso anterior, deberá obtener números aleatorios en el intervalo (0,100), que representarán las distancias en Kilómetros. 2- Objetivo 6 Elabore un programa en PASCAL que realice lo siguiente: Especialista: María E. Mazzei Ingeniería de Sistemas Evaluador. Sandra Sánchez 324 – T. P. Lapso 2016-1 5/8 • Construya un vector (array) de 100 elementos enteros entre los valores 0 y 1.000 que representan las claves de registros, empleando una función aleatoria que permita generar números aleatorios dentro del intervalo mencionado. • Ordene el vector empleando el Método de Ordenación por Montículo (Heapsort). • Imprima el vector original método. y luego el resultante al aplicar el 3- Objetivo 7 Una tabla de Hashing es una estructura de datos a través de la cual se asigna a cada clave un valor, con el fin de crear un procedimiento de búsqueda de alta eficiencia. El primer paso es crear una función de hashing o de dispersión que transforma la clave de búsqueda en un índice (ver Figura N°1). Idealmente, las diferentes claves deben asignarse a diferentes índices. Este ideal es generalmente más allá de nuestro alcance, así que tenemos que enfrentar la posibilidad de que dos o más claves diferentes puedan obtener el mismo índice, en este caso se dice que las claves son sinónimos. Así, la segunda parte de la búsqueda en una Tabla de Hash es un proceso de resolución de colisiones que se ocupe de esta situación. Otro aspecto de igual importancia es el número de celdas que debe tener la tabla. La relación entre el número de elementos almacenados, n, y el número de celdas (slots) de la tabla, m, n/m, recibe el nombre de factor de carga. Como las listas enlazadas a las que se hace referencia en las celdas de hash pueden contener un número arbitrario de elementos, no existe límite en la capacidad de la tabla hash que utiliza el encadenamiento. Si la función hash empleada no distribuye bien las claves, el rendimiento de la tabla disminuirá. Cuando todas las claves se dispersan en una misma celda, ocurre el peor caso de una tabla de hash. Para una mayor eficacia, el factor de carga debe ser menor o igual que 0.75. (Fuente: http://mit.ocw.universia.net/1.00/s02/class-sessions/lecture-31/lecture31.pdf) Especialista: María E. Mazzei Ingeniería de Sistemas Evaluador. Sandra Sánchez 324 – T. P. Lapso 2016-1 6/8 Figura 1. Tabla de Hashing Sobre la base de esta información, desarrolle un programa en lenguaje C++ o Dev C++ que genere en una primera parte M números aleatorios enteros en el intervalo [1.000, 1.999] y que inserte estos números o claves en una estructura tipo tabla de Hashing, semejante a la mostrada en la Figura N°1, con encadenamiento de sinónimos. En una segunda parte de este programa se realizará un proceso continuo de lectura de números de cuatro cifras para hallar las claves solicitadas en la tabla. Ud. deberá establecer el número de celdas que tendrá la tabla y la función de hashing. Instrucciones generales sobre el Trabajo Práctico El estudiante debe entregar un informe que contenga lo siguiente: • Listado documentado del programa fuente. En el encabezado de cada función o sección de programa que lo requiera, debe incluir un breve comentario del proceso que se realiza o del método que aplica. Igualmente es conveniente hacerlo en la definición de las estructuras de datos y variables utilizadas. • Listado de los resultados. • CD (Disco Compacto) que contenga el programa fuente y el programa ejecutable (.exe), debidamente identificado. Especialista: María E. Mazzei Ingeniería de Sistemas Evaluador. Sandra Sánchez 324 – T. P. Lapso 2016-1 7/8 • Una hoja adjunta que incluya lo solicitado en los objetivos 5 y 7. • El CD debe estar libre de virus y debe entregarse en un sobre conjuntamente con el listado de programa y resultados. No use cinta engomada para adherirlo al informe. • El trabajo se entregará completo, adjunto a la prueba integral, con una portada similar a la presentada en las especificaciones de este trabajo. Recomendaciones • Emplee nombres de variables, constantes y funciones alusivos a lo que representan. • Utilice un diseño modular para la resolución del problema. Esta estructura aportará legibilidad y facilidad de comprensión, además evitará redundancias en los procesos. Evite variables globales en las funciones. Emplee parámetros en los mismos, determine cuáles son parámetros valor y cuáles parámetros variables. • Desarrolle algoritmos eficientes. • Elabore funciones de validación de la data y de detección de errores para evitar interrupciones inesperadas en la ejecución del trabajo. • Efectúe varias corridas del programa y verifique los resultados. Criterio de corrección Se considera logrado el objetivo si al menos se cumple con lo siguiente: 9 Entrega del listado documentado del programa, codificado en C++ o en Dev C++, en forma modular. En el encabezado de cada función o sección de programa que lo requiera y en la declaración de las estructuras de datos se incluye un breve comentario acerca del proceso, método o definición de estructura, según sea el caso. Especialista: María E. Mazzei Ingeniería de Sistemas Evaluador. Sandra Sánchez 324 – T. P. Lapso 2016-1 8/8 9 El programa corre sin restricciones. En general cada programa incluye funciones que realizan o contribuyen a alcanzar lo solicitado en las especificaciones. 9 Imprime los valores solicitados de acuerdo a cada sección del trabajo. 9 En el caso del objetivo 5 deberá incluir el TAD grafo y en el caso del objetivo 7, deberá especificar el número de celdas de la Tabla de Hashing y la función de Hashing empleada. FIN DE LAS ESPECIFICACIONES DEL TRABAJO PRÁCTICO NOTA: Los Trabajos Prácticos son estrictamente individuales y una producción inédita del estudiante, cualquier indicio que ponga en duda su originalidad, será motivo para su anulación. Queda a discreción del asesor o profesor corrector, solicitar una verificación de los objetivos contemplados en el mismo, únicamente en aquellos casos en los que se vea comprometida la originalidad de la autoría del presente trabajo práctico. Especialista: María E. Mazzei Ingeniería de Sistemas Evaluador. Sandra Sánchez