UNIVERSIDAD CARLOS III DE MADRID Inteligencia en redes de
Transcription
UNIVERSIDAD CARLOS III DE MADRID Inteligencia en redes de
UNIVERSIDAD CARLOS III DE MADRID Inteligencia en redes de comunicaciones 5º Curso de Ingeniería de Telecomunicación Práctica I.R.C: Estudio de la red de metro mediante el lenguaje de programación PROLOG. autores: Alberto Martín Ascensión Fernando Sánchez Sánchez ESCUELA POLITÉCNICA SUPERIOR. CURSO 2003/2004 El problema consistirá en averiguar la ruta entre dos estaciones de metro o de cercanías según los siguientes criterios: • mínimo tiempo de viaje • mínimo numero de transbordos Además debemos dar información sobre las estaciones(acceso para minusválidos, parking, conexión con la red de cercanías o de metro) incluidas en la ruta. Para ello debemos de definir las redes de metro y de cercanías de la Comunidad de Madrid. A partir de estas redes, nuestro sistema ha de ser capaz de resolver los objetivos anteriores. El lenguaje de programación lógico utilizado en práctica es PROLOG. El usuario podrá elegir el criterio de elección de ruta (mínimo tiempo de viaje o bien mínimo número de transbordos). La respuesta de nuestro sistema, dependiendo del criterio de elección de ruta, será la lista de estaciones por las que hemos de pasar desde nuestra estación origen hasta nuestra estación destino, así como la información de las mismas e información sobre donde hay que realizar los transbordos, si son necesarios. Si la elección es tiempo mínimo de viaje, el programa además de devolver la relación de las estaciones a atravesar, y su información, devolverá el tiempo mínimo empleado para realizar dicho viaje, así como los transbordos que hay que realizar y dónde. Si elegimos el mínimo número de transbordos, devolverá todas las rutas posibles, dentro de un tiempo dado, con sus estaciones (y su información) y los transbordos que son necesarios en cada ruta para así poder elegir la que menos transbordos tiene. El sistema, a partir de la lista de estaciones que comprende la ruta, mostrará por pantalla cierta información asociada a cada una de las estaciones que forma la ruta. Dicha información será si la estación en cuestión esta dotada de: • Estación de cercanías (o bien estación de metro, en el caso en que estemos analizando la red de cercanías) • Estación con acceso para personas con movilidad reducida. • Estación con aparcamiento. 2.- Definición de las redes de metro y cercanías RENFE de la Comunidad de Madrid. A continuación presentamos el formato del fichero map_metro.pl o mapa_renfe.pl. Ambos archivos son semejantes(en estructura), diferenciándose únicamente en el nombre de las estaciones, que en cada caso es distinto, y las consecuencias que esto trae, es decir, que cambian las conexiones, así como las informaciones sobre las estaciones. Debido a que ambos ficheros son similares solo explicamos una de ellos de forma resumida. En dicha explicación nos hemos basado en el archivo mapa_metro.pl Inicialmente hemos de definir las estaciones de que está formada la red de metro de la Comunidad de Madrid. Unos ejemplos de dicha definición son: estacion(abrantes). estacion(acacias). A la hora de representar los nombres de las estaciones, se han tomado algunas precauciones para evitar problemas con otros interpretes del lenguaje: 1) 2) 3) 4) 5) 6) 7) Solo se usaran minúsculas. (Tetúan tetuan). No se acentuará ninguna vocal. (Batán batan) Los espacios se sustituyen por – o _ (gran-via,san_nicasio) La ñ se sustituye por ny (opañel opanyel) La dieresis se omite (argüelles arguelles). Las tildes se omiten (O’donell odonell). Se ponen nombres completos (AVD. de América avenida-de-america). Seguidamente hemos de definir la relación de conexión entre dichas estaciones, es decir cada estación se unirá a su contigua. Un ejemplo de esta definición será: conexion(plaza-de-castilla,valdeacederas,1.5). conexion(valdeacederas,tetuan,4). De esta forma simulamos las uniones entre estaciones y la duración del trayecto. La definición de conexión está compuesta por 3 campos: • • • Estación origen Estación destino Tiempo empleado para ir de la estación origen a la estación destino. Este tiempo lo hemos fijado nosotros aleatoriamente. Para dotar a dicha conexión de bidireccionalidad, se ha de definir otra claúsula, de la forma: conectados(X,Y,T):-conexion(X,Y,T). conectados(X,Y,T):-conexion(Y,X,T). De forma que el sentido de la conexión es dual. Para poder definir que estaciones de metro pertenecen a una correspondiente línea, es necesario la definición de las siguientes claúsulas: linea_metro(linea1). linea_metro(linea2). Esta claúsula sirve para definir las líneas de metro existentes. La siguiente define que estación pertenece a cada línea. estacion_pertenece(plaza-de_-astilla,linea1). estacion_pertenece(valdeacederas,linea1). estacion_pertenece(tetuan,linea1). estacion_pertenece(el_casar,linea12). Esta formada por dos campos: el primero de ellos es el nombre de la estación y el segundo es el nombre de la línea a la cual pertenece la estación. Para definir la información que posee cada estación se definen varias claúsulas: - tiene_acceso_minusvalidos(nombre_estación): de esta forma obtenemos información sobre los accesos para personas discapacitadas que tiene una estación. Si la estación no lo tiene, entonces esta claúsula no existirá para dicha estación. Un ejemplo es tiene_acceso_minusvalidos(congosto). - tiene_aparcamiento: es igual a la anterior, pero da información sobre la existencia de parking en la estación. tiene_renfe o tiene_metro: igual a las anteriores, pero nos dicen si una estación de metro o de renfe tiene, renfe o metro, respectivamente. 3.- Explicación del programa principal Para arrancar el sistema, inicialmente hemos de compilar el programa principal. Para ello tecleamos [practica].. A continuación tecleamos iniciar. y sale un menú que nos va indicando las distintas opciones, de forma que vamos introduciendo datos según son requeridos por el programa. Para realizar esto lo único que hay que hacer es ir leyendo y guardando los datos introducidos a través del teclado por el usuario. De esta forma, y mediante consult ,cargamos el mapa del metro o de RENFE, según la elección del usuario. El resultado se obtiene realizando una llamada a la regla resultado, que según la opción, llamará a ruta_optima o a todas_rutas_con_transbordos, con los parámetros necesarios para estas reglas. Dichas reglas utilizan, a su vez, las reglas descritas a continuación ( sólo las más importantes, ya que las secundarias están comentadas en el código, es decir, una regla secundaria sería insertar un elemento en una lista), que son la base del programa. RUTA_OPTIMA: Devuelve la ruta (si es posible) que tarda menos tiempo en realizarse teniendo en cuenta el tiempo máximo de viaje que hemos especificado. Muestra también información de las estaciones de la ruta. 1) prueba_lista_de_listas: esta regla calcula todas las rutas posibles, dentro del tiempo máximo de viaje que hemos considerado, mediante la llamada a la regla viajar_posible3, que es la que realmente calcula todas estas rutas. 2) viajar_posible3: esta regla calcula todas las rutas posibles entre un origen y un destino, dentro del margen de tiempo máximo dado. Si las estaciones pertenecen a la misma línea y además son contiguas, el tiempo que se tarda en hacer el viaje es el tiempo declarado en la claúsula conexión(X,Y,T). Si las estaciones pertenecen a la misma línea pero no son contiguas; entonces el tiempo total para recorrer dicha ruta es la suma de los tiempos individuales de ir de una estación a otra, es decir, la suma de las tiempos (T’s) entre cada una de las estaciones. Finalmente, si las estaciones pertenecen a distinta línea, debido a que hay que hacer transbordo el tiempo final será el calculado en el anterior caso más el tiempo que estimamos en hacer el transbordo. En nuestro caso estimamos que el tiempo de transbordo es de 5 minutos. Además para calcular el tiempo total se añaden 3.5 minutos, que hemos considerado como tiempo que se tarda en coger el primer tren en la estación origen. 3) ruta_mas_cortas_2: esta regla nos da la ruta óptima entre la estación origen y la estación destino. Se apoya en las anteriores debido a que el resultado de la regla menor, que nos da el menor tiempo de la lista de tiempos que se tarda en realizar todas las rutas posibles, se lo pasamos a esta regla que calculará una ruta con tiempo menor o igual al menor tiempo de todas las rutas, es decir, calculará(apoyado en la regla viajar_posible) la única ruta que cumple la condición de que su tiempo es menor o igual al de todas las rutas posibles entre una estación origen y la estación destino. 4) Viajar_posible: esta regla calcula la ruta entre una estación origen y una destino que cumple que el tiempo que se tarda en realizar la ruta es menor que uno dado. Se emplea para sacar la ruta óptima. Esto se consigue ya que en el programa se le pasa como parámetro de tiempo máximo el menor tiempo de todas las rutas posibles que hemos calculado con las reglas anteriores. De esta forma, esta regla calcula una ruta y ve si su tiempo es menor que el que le hemos pasado. Si no es así, la desecha, y busca otra ruta, hasta que consigue una con tiempo igual al pasado por parámetro. Esta última ruta será la óptima ya que el tiempo máximo de viaje viene dado por el menor tiempo de todas las rutas, y por tanto sólo si la ruta es óptima cumplirá la condición de tiempo que hemos exigido a la regla en el paso del parámetro de tiempo máximo. Es prácticamente igual a viajar_posible3(ya que su búsqueda es igual), pero ésta calcula todas las rutas posibles, y viajar_posible nos da una única ruta, la óptima (apoyándose en resultados de las reglas anteriores mencionadas 1,2 y 3). 5) numero_estaciones: nos da el número de estaciones totales que componen la ruta. Para ello obtiene la ruta óptima y utiliza la regla longitud_ruta que va sumando una unidad por cada una de las estaciones que componen la ruta y devuelve la suma total, que es el número de estaciones atravesadas. 6) informacion_estaciones: esta regla nos da la información de las estaciones que componen la ruta. Para ello utiliza las reglas tiene_acceso_m, tiene_parking, tiene_cercanias y tiene_suburbano, que comprueban en la base de hechos si se cumple el hecho de que una estación tenga acceso para minusválidos, parking, … 7) n_transbordos: nos da el número de transbordos que hay que realizar en una ruta, así como dónde hay que realizar los mismos. Para ello se comprueba si entre una estación y siguiente+1, pertenecen a la misma línea, si no es así habrá que realizar transbordo en la estación que antes hemos llamado siguiente. Dentro de esta regla se comprueban unos transbordos especiales que la regla simple no es capaz de determinar debido a que en dos estaciones pueden coincidir varias líneas iguales y dar lugar a un error al considerar que no hay que hacer transbordo. Ésto lo hemos solucionado añadiendo los casos especiales en esta regla para comprobar si se da alguno de ellos en la ruta. TODAS_RUTAS_CON_TRANSBORDOS: Devuelve las rutas( si es posible) que existen entre un origen y un destino teniendo en cuenta el tiempo máximo de viaje especificado. Además nos muestra el número de transbordos de todas estas rutas para que podamos elegir la que menos transbordos tenga. Muestra también información de las estaciones de las distintas rutas. 1) prueba_lista_de_listas: esta regla calcula todas las rutas posibles, dentro del tiempo máximo de viaje que hemos considerado, mediante la llamada a la regla viajar_posible3, que es la que realmente calcula todas estas rutas. Es la misma regla que hemos explicado anteriormente 2) rutas_numero_transbordos: se encarga de obtener el número de transbordos de cada una de las rutas que conectan el origen con el destino. Para ello hace uso de la función n_transbordos que hemos comentado anteriormente. Para cualquier duda acerca de dichas reglas, en el fichero práctica está el código, junto con una explicación de los parámetros que intervienen en las funciones. 4.- Ejemplos de aplicación: Ejemplo de ruta óptima (metro): Welcome to SWI-Prolog (Version 5.0.10) Copyright (c) 1990-2002 University of Amsterdam. SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit http://www.swi-prolog.org for details. For help, use ?- help(Topic). or ?- apropos(Word). ?- [practica]. % practica compiled 0.06 sec, 25,392 bytes Yes ?- iniciar. Practica de Inteligencia en Redes de Comunicaciones Guia del metro (y RENFE) de Madrid Opciones metro.Carga la red de metro para consultas renfe.Carga la red de cercanias de RENFE para consultas |: metro % mapa_metro compiled 0.05 sec, 71,640 bytes Reglas para las consultas en la red de metro Opciones 0.Ruta optima en cuanto a tiempo de trayecto (con informacion de distancia y e informacion sobre estaciones) 1.Rutas con numero de transbordos para elegir la de menor numero de estos |: 0. Introduzca estacion origen |: san_nicasio. estacion destino |: campamento. tiempo maximo de viaje |: 30. La ruta optima es: [campamento, casa-de-campo, ciudad-jardin, cuatro-vientos, joaquinvilumbrales, puerta_del_sur, san_nicasio] El tiempo optimo es: 23 El numero de estaciones es: 7 La estacion casa-de-campo tiene acceso para minusvalidos La estacion ciudad-jardin tiene acceso para minusvalidos La estacion cuatro-vientos tiene acceso para minusvalidos La estacion cuatro-vientos tiene aparcamiento La estacion cuatro-vientos tiene conexion con la red de cercanias de RENFE La estacion joaquin-vilumbrales tiene acceso para minusvalidos La estacion puerta_del_sur tiene acceso para minusvalidos La estacion san_nicasio tiene acceso para minusvalidos Hay que realizar transbordo en casa-de-campo Hay que realizar transbordo en puerta_del_sur Hay que realizar 2 transbordos Yes Ejemplo de rutas para escoger la que menor número de transbordos tiene(renfe): Practica de Inteligencia en Redes de Comunicaciones Guia del metro (y RENFE) de Madrid Opciones metro.Carga la red de metro para consultas renfe.Carga la red de cercanias de RENFE para consultas |: renfe % mapa_renfe compiled 0.05 sec, -44,140 bytes Reglas para las consultas en la red de cercanias de RENFE Opciones 0.Ruta optima en cuanto a tiempo de trayecto (con informacion de distancia y e informacion sobre estaciones) 1.Rutas con numero de transbordos para elegir la de menor numero de estos |: 1. Introduzca estacion origen |: leganes. estacion destino |: vallecas. tiempo maximo de viaje |: 35. Una ruta es: [vallecas, el_pozo, entrevias, atocha, villaverde_bajo, villaverde_alto, zarzaquemada, leganes] La estacion vallecas tiene aparcamiento La estacion vallecas tiene conexion con la red de metro La estacion el_pozo tiene aparcamiento La estacion atocha tiene aparcamiento La estacion atocha tiene conexion con la red de metro La estacion villaverde_bajo tiene aparcamiento La estacion zarzaquemada tiene aparcamiento La estacion leganes tiene aparcamiento La estacion leganes tiene conexion con la red de metro Hay que realizar transbordo en atocha Hay que realizar transbordo en villaverde_alto Hay que realizar 2 transbordos Una ruta es: [vallecas, el_pozo, entrevias, atocha, mendez_alvaro, doce_de_octubre, orcasitas, puente_alcocer, villaverde_alto, zarzaquemada, leganes] La estacion vallecas tiene aparcamiento La estacion vallecas tiene conexion con la red de metro La estacion el_pozo tiene aparcamiento La estacion atocha tiene aparcamiento La estacion atocha tiene conexion con la red de metro La estacion mendez_alvaro tiene aparcamiento La estacion mendez_alvaro tiene conexion con la red de metro La estacion orcasitas tiene aparcamiento La estacion puente_alcocer tiene aparcamiento La estacion zarzaquemada tiene aparcamiento La estacion leganes tiene aparcamiento La estacion leganes tiene conexion con la red de metro Hay que realizar transbordo en atocha Hay que realizar 1 transbordos Yes 5.- Bibliografía . Para la realización de este trabajo se ha necesitado información extraida de: • • Apuntes de la asignatura Inteligencia de Redes de Comunicaciones, para familiarizarse con los conceptos básicos del lenguaje PROLOG. Manuales y tutoriales de PROLOG consultados en la red.