Problema A: Configuración de un aeropuerto



Documentos relacionados
Lección 24: Lenguaje algebraico y sustituciones

FUNCIONES DE PROPORCIONALIDAD

GRAFOS. Prof. Ing. M.Sc. Fulbia Torres

DISEÑO DE INDICADORES DE DESIGUALDAD SOCIAL EN LAS CIUDADES.-

Definir columnas de estilo periodístico

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Correspondencias entre taxonomías XBRL y ontologías en OWL Unai Aguilera, Joseba Abaitua Universidad de Deusto, EmergiaTech

UN PROBLEMA CON INTERÉS Y CALCULADORA

INFORMÁTICA. Práctica 5. Programación en C. Grado en Ingeniería en Electrónica y Automática Industrial. Curso v1.0 (05.03.

Operación de Microsoft Excel. Guía del Usuario Página 79. Centro de Capacitación en Informática

Centro de Capacitación en Informática

El desarrollo del pensamiento multiplicativo.

manual rápido SOLUCION TPV ESPECIAL TIENDAS ALIMENTACIÓN

LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F)

!!!!!!!! !!!!! Práctica!4.! Programación!básica!en!C.! ! Grado!en!Ingeniería!!en!Electrónica!y!Automática!Industrial! ! Curso!2015H2016!

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

LA IMPORTANCIA DE CONTROLAR LAS PÉRDIDAS DE ENERGÍA EN LAS EMPRESAS DISTRIBUIDORAS

ANÁLISIS DE 2009, 2010 Y 2011

Para ingresar a la aplicación Microsoft PowerPoint 97, los pasos que se deben seguir pueden ser los siguientes:

Teclado sobre una PDA para Personas con Parálisis Cerebral

WinHIPE: edición, compilación y ejecución de programas; y generación de animaciones web. Manual de usuario.

UNIDAD 6. POLINOMIOS CON COEFICIENTES ENTEROS

Introducción. Ciclo de vida de los Sistemas de Información. Diseño Conceptual

_ Antología de Física I. Unidad II Vectores. Elaboró: Ing. Víctor H. Alcalá-Octaviano

Los polinomios. Un polinomio es una expresión algebraica con una única letra, llamada variable. Ejemplo: 9x 6 3x 4 + x 6 polinomio de variable x

Instrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A)

Ejercicio 1 (2 puntos. Tiempo: 25 minutos)

MODELOS DE RECUPERACION

Qué son los monomios?

by Tim Tran:

Soluciones de los ejercicios de Selectividad sobre Probabilidad de Matemáticas Aplicadas a las Ciencias Sociales II

NÚMEROS NATURALES Y NÚMEROS ENTEROS

Relaciones entre conjuntos

MEDIDAS DE TENDENCIA CENTRAL

Biografía lingüística

TEMA 3 PROFESOR: M.C. ALEJANDRO GUTIÉRREZ DÍAZ 2 3. PROCESAMIENTO DE CONSULTAS DISTRIBUIDAS

Solución Algorítmica de Problemas Proyecto - Unidad #2 Metro de Curicó

Movilidad habitual y espacios de vida en España. Una aproximación a partir del censo de 2001

1.3 Números racionales

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

SISTEMAS DE NUMERACIÓN. Sistema de numeración decimal: = =8245,97

PROPORCIONALIDAD - teoría

75. Otro criterio para los cálculos y la contabilización según el coste amortizado de un pasivo financiero

Centro de Capacitación en Informática

Wise Up Kids! En matemáticas, a la división de un objeto o unidad en varias partes iguales o a un grupo de esas divisiones se les denomina fracción.

Tema 07. LÍMITES Y CONTINUIDAD DE FUNCIONES

ESTÁTICA 2. VECTORES. Figura tomada de

Líneas Equipotenciales

Planilla de cálculo. Módulo II - OpenOffice.org Calc

Ecuaciones de primer grado con dos incógnitas

CONCEPTOS PREVIOS TEMA 2

Clases de apoyo de matemáticas Fracciones y decimales Escuela 765 Lago Puelo Provincia de Chubut


INSTITUTO VALLADOLID PREPARATORIA página 9

CAPÍTULO 3. ALGORITMOS DE PREVISIÓN BASADOS EN LA EXTRAPOLACIÓN DE LOS DATOS MÁS RECIENTES

Matrices Invertibles y Elementos de Álgebra Matricial

Los números racionales

ÍNDICE 2. DIRECCIONES DE INTERÉS SOBRE TELETRABAJO Y DISCAPACIDAD BIBLIOGRAFÍA...

Fundamentos de los Sistemas Operativos (GII) Examen Final 15 de Junio de SEGUNDA PARTE - SOLUCIONES

SILU Sistema de Inscripciones en Línea Universitario

Aplicación informática para la inscripción de alumnos en experimentos del área de Psicología Básica

3º Grado Educación Infantil Bilingüe Números. Método Singapur y F. Bravo E R

E 1 E 2 E 2 E 3 E 4 E 5 2E 4

Universidad Católica del Maule. Fundamentos de Computación Especificación de tipos de datos ESPECIFICACIÓN ALGEBRAICA DE TIPOS DE DATOS

Enunciado unidades fraccionarias fracción fracciones equivalentes comparar operaciones aritméticas fracciones propias Qué hacer deslizador vertical

FUNDAMENTOS DE ADMINISTRACIÓN Y GESTIÓN Teoría y ejercicios

Manual de usuario de Solmicro BI. Página 1

8. Resultados de la simulación

El rincón de los problemas. Oportunidades para estimular el pensamiento matemático. Triángulos de área máxima o de área mínima Problema

1 Estática Básica Prohibida su reproducción sin autorización. CONCEPTOS DE FISICA MECANICA. Conceptos de Física Mecánica

B 1 PRUEBA DE EXPRESIÓN E INTERACCIÓN ORALES MATERIAL PARA EL CANDIDATO. Examen 00. Versión 1 Septiembre de 2012

La ventana de Microsoft Excel

EXPRESIONES ALGEBRAICAS. POLINOMIOS

Este documento ha sido generado para facilitar la impresión de los contenidos. Los enlaces a otras páginas no serán funcionales.

Proyectos de Innovación Docente

Colegio Alexander von Humboldt - Lima. Tema: La enseñanza de la matemática está en un proceso de cambio

COLOMO R e g l a m e n t o

Información importante para el proveedor de Servicios de Apoyo en el Hogar (IHSS)

Operando sobre esta relación, se obtiene

Apuntes de Matemática Discreta 1. Conjuntos y Subconjuntos

Sistemas de numeración

GENERAR DOCUMENTOS HTML USANDO LENGUAJE PHP. EJERCICIO RESUELTO EJEMPLO SENCILLO. (CU00733B)

INSTRUCTIVO DEL COMANDO MAKE

Agentes para la conservación de la energía mecánica

Diagramas de Clases ~ 1 ~ Ing. Fabián Silva Alvarado

Una fracción puede interpretarse como parte de un total, como medida y como operador de OBJETIVOS CONTENIDOS PROCEDIMIENTOS

MÉTODO DEL CAMBIO DE BASE PARA CÁLCULO MANUAL DE SUBREDES CON IP V4.0

Problemas + PÁGINA 37

Escritura de ecuaciones de problemas de algebraicos

MATEMÁTICAS 3º CURSO DE ESO INFORMACIÓN PARA LOS ALUMNOS

Selectividad Septiembre 2009 SEPTIEMBRE Opción A

TEMA 3: EN QUÉ CONSISTE?

FORMACIÓN DE EQUIPOS DE E-LEARNING 2.0 MÓDULO DE DISEÑO Y PRODUCCIÓN DE MATERIALES UNIDAD 6 B

INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y ELÉCTRICA UNIDAD CULHUACÁN INTEGRANTES

INTRODUCCIÓN: LA FÍSICA Y SU LENGUAJE, LAS MATEMÁTICAS

Guía breve para la. Versión abreviada del Manual para la. evaluación de desempeño y potencial

FORMATO FICHA PEDAGOGICA SESIONES EDUCATIVAS CÓMO PREGUNTAR DE LA MANERA CORRECTA


Movimiento a través de una. José San Martín

PROGRAMACIÓN ORIENTADA A OBJETOS

Transcripción:

Originalmente publicado en los números 55 (enunciado) y 56 (solución) de la revista Novática (http://www.ati.es/novatica/) Problema A: Configuración de un aeropuerto M. Carro mcarro@fi.upm.es A. Herranz aherranz@fi.upm.es P. Sánchez psanchez@skyrealms.org J. Mariño jmarino@fi.upm.es Descripción del problema Aerolíneas ACM es una compañía aérea regional con sede en el aeropuerto von Neumann. Para muchos pasajeros, el aeropuerto von Neumann no es el punto de partida de su viaje ni su destino final, así que tienen lugar muchas escalas en el aeropuerto. El aeropuerto von Neumann tiene la disposición de un pasillo. Las puertas de llegada están situadas, equidistantemente, en el lado norte de dicho pasillo; las puertas de salida están situadas en el lado sur, también de forma equidistante. La distancia entre dos puertas contiguas es igual al ancho del pasillo. A cada puerta de llegada se corresponde con una ciudad exactamente, y lo mismo ocurre con las puertas de salida. Los pasajeros entran por la puerta de llegada de su ciudad de procedencia y abandonan la terminal, o conectan con el siguiente vuelo en la puerta correspondiente a su ciudad de destino. Para este problema, sólo consideramos pasajeros con cambio de vuelo. Las escalas generan en el pasillo un tráfico de pasajeros considerable. El número medio de personas que viajan entre ciudades se conoce de antemano. Usando esta información, debería ser posible reducir el tráfico. Si las escalas entre las ciudades Cx y Cy son muy frecuentes, puede ser útil situar las puertas correspondientes a esas ciudades cerca o incluso directamente enfrente una de la otra. Debido a la presencia de tiendas y jardines, no es posible cruzar el pasillo oblicuamente, así que la distancia entre las puertas P, de llegada, y P3, de salida, es + = 3 (véase el diagrama). Puertas de llegada C P C P C3 P3 Tienda Jardín C P C P3 C3 P3 Puertas de salida Debes calcular la carga de tráfico total para varias configuraciones distintas. La carga de tráfico entre una puerta de origen y otra de destino se define como el número de pasajeros con esos puntos

de origen y destino, multiplicado por la distancia entre las puertas de llegada y de salida. La carga de tráfico total es la suma de las cargas de tráfico para todos los pares origen-destino. Descripción de la entrada El archivo de entrada contiene varios casos de prueba. El último caso de prueba del archivo de entrada va seguido por una línea que contiene el número 0. Cada caso de prueba tiene dos partes: primero los datos del tráfico y luego la configuración. Los datos de tráfico empiezan con un entero N ( < N < 5), que representa el número de ciudades. Cada una de las siguientes N líneas representa los datos de tráfico para una ciudad. Cada línea con los datos de tráfico empieza con un entero del rango..n que identifica la ciudad de origen. Esto va seguido por k pares de enteros, un par para cada ciudad de destino. Cada par identifica la ciudad de destino y el número de pasajeros (500 a lo más) que viajan de la ciudad de origen a la de destino. Los datos de configuración consisten en una o más (como mucho 0) configuraciones y termina con una línea que contiene el número 0. Una configuración contiene 3 líneas. La primera línea contiene un número positivo que identifica la configuración. La siguiente línea contiene una permutación de las ciudades, indicando cómo se corresponden con las puertas de llegada: el primer número representa la ciudad correspondiente a la primera puerta y así sucesivamente. Del mismo modo, la siguiente línea representa cómo las ciudades se corresponden a las puertas de salida. Descripción de la salida Para cada caso de prueba, la salida contiene una tabla que presenta los números de configuración y la carga total de tráfico, en orden ascendente de carga. Si dos configuraciones tienen la misma carga de tráfico, debe presentarse primero la que tiene la que tiene el número de configuración más bajo. Sigue la disposición de la salida mostrada en el ejemplo siguiente. Ejemplo de entrada 3 0 3 5 3 0 3 0 3 3 3 3 0 00 00 0 0 Salida para el ejemplo de entrada

Configuration Load 9 Configuration Load 300 600 Discusión preliminar El problema propuesto en el número pasado tiene como tema central averiguar el tráfico entre puertas de un aeropuerto de paso. En un principio la intuición parece sugerir que se pide una configuración óptima de puertas de llegada y salida. Esto no es así: en realidad se limita a solicitar un cálculo de la cantidad de tráfico entre cada puerta de llegada y de salida. Este tráfico se calcula como la multiplicación del número de pasajeros que transitan entre ambas por la distancia que las separa, utilizando una distancia de Manhattan [Gar8] para medir esta separación. Como inciso, no es extraño que un problema resulte a primera vista más difícil de lo que es y también a la inversa, claro. En el caso de los concursos de programación, la experiencia dice que la presión del tiempo y el nerviosismo provocan malentendidos de los enunciados que, al menos, retrasan el llegar a una solución satisfactoria. Volviendo al problema, los datos de entrada proponen una serie de casos diferentes. Cada uno de ellos especifica un régimen de tráfico entre ciudades y una serie de distribuciones de puertas de llegada y salida diferentes. Se pide hallar el tráfico total para cada una de las configuraciones y ordenarlas según este tráfico. Aparentemente, esta simulación ayudaría a las autoridades aeroportuarias a tener una asignación vuelos/puertas que minimizase la carga de tráfico interna. Si tenemos en cuenta que para 0 destinos de llegada y otros tantos de salida (una situación razonable para un aeropuerto de tamaño medio) hay unas 5.9 0 36 configuraciones, no debe extrañar el funcionamiento de algunos aeropuertos. 3 Análisis rápido, diseño, e implementación La tarea que hay que realizar con cada configuración es la misma: leer los datos de tránsito de pasajeros (solo una vez) y leer la configuración de entrada y salida. La labor principal, por tanto, es calcular la suma T = t ij d ij i,j C donde C es el conjunto de ciudades conectadas, t ij es el tránsito entre la ciudad i y la j y d ij es la distancia entre ellas. La mayor dificultad es crear las matrices d y t. Tanto i como j son naturales menores que 5, así que una definición C como int trafico[5][5]; basta para almacenar la información del tráfico. Los datos sobre el tráfico entre ciudades son un grafo con pesos en los arcos dado en formato de listas de adyacencia, del que se puede crear directamente la matriz de tráfico (procedimiento LeerTrafico): for (i = ; i <= nciudades; i ++) for (j = ; j <= nciudades; j ++) trafico[i][j] = 0; for (i = ; i <= nciudades; i ++) { scanf("%d", &origen); /* Origen de la adyacencia */ 3

scanf("%d", &nadyacentes); /* Número de adyacentes a esa ciudad */ for (j = ; j <= nadyacentes; j ++) { /* Adyacentes y tráfico con ellos */ scanf("%d %d", &destino, &pasajeros); trafico[origen][destino] = pasajeros; /* El peso del arco son los */ /* pasajeros que transitan */ Con esto ya tenemos creada la matriz t ij. El formato de entrada para la matriz d ij es algo distinto: en cada configuración, dos líneas de números a a a n b b b n según las cuales d aib j = i j +. Es posible, por tanto, utilizar los identificadores de ciudades como índice de la matriz. Esto, naturalmente, concuerda con el tipo de la matriz de tráfico. Un programador avezado puede no crear la matriz explícita, sino almacenar cada valor i, ( i n) en un vector indexado por a i. En cada lectura de un b j sólo es necesario recorrer, para esa ciudad b j, el vector a, extraer la posición i para cada una de las ciudades de ese vector, y calcular la distancia entre ambas puertas como i j +. Esa distancia se multiplica por el valor de tráfico correspondiente entre dos ciudades, que se va acumulando. El código correspondiente (procedimiento ProcesarConfiguracion) sería: int i, origen, destino; int origenes[5]; /* La posición de la puerta de origen */ /* dentro de la permutación */ int carga = 0; /* Carga de la configuración */ /* Se almacena la permutación de destinos, pero almacenando para cada */ /* destino, su posición en la permutación (para obtener un acceso directo) */ for (i = ; i <= nciudades; i ++) { scanf("%d", &origen); origenes[origen] = i; for (i = ; i <= nciudades; i ++) { scanf("%d", &destino); /* El origen */ for (origen = ; origen <= nciudades; origen ++) /* El tráfico que se a~nade a la configuración resulta: */ /* distancia = diferencia horizontal + */ /* ^ */ /* (diferencia vertical) */ /* sumar: distancia * tráfico entre las puertas */ carga += (abs(i - origenes[origen]) + ) * trafico[origen][destino]; Por último, cada configuración correspondiente a unos mismos datos de tráfico genera una carga que es necesario almacenar para posteriormente ordenar las configuraciones según su carga (y, en caso de empate, según un identificador de configuración contenido en los datos de entrada). typedef struct { 4

int id; /* Identificador de la configuración */ int carga; /* Carga de la configuración */ TConfiguracion; int nciudades; /* Número de ciudades en la entrada */ int trafico[5][5]; /* Tráfico entre dos ciudades */ /* (es una matriz de adyacencia) */ int nconfs; /* Número de configuraciones */ TConfiguracion confs[5]; /* Vector de configuraciones */ Lo más cómodo para la ordenación es utilizar una función de biblioteca, como qsort: void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); que requiere datos acerca del vector que se va a ordenar y una función de comparación. En este caso la función de comparación tiene en cuenta primero la carga y después el identificador asociado. int Comparacion (const void *a, const void *b) { TConfiguracion conf = *((const TConfiguracion *) a); TConfiguracion conf = *((const TConfiguracion *) b); return (conf.carga == conf.carga? conf.id - conf.id : conf.carga - conf.carga); Por último, el bucle principal tendría que leer tráfico y configuraciones para cada uno de los casos de entrada: LeerTrafico(); /* Lectura de la adyacencia (pasajeros entre puertas) */ /* Proceso de las diferentes configuraciones */ nconfs = 0; scanf("%d", &configuracion); /* Identificador de la configuración */ while (configuracion) { confs[nconfs].id = configuracion; confs[nconfs].carga = ProcesarConfiguracion(); nconfs ++; scanf("%d", &configuracion); /* Ordenación de las configuraciones */ qsort(confs, nconfs, sizeof(tconfiguracion), Comparacion); /* Impresión del resultado ordenado según se requiere */ printf("configuration Load\n"); for (i = 0; i < nconfs; i ++) { printf("%5d%0s%d\n", confs[i].id, "", confs[i].carga); En definitiva, el mayor contratiempo de este problema es entender exactamente qué se está pidiendo y cómo extraer esa información de los datos de entrada. 5

4 Otra visión de la implementación Veamos una implementación en otro lenguaje siguiendo la misma filosofía que la anterior. El lenguaje elegido ha sido Prolog, pero no se utiliza ninguna característica específica del lenguaje (backtracking, uso de variables lógicas, llamadas de orden superior...) de modo que debe ser rápidamente extrapolable a cualquier otro lenguaje lógico (Mercury, Gödel... ), funcional (Haskell, Hope, ML... ) o híbrido (Babel, Curry... ). Asumiremos que los datos ya han sido leídos, pero no que haya habido ninguna transformación esencial de los mismos, de modo que el programa trabaja sobre los mismos datos presentes a la entrada. Una definición de tráfico, como 3 0 3 5 3 0 3 0 se transforma de forma inmediata, mediante una sencilla lectura, en una lista de adyacencia como: [lst(,[(,0),(3,5)]), lst(,[(3,0)]), lst(3,[(,),(,0)])] Y una configuración como 3 3 se traduce a un par de listas de ciudades como [,, 3] [, 3, ] Con esto, la tarea se reduce a programar el predicado carga(trafico, Entradas, Salidas, Coste), que será llamado como carga([lst(,[(,0),(3,5)]), lst(,[(3,0)]), lst(3,[(,),(,0)])], [,, 3], [, 3, ], C). En la implementación se ha optado por abstraer la matriz de adyacencia, y generar los valores de tráfico entre las ciudades dinámicamente a partir de la descripción inicial: cant_trafico(trafico, Entr, Sal, Coste):- member(lst(entr, Lst), Trafico), member((sal, Coste), Lst),!. cant_trafico(_trafico, _Entr, _Sal, 0). Si bien esto penaliza la complejidad del programa, no es difícil realizar una traducción previa a funtores que daría un acceso con complejidad O() o una basada en árboles -3 que daría una en O(log n). El resto del programa, una vez visto el análisis inicial, es bastante sencillo: dos bucles, uno para recorrer las ciudades de entrada, y, para cada una de ellas, otro para recorrer las ciudades de salida. En aras de una mayor claridad, se ha obviado el uso de parámetros de acumulación, que usualmente disminuye el consumo de memoria e incrementa la velocidad del programa. %% Coste se calcula para una relacion de transbordo dada por Trafico %% entre las ciudades ordenadas en Entradas y Salidas carga(trafico, Entradas, Salidas, Coste):- procesa(entradas,, Salidas, Trafico, Coste). 6

%% Para cada ciudad en posición IndEnt, se calcula el Coste con respecto a %% todas las ciudades en Salidas, y se continúa con el resto de las ciudades %% IndEnt es la posición de la ciudad Entr procesa([], _, _, _, 0). procesa([entr Entradas], IndEnt, Salidas, Trafico, Coste):- proc_salidas(salidas,, Entr, IndEnt, Trafico, C), IndEnt is IndEnt +, procesa(entradas, IndEnt, Salidas, Trafico, C), Coste is C + C. %% Para cada ciudad de salida en posición IndSal, se calcula su coste %% con respecto a la ciudad en posición IndEnt. %% IndSal es la posición de la ciudad Sal; igual con IndEnd y Entr proc_salidas([], _, _, _, _, 0). proc_salidas([sal Salidas], IndSal, Entr, IndEnt, Trafico, Coste):- cant_trafico(trafico, Entr, Sal, Tr), C is Tr*(abs(IndEnt-IndSal)+), IndSal is IndSal +, proc_salidas(salidas, IndSal, Entr, IndEnt, Trafico, C), Coste is C + C. Referencias [Gar8] Martin Gardner. Juegos matemáticos. Investigación y Ciencia, páginas 4 8, Enero 98. 7