Está en la página 1de 12

PRCTICA FINAL DE IRC

Pablo Jimnez Bermejo


Aitor Rubio Elguea
Ing. de Telecomunicacin, 5 curso
Inteligencia en Redes de Comunicaciones
Prctica Final Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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.

1
Inteligencia en Redes de Comunicaciones
Prctica Final Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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 Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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.

3
Inteligencia en Redes de Comunicaciones
Prctica Final Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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:

4
Inteligencia en Redes de Comunicaciones
Prctica Final Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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]),!).

5
Inteligencia en Redes de Comunicaciones
Prctica Final Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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))
).

6
Inteligencia en Redes de Comunicaciones
Prctica Final Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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:

7
Inteligencia en Redes de Comunicaciones
Prctica Final Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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:

8
Inteligencia en Redes de Comunicaciones
Prctica Final Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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

9
Inteligencia en Redes de Comunicaciones
Prctica Final Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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 Pablo Jimnez Bermejo
Ing. de Telecomunicacin, 5 curso 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

También podría gustarte