Anda di halaman 1dari 12

PRCTICA FINAL DE IRC

Pablo Jimnez Bermejo Aitor Rubio Elguea Ing. de Telecomunicacin, 5 curso

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

Introduccin
En la presente prctica hemos desarrollado un planificador de rutas de metro con aprendizaje. Esto significa que el software que presentamos es capaz de calcular la ruta ptima entre dos puntos cualesquiera de la red de metro de Madrid, as como otras funciones auxiliares. Estas otras funciones se pueden resumir en variantes de clculo para las rutas, presentacin del conjunto total de rutas calculadas, o la asociacin de puntos de inters de la ciudad con la red de metro, de forma que se pueda presentar un entorno ms amigable al usuario. Adems, se presentan tambin de forma destacada los puntos de la red de metro que permite el acceso a otros tipos de transporte (enlace con aeropuerto, estaciones de tren de largo recorrido, autobuses...) por ser stos los de uso ms comn. Es importante destacar que para el desarrollo de este programa hemos utilizado unos mtodos genricos, al tiempo que utilizamos una base de conocimientos externa, de forma que no slo es aplicable este programa a cualquier red de metro (con los ficheros con los datos adecuados), sino que tambin sirve para enrutamiento en redes de ordenadores (aplicacin ms comn en nuestro entorno habitual) o cualquier tipo de red (carreteras, tren, areas, canalizaciones, etc.)

Codificacin de la informacin
Base de conocimientos
La base de conocimientos sobre la que trabaja el programa est almacenada en un fichero externo, que en este caso se ha guardado con el nombre completo.txt. En l, se presenta la informacin relativa a la red de metro de Madrid con el siguiente formato:
connection(argelles,san_bernardo,cuatro). connection(san_bernardo,bilbao,cuatro). connection(bilbao,alonso_martinez,cuatro). connection(alonso_martinez,colon,cuatro). connection(colon,serrano,cuatro). connection(serrano,velazquez,cuatro). connection(velazquez,goya,cuatro). connection(goya,lista,cuatro).

En este pequeo ejemplo, vemos que la unidad mnima de informacin no son las estaciones individuales de la red, sino las conexiones entre cada una de ellas. Vemos que el formato definido es una conexin entre dos estaciones y la lnea de metro que las une. De esta forma, enlazando todas las estaciones de la red, el programa puede seguir desde cada estacin todas las posibles conexiones que tiene a travs de todas las lneas a las que pertenece.

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

Desde el principio nos planteamos cul sera el formato ms conveniente en la representacin de la informacin, plantendonos otras opciones: el uso de listas o de tuplas ms complejas, que incluyeran todas las conexiones correspondientes a cada estacin, entre otras. La primera de estas dos soluciones no era viable, ya que las listas slo tienen sentido en el contexto de una lnea completa, lo que provoca algunos problemas a la hora de establecer las interconexiones con otras lneas; en cuanto a las tuplas ms complejas, se vuelve tambin demasiado complejo analizar las implicaciones de cada uno de los elementos de la tupla para decidir si seguirlos o no, que optar por tuplas sencillas, como es nuestro caso, en el que cada conexin en principio se sigue siempre, y se analiza posteriormente si estamos en un punto repetido en la bsqueda.

Grafa utilizada
En cuanto a la grafa que habramos de utilizar, intentamos ceirnos en la medida de lo posible a la empleada en los documentos oficiales empleados por la propia red de metro, en concreto con la usada en los planos de mano que cualquier usuario puede tener. De esta forma, cualquier usuario en principio inexperto puede hacer funcionar el programa sin ms que escribir adecuadamente el nombre de las estaciones, o mejor dicho, escribindolo de igual forma a como aparece en los mencionados planos de bolsillo. No obstante, hay algunas excepciones; la ms obvia es que no se pueden emplear espacios en blanco, por lo que fueron sustituidos por un guin bajo _ (por ejemplo: gran_via). Asimismo, las comillas en los nombres (como en la estacin ODonell) no pueden aparecer, por lo que hubo que quitarlas (as, queda odonell). Aunque s que se admiten algunos caracteres especiales (por ejmplo: argelles, con diresis). Respetar la grafa de los planos de bolsillo es importante sobre todo en abreviaturas, como por ejemplo en avda_de_america.

Presentacin de resultados
Los resultados del programa se pueden observar de dos formas distintas. Una de ellas, inmediata, se presenta en el apartado Interaccin con el usuario, en la que se presentan por pantalla directamente los resultados obtenidos. Sin embargo, y dado que a veces los resultados son bastante extensos, conviene analizarlos ms despacio. Por ese motivo el programa genera un fichero soluciones.txt en el que se almacenan todos los resultados de ejecuciones sucesivas del programa; es un fichero de texto sencillo que puede consultarse posteriormente con cualquier editor, y que es creado por el programa en caso de ser la primera ejecucin y no existir previamente. En este fichero de resultados se almacena la fecha y hora de ejecucin y un listado de los datos obtenidos, pero sin el formato de presentacin en pantalla que veremos ms adelante; sencillamente se dan todas las posibles soluciones de rutas como dos listas: una de ellas con las estaciones que se van atravesando y otra con las lneas empleadas en ir entre cada una de las estaciones. Podemos ver que esto corresponde con la 2

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

informacin almacenada en las tuplas de la base de conocimientos, sencillamente se toman los elementos que corresponden a la solucin deseada. As, por ejemplo, un resultado de una ejecucin en la que se buscan rutas entre las estaciones de valdezarza y gran_via:
-------------Sun Dec 21 21:52:42 2003-------------. solucion(valdezarza,gran_via,[valdezarza, francos_rodriguez, guzman_el_bueno, islas_filipinas, canal, quevedo, san_bernardo, noviciado, santo_domingo, opera, sol, gran_via],[siete, siete, siete, siete, dos, dos, dos, dos, dos, dos, uno]). solucion(valdezarza,gran_via,[valdezarza, francos_rodriguez, guzman_el_bueno, islas_filipinas, canal, quevedo, san_bernardo, noviciado, santo_domingo, opera, sol, gran_via],[siete, siete, siete, siete, dos, dos, dos, dos, dos, dos, uno]). solucion(valdezarza,gran_via,[valdezarza, francos_rodriguez, guzman_el_bueno, islas_filipinas, canal, alonso_cano, gregorio_maraon, avda_de_america, cartagena, parque_de_las_avenidas, barrio_de_la_concepcion, pueblo_nuevo, quintana, el_carmen, ventas, diego_de_leon, nuez_de_balboa, ruben_dario, alonso_martinez, chueca, gran_via],[siete, siete, siete, siete, siete, siete, siete, siete, siete, siete, siete, cinco, cinco, cinco, cinco, cinco, cinco, cinco, cinco, cinco]). solucion(valdezarza,gran_via,[valdezarza, francos_rodriguez, guzman_el_bueno, islas_filipinas, canal, alonso_cano, gregorio_maraon, avda_de_america, cartagena, parque_de_las_avenidas, barrio_de_la_concepcion, pueblo_nuevo, quintana, el_carmen, ventas, diego_de_leon, nuez_de_balboa, ruben_dario, alonso_martinez, chueca, gran_via],[siete, siete, siete, siete, siete, siete, siete, siete, siete, siete, siete, cinco, cinco, cinco, cinco, cinco, cinco, cinco, cinco, cinco]).

Aprendizaje
El ttulo de nuestra prctica indica que el programa posee un pequeo sistema de aprendizaje. Ms adelante detallaremos cmo funciona; aqu, puesto que estamos hablando de la codificacin de la informacin, hablaremos de cmo almacenamos la informacin aprendida por el programa. Dado que los datos de partida sobre los que trabajamos estn almacenados en un fichero externo que hemos llamado completo.txt, es lgico que cualquier otra informacin adicional sobre la que queramos trabajar tambin se guarde en dicho fichero. As, las ltimas entradas del archivo tendrn el mismo aspecto que toda la informacin restante:
% Aprendizaje del programa connection(puerta_del_sol,sol,trasbordo). connection(universidad_carlos_iii,leganes_central,trasbordo).

Podemos ver que en la posicin de la tupla correspondiente al nmero de lnea se ha incluido la palabra clave trasbordo, que identifica el nuevo destino aprendido como algo externo a la red de metro, de forma que no se puede incluir en los clculos de rutas como estacin intermedia pero s como destino. Esto nos da ya una pequea informacin de cmo funciona el mecanismo de aprendizaje: identifica lugares de la ciudad con la estacin de metro ms prxima, y es por eso que las nuevas entradas slo pueden constar como destino de una ruta.

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

Algoritmos implementados
Para el desarrollo de esta prctica se han empleado varios algoritmos parciales encaminados a proporcionar el resultado final. A continuacin veremos cada uno de ellos con ms detalle.

rutal
Para comprender mejor el funcionamiento del algoritmo veremos primero en qu consiste:
rutal(From, To, Path, Lineas,Limit) :rutal(From, To, Path, Lineas, [From],[],Limit). rutal(To, To, [To],[],_,_,_). rutal(From, To, [From|Path],[Lin|Lineas],Visited,Lvisited,Limit) :nel(Visited,N),M is N-1,M<Limit, (connection(From, Via,Lin) ; connection(Via, From,Lin) ), ( (not(member(Via,Visited))) , no_espuria(Lvisited), (rutal(Via,To,Path,lineas,[Via|Visited],[Lin |Lvisited] ,Limit)) ).

Este algoritmo busca todas las rutas con nmero de paradas menor que Limit. Es un algoritmo de inundacin: en cada paso sigue todas las conexiones desde el punto en el que estamos hasta cualquier otra parada a la que est conectada (esto lo evaluamos analizando si la parada forma parte de la tupla empleada en la representacin de datos tanto en primer como en segundo lugar). Es necesario llevar un control de errores: se evitan bucles (lneas circulares o bucles hechos con varias lneas), llevando control de las paradas ya visitadas (visited), y se excluyen los enlaces marcados con trasbordo (no_espuria) como puntos intermedios (slo son destinos, como hemos indicado antes). Lgicamente, el algoritmo es recursivo; el caso final de la recursin se da en el momento en que va de una parada a ella misma. Queremos destacar el uso de la funcin nel, que nos proporciona el nmero de elementos de una lista.

rutalt
De nuevo veremos en primer lugar la propia implementacin del algoritmo para comentarla a continuacin:

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

rutalt(From, To, Path, Lineas,Limit) :rutalt(From, To, Path,Lineas, [From],[],Limit). rutalt(To, To, [To],[],_,_,_). rutalt(From, To, [From|Path],[Lin|Lineas],Visited,Lvisited,Limit):list_to_set(Lvisited,L2),nel(L2,N1),nel(Visited,M),N2 is M-1,T is(3*N2 + 5*N1),T< Limit, (connection(From, Via,Lin) ; connection(Via, From,Lin) ), ( (not(member(Via,Visited))), no_expuria(Lvisited), (rutalt(Via, To, Path, Lineas,[Via|Visited],[Lin|Lvisited],Limit)) ).

Este algoritmo busca una ruta que tarde menos de Limit minutos en completarse. Para ello, no considera nicamente el nmero de paradas que se recorren, como haca el algoritmo anterior, sino que tambin tiene en cuenta los trasbordos que es necesario hacer para cambiar de lneas. Dado que no merece la pena individualizar el tiempo empleado en cada recorrido entre estaciones y en cada trasbordo, se ha optado por tomar un valor estimado que describa, en media, los tiempos necesarios para realizar un trasbordo (5 minutos) y para avanzar de una estacin a la siguiente dentro de una lnea (3 minutos). Con estos valores, se calcula el tiempo necesario para recorrer una ruta y, al igual que antes, se buscan aquellas que necesiten menos de una cantidad, en este caso Limit. Por lo dems, este algoritmo es muy similar al anterior: se siguen todas las conexiones desde el punto actual, se lleva control de errores para evitar bucles y trasbordos, y la recursin finaliza cuando se va de una parada a ella misma. Una pequea diferencia estriba en el uso de Lvisited, que lleva control del nmero de lneas visitadas de la misma forma que Visited lo lleva del nmero de estaciones. En este caso destacamos el uso de la funcin list_to_set, que elimina elementos repetidos de una lista.

rutac
Como antes, vemos primero la implementacin del algoritmo:
rutac(From, To, Path, Lineas) :rutac(From, To, Path,Lineas,[], [From]). rutac(To, To, [To],[],_,_). rutac(From, To, [From|Path],[Lin|Lineas],Visited,Lvisited) :(connection(From, Via,Lin) ; connection(Via, From,Lin) ), not(member(Via,Visited)), no_expuria(Lvisited), (rutac(Via, To, Path, Lineas,[Via|Visited],[Lin|Lvisited]),!).

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

En este caso, vemos que esencialmente el algoritmo es muy parecido al algoritmo rutal, con la salvedad de que hace uso del operador de corte (!); esto lo hace para mostrar el primer resultado obtenido (vlido) por el programa. Dado que nicamente estn definidas las conexiones entre estaciones, no hay a simple vista ni de forma lgica una ruta ptima, sino que hay que calcularla. Esto hace que el resultado obtenido por esta funcin no sea necesariamente ni el ms sencillo ni el ms corto, sino que corresponde con el primer hilo de ejecucin que finaliza el clculo. (No tiene sentido hablar de hilos de ejecucin reales, el programa no es concurrente, pero nos da una idea del intento de simultaneidad de clculo de Prolog al seguir varias alternativas).

ruta_menos_paradas
Vemos el cdigo del algoritmo:
ruta_menos_paradas(From,To,Ruta,Lineas):mascorta2(From,To,_,_,N,0),rutal(From,To,Ruta,Lineas,N),ins_log(From,To,Ruta,Lineas). mascorta2(From,To,Ruta,Lineas,N,Limit):( (rutal(From,To,Ruta,Lineas,Limit),N is Limit,!) ; (L1 is Limit+1,mascorta2(From,To, Ruta,Lineas,N,L1)) ).

Vemos que este algoritmo invoca a su vez a otros dos: mascorta2, cuyo cdigo se presenta a continuacin de ruta_menos_paradas, y rutal, que como ya hemos visto antes busca todas las rutas que lleven del origen (From) al destino (To) con un nmero de paradas intermedias menor que Limit. El algoritmo mascorta2 invoca recursivamente a rutal incrementando de forma progresiva el valor de Limit, de forma que averigua el valor mnimo de Limit para el cual existe un resultado. Este valor es el mnimo nmero de paradas con el que se puede calcular una ruta. As, al invocar desde ruta_menos_paradas a rutal, se hace con el valor de Limit que nos proporciona mascorta2, con lo que se obtienen todas las rutas con el mnimo nmero de paradas posibles que son solucin del problema.

ruta_menos_tiempo
El cdigo correspondiente al algoritmo:
ruta_menos_tiempo(From,To,Ruta,Lineas):mtiempo(From,To,_,_,N,0),rutalt(From,To,Ruta,Lineas,N),ins_log(From,To,Ruta,Lineas). mtiempo(From,To,Ruta,Lineas,N,Limit):( (rutalt(From,To,Ruta,Lineas,Limit),N is Limit,!); (L1 is Limit+1,mtiempo(From,To,Ruta,Lineas,N,L1)) ).

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

Este algoritmo es muy similar a ruta_menos_paradas. Tambin invoca a una funcin intermedia (mtiempo) y despus a rutalt que, como ya hemos comentado, es similar a rutal pero minimizando el tiempo en lugar del nmero de estaciones. Y como en la anterior, la funcin mtiempo invoca recursivamente a rutalt incrementando de forma progresiva el valor de Limit, para hallar el valor mnimo que proporciona un resultado vlido; este resultado es el que se usa para invocar una ltima vez a rutalt para obtener todas las soluciones posibles de menor tiempo.

Interaccin con el usuario


A la hora de elaborar la interfaz con el usuario de este programa se ha intentado hacerlo de la forma ms amigable posible, dentro de las limitaciones de Prolog en ese sentido. En primer lugar, el comando para invocar la funcin principal, (el nombre del programa, realmente), es metro. Al teclearlo, (seguido, como siempre y en todas las instrucciones que se le dan al programa, por un punto), se nos presenta un men con las distintas opciones del programa:

A partir de este men se elige la opcin deseada y con ello se invoca alguno de los algoritmos vistos anteriormente:

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

Ruta ms corta -> invoca a ruta_menos_paradas. Ruta ms rpida -> invoca a ruta_menos_tiempo. Todas las rutas -> invoca directamente a rutal. Clculo de una ruta cualquiera -> invoca a rutac. Clculo de una ruta a un punto de la comunidad -> emplea el sistema de aprendizaje del programa. Clculo de ruta hasta ... -> calcula ruta_menos_tiempo entre la parada de origen especificada y la de destino asociada (ms cercana) al lugar indicado en la opcin del men.

Tras elegir la correspondiente opcin, el programa nos pregunta los datos que necesita para realizar los clculos, en principio las paradas de origen y destino de la ruta que ha de calcular:

Como hemos indicado anteriormente, el resultado de la ejecucin de todos los algoritmos es siempre un conjunto de dos listas, uno con las paradas y otro con las lneas empleadas en el recorrido (Vase Presentacin de resultados dentro del epgrafe Codificacin de la informacin). Para representar este resultado de forma ms amigable al usuario se emplea la funcin impr que, empleando las mencionadas listas, presenta la informacin de forma lgica al usuario. As, si ante el problema de calcular la ruta ms rpida entre las estaciones de sol y avda_de_america tomamos la solucin extrada del fichero soluciones.txt:

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

solucion(sol,avda_de_america,[sol, gran_via, tribunal, alonso_martinez, gregorio_maraon, avda_de_america],[uno, uno, diez, diez, siete]).

sta aparecer por pantalla como:

Vemos que no solamente se presentan los resultados contenidos en las listas, sino que tambin se muestran unas pequeas estadsticas, con el nmero de paradas, el nmero de trasbordos y el tiempo empleado.

Aprendizaje
Hemos mencionado varias veces en esta memoria el sistema de aprendizaje del programa. Bsicamente consiste en la posibilidad de poder introducir nuevas entradas en la base de conocimientos referentes a destinos finales. As, por ejemplo, si un usuario especifica un nuevo destino desconocido por el programa, ste le preguntar cul es la parada de metro ms prxima a dicho destino. Cuando el usuario proporcione la informacin pedida, el programa, usando la funcin aprender_correspondencias, llamar a una funcin auxiliar ins_basedatos para

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

introducir el nuevo destino en el fichero completo.txt que, recordamos, serva para almacenar todas las correspondencias y destinos sobre los que trabaja el programa.

Si se pidiera de nuevo al programa a continuacin la ruta para ir al nuevo destino especificado, ahora s sabra dnde est, puesto que ya est almacenado en la base de datos, y entonces podra calcular la ruta adecuadamente. Vemos que este mecanismo proporciona una gran versatilidad al programa, al poder adaptarlo segn las necesidades del usuario, ya que se pueden modificar los datos de partida de forma dinmica. No obstante, el fichero de entrada est escrito en texto simple, por lo que en caso de necesidad tambin se podra modificar manualmente.

Consideraciones finales de diseo


Al margen de todo lo comentado hasta el momento, nos parece importante destacar algunos problemas de relevancia que hemos encontrado en el diseo. El primero de ellos fue un intento de incluir una opcin ms en el men principal, que calculara la ruta con menor nmero de trasbordos. Al intentar realizarlo comprobamos que para que esta opcin fuera factible, la nica solucin posible era calcular la totalidad de rutas posibles y a partir de ah elegir las de menor nmero de trasbordos. Esto supondra un desmesurado coste computacional, por lo que preferimos no seguir adelante con esta opcin. 10

Inteligencia en Redes de Comunicaciones Prctica Final Ing. de Telecomunicacin, 5 curso

Pablo Jimnez Bermejo Aitor Rubio Elguea

Otro problema, y ste es a nuestro entender ms grave, se nos present al comprobar que los resultados que nos aparecan estaban duplicados en los registros. Esto es debido al back-tracking, que hace que por cada camino de bsqueda posible se establezca ms de un hilo de ejecucin, por lo que se duplica el nmero de registros. Dado que controlamos la impresin de los resultados, este problema es fcilmente subsanable. No es tan fcil de corregir sin embargo el problema relacionado con el tiempo y el coste computacional de los clculos ms largos. En efecto, si se solicita un clculo como el de todas las rutas posibles o uno que implique demasiadas combinaciones, el proceso puede ser inabordable.

11