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.