Buscador de Productos basado en Agentes Móviles Daniel Diez Sánchez Jorge Diez Sánchez Universidad Carlos III de Madrid Universidad Carlos III de Madrid Madrid, España Madrid, España [email protected] [email protected] ABSTRACT El objetivo de este artículo es explicar el funcionamiento del uso de agentes JADE [1] para resolver un problema de un buscador de productos en varias tiendas, encontrando el producto más barato que se obtiene cumpliendo las exigencias especificadas por el usuario (marca del producto, modelo y tiempo máximo de entrega al cliente). Categoria y Descripción del Tema D.0 [General] Términos Generales Documentación. Palabras Clave: Figura 1. Esquema básico del sistema Buscador, Mobile Agent (Agente móvil), Agente JADE, FIPA 2. INTRODUCCIÓN A JADE AGENTES DE MOVILIDAD Y LOS 1. INTRODUCCIÓN El sistema de Buscador de Productos se divide en tres partes: un cliente, un servidor de la aplicación y las tiendas o servidores de datos. El usuario del sistema utilizará la aplicación del cliente (una interfaz gráfica que aparecerá en pantalla) para solicitar el producto. Esta aplicación conectará con el servidor central que se encargará de intercambiar los datos con todas las tiendas disponibles. Para realizar este procedimiento se creará un MobileAgent (Agente Móvil), que se moverá desde el cliente al servidor central, y desde allí, a todas las tiendas, devolviendo al cliente la mejor solución. Todo ello se llevará a cabo mediante el uso de interfaces gráficas. Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, or republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee. Conference’04, Month 1–2, 2004, City, State, Country. Copyright 2004 ACM 1-58113-000-0/00/0004…$5.00. 2.1 JADE JADE (Java Agent DEvelopment Framework) - es una plataforma de software desarrollada en TILab (Italia) bajo la filosofía Open Source para el desarrollo de aplicaciones distribuidas basadas en agentes que cumple con las especificaciones de la FIPA (Foundation for Intelligent Physical Agents)[2]. El proyecto JADE comenzó en 1998, y la primera versión (v. 1.3) estuvo lista en febrero del 2000, y fue lanzada bajo licencia LGPL. JADE se puede ejecutar en un amplio rango de ambientes: desde los empresariales, hasta en dispositivos móviles (PDA’s y teléfonos móviles) gracias a una extensión (API [2]), que se desarrolló para el proyecto LEAP (Lightweight Extensible Agents Plataform). 2.1.1 Características Ha sido desarrollado totalmente en Java y debido a que cumple con las especificaciones de FIPA, puede interoperar con otras plataformas de Agentes, que cumplan con este estándar. Provee un conjunto de APIs que son independientes de la red y de la versión de Java, dejando libertad a los desarrolladores de escoger el ambiente de desarrollo de Java que se adecue más a sus necesidades. Las APIs son simples y fáciles de usar, lo cual oculta al desarrollador la complejidad de la plataforma. Es configurable permite que se usen solo las características que se requieran, disminuyendo de esta manera la sobrecarga computacional. JADE es por un lado un framework que nos ayuda a crear nuestros agentes, y por otro un contenedor que contiene agentes. Este contenedor les da una serie de servicios a los agentes, como puede ser el registro de los mismos, dar un cauce de comunicación entre los agentes locales, y entre estos y otro agentes distribuidos, autenticación y autorización de los agentes... 2.3 Definición de agente JADE Un agente JADE es una instancia de una clase JAVA definida por el usuario que extiende de la clase Agent (jade.core.Agent). public class MiAgente extends Agent { ... } Cada agente JADE se implementa como un único hilo de ejecución. 2.4 Ciclo de vida de un agente 2.2 LOS AGENTES MÓVILES Los agentes móviles son procesos de software que son capaces de transitar por una red, generalmente una WAN, interactuando con host alejados, reuniendo información para el usuario y volviendo a su origen cuando las tareas fijadas por el usuario se hayan completado. Ejemplos de tareas que se pueden realizar son reservas de vuelos o manejo de una red de telecomunicaciones. Un agente está sujeto a un ciclo de vida que define los estados en los que se puede encontrar y cómo se realizan los cambios de un estado a otro. El ciclo de vida de un agente JADE sigue el ciclo propuesto por FIPA, es decir, cumple con la propuesta de estándar de interoperabilidad entre agentes más aceptada. Los agentes móviles traen con si grandes beneficios aunque no son funcionales, esto quiere decir que una tarea que realiza un agente móvil puede ser realizada por un agente colaborativo, la diferencia radica en que para movilizar el agente se requiere de un costo muy alto de recursos. Algunas de las ventajas que se pueden obtener al usar agentes móviles son: • Reducen el costo de comunicación, por ejemplo cuando en una ubicación hay un gran volumen de información que necesita ser examinada y transmitida, esto ocuparía una gran cantidad de recursos en la red y consumiría mucho tiempo. En este caso el agente móvil puede determinar la información relevante al usuario y transmitir un resumen comprimido de esta información. • Facilitar la coordinación, es más sencillo coordinar un cierto número de requerimientos remotos e independientes al comparar solo los resultados localmente. • Reduce los recursos locales, los agentes móviles pueden ejecutar sus tareas en computadores diferentes del local, de tal manera que no consuman recursos de procesamiento, memoria y almacenamiento en estos. • Computación asíncrona, mientras que un agente móvil realiza su tarea el usuario puede ir realizando otra, de tal manera que después de un tiempo el resultado del agente móvil será enviado al usuario. Figura 2. Esquema del ciclo de vida de un agente Descripción de los estados: • Activo: El ACC (Agent Communication Channel) entrega mensajes al agente de forma normal. • Iniciado/En espera/Suspendido: El ACC almacena el mensaje en el buffer correspondiente hasta que el agente está activo (o lo reenvía a una nueva dirección si el sistema lo requiere) • • Tránsito. El ACC almacena cualquier mensaje hasta que el agente se activa o bien entrega el mensaje en otra localización si antes se ha indicado un forward para ese agente como en el caso anterior. Solamente los agentes móviles pueden entrar en este estado. Desconocido. El ACC almacena cualquier mensaje o los rechaza, dependiendo de su propia política y de los requisitos de transporte del mensaje. Descripción de las transiciones: • Crear: La creación o instalación de un nuevo agente. • Invocar: La invocación de un nuevo agente. • Destruir: La terminación forzosa de un agente. Sólo puede ser iniciado por el AMS (Agent Management System) y no puede ser ignorado por el agente. • Salir: La terminación normal de un agente. Puede ser ignorada por el agente. • Suspender: Pone un agente en estado de suspensión. Puede ser iniciado por el agente o por el AMS. • Reanudar: Continua con la ejecución de un agente que se encuentra en estado suspendido. Sólo puede ser iniciado por el AMS. • Esperar: Pone un agente en estado de espera. Sólo puede ser iniciado por el agente. • Despertar: Continua con la ejecución de un agente que se encuentra en estado de espera. Sólo puede ser iniciado por el AMS. 2.5 MOVILIDAD EN JADE Cada instancia de ejecución en JADE es llamada contenedor (es decir, contiene agentes). El conjunto de todos los contenedores se llama plataforma y proporciona una capa homogénea que esconde a los agentes (y la aplicación desarrollada). La plataforma también incluye un servicio de identificación (asegurando que cada agente tiene un único nombre) y un servicio de páginas amarillas, que puede distribuirse a través de múltiples computadoras. Otra característica muy importante consiste en la disponibilidad de una gran colección de herramientas gráficas, que apoyan la depuración y administración del ciclo de vida de la aplicación. Por medio de estas herramientas, es posible controlar a los agentes remotamente, aún cuando ya se desplegó y ejecutó la aplicación: pueden emularse las conversaciones del agente, pueden olfatearse los mensajes intercambiados, pueden supervisarse las tareas, así como los ciclos de vida de cada agente que esté activo sobre la plataforma. JADE soporta movilidad de código y estado de ejecución. Es decir, un agente puede dejar de ejecutarse sobre una máquina, migrando sobre diferentes nodos remotos (sin la necesidad de tener el código del agente instalado en ese nodo), y reiniciar su ejecución en el punto en que fue interrumpido (realmente, JADE implementa una forma de movilidad no tan débil, porque la pila y el registro del programa no pueden ser salvados en Java). Esta funcionalidad permite, por ejemplo, distribuir la carga computacional al tiempo de ejecutar los movimientos del agente, a las maquinas menos cargadas sin algún impacto en la aplicación. La movilidad de un agente es la habilidad para que este migre o haga una copia de sí mismo (clonarse) a través de uno o múltiples nodos de una red. El soporte de movilidad en JADE consiste en un conjunto de clases y métodos que permiten a un agente, ejecutar las acciones requeridas por sí mismo o por el AMS (Agent Management System), y una ontología específica de movilidad (MobilityOntology). Jade soporta movilidad y clonación interplataforma: Las siguientes transiciones son usadas sólo en Agentes Móviles. • Mover. Pone a un agente en estado de tránsito. Sólo puede ser iniciado por el agente. • Ejecutar. Continúa con la ejecución de un agente que se encuentra en estado de tránsito. Sólo puede ser iniciado por el AMS. • Que involucra varios hosts. • Cada uno con su contenedor. • A petición del propio agente. Se ha estudiado a detalle la sección de movilidad de JADE, específicamente la clase Agent que contiene los métodos para llevar a cabo el proceso de movilidad y clonación, estos son: • doMove() • beforeMove() • afterMove() • doClone() • beforeClone() • afterClone() Sin embargo estos métodos requieren de ciertos parámetros (objetos de tipo Location) porque los agentes necesitan conocer su localización para saber cuándo y a dónde desplazarse. Para poder utilizar los objetos de tipo Location debemos incluir el siguiente import: import jade.core.*; Después de que el AMS le proporciona a un agente la información del destino al cual puede dirigirse, está preparado para llamar a su método doMove(Location) y comienzar el proceso de migración. Los métodos beforeMove(), afterMove() son provistos para especificar algunas tareas antes y después de moverse. El método doClone() requiere de un parámetro extra, esto significa que lleva el destino en el cual se clonará además de un nombre diferente al nombre del agente original, doClone(Location, String). Los métodos beforeClone() y afterClone() son provistos para especificar algunas tareas antes y después de clonarse. 3. ASPECTOS TÉCNICOS DE PROGRAMACIÓN Y DISEÑO BUSCADOR LA DEL DE Básicamente, como se refleja en el diagrama se tratará de un cliente que desea obtener el mejor precio de un determinado producto con un requisito de tiempo máximo de entrega. Estas especificaciones son transferidas al Servidor Central (Aplication Server –AS) que mediante el uso de un Mobile Agent creado por la propia máquina del Cliente y que se desplazará al Servidor Central, conectará con las tiendas disponibles. 3.2 DESCRIPCIÓN DE LAS CLASES JAVA A continuación se presentará paso a paso el desarrollo del software del Buscador de Productos. Primeramente, será expuesto de manera gráfica mediante un diagrama de flujo para proseguir a continuación con el modelo de clases planteado (donde detallaremos el contenido y función de cada una de las siete clases implementadas). 3.1 DIAGRAMA DE FLUJO SOLUCIÓN DESARROLLADA Figura 3. Diagrama de flujo LA La solución que se ha desarrollado se muestra gráficamente en el esquema siguiente: El siguiente paso será el diseño de la aplicación JAVA. A continuación se presentan las clases implementadas y una breve explicación de los métodos desarrollados en ellas y su finalidad. 3.2.1 ClientGUI Esta clase servirá para desarrollar la interfaz gráfica del usuario, obtener los datos introducidos por el mismo, y posteriormente enviarlos a la clase ClientAgent cuando el botón “Buscar Producto” de la interfaz es pulsado por el usuario. La clase ClientAgent será la encargada principal de transferir los datos al servidor central y obtener resultados. 3.2.2 ClientAgent Esta clase inicializa la clase ClientGui, procediendo a comenzar con todo el proceso de búsqueda. Cuando el botón “Buscar Producto” es pulsado, se procederá a crear un Agente Móvil y dicho agente será movido al Container del Servidor Principal, desde donde se procederá a analizar todos los datos que se irán obteniendo de todas las tiendas. Una vez transferido el Agente Móvil al Servidor Central, el Cliente se pondrá en modo espera para recibir una respuesta con el resultado definitivo acerca del producto. 3.2.3 ASAgent La clase ASAgent será la encargada de inicializar el Agente AS, con el objetivo de estar preparado para recibir la consulta del Mobile Agent. Una vez el Agente móvil llegue al Container principal, este será redirigido a los containers de las tiendas respectivas. Una vez recibidos los datos de todas las tiendas, será enviado de nuevo al container del Cliente con los datos definitivos. 3.2.4 ShopAgent La clase ShopAgent será la encargada de inicializar el Agente de cada tienda, con el objetivo de estar preparado para recibir al agente móvil con su solicitud en el container de cada tienda. Una vez que es recibida, se procesarán los datos en busca del mejor producto disponible que cumpla los requisitos. La creación de la clase ShopAgent también inicializará la base de datos con los valores de objetos ejemplo que se han usado para el desarrollo de la aplicación. 3.2.5 MobileAgent La solución básica del problema a resolver se basará en el uso de esta clase como se ha explicado previamente. Siguiendo algunos ejemplos del Tutorial Jade [4] se procederá a la creación de un Agente Móvil que se irá desplazando de container en container con el único objetivo de transferir información entre diferentes hosts de una misma red. En esta clase serán implementados los diferentes mensajes que serán intercambiados con el agente que se encuentre en el mismo container que el Agente Móvil en cada momento (dependerá en cada caso si se encuentra en el container AS, Tienda o Cliente. 3.2.6 Producto: Esta clase será la encargada de definir un objeto Producto donde serán guardadas las características de los Productos (nombre de la marca, modelo, precio y plazo de entrega). Contendrá asimismo todos los métodos necesarios para obtener dichos atributos. 3.2.7 TestValues: Figura 4. Diagrama UML de Clases 4. IMPLEMENTACIÓN FUNCIONAMIENTO JADE Y El problema planteado en la introducción tal como se ha explicado en los puntos previos se ha resuelto mediante el uso de la plataforma JADE, y seguirá los siguientes pasos: - El host AS (Servidor Central) inicializará la aplicación, creando de esta forma el Agente AS, el cuál se encontrará en el Container Principal (Main Container). Todos los agentes creados posteriormente se encontrarán en Containers diferentes. - La aplicación se ha desarrollado de forma que, cuando una tienda se conecta, un agente Tienda es creado (Tienda1, Tienda2 o Tienda3 para el ejemplo que se trata en este paper) y se pondrá en modo espera con el objetivo de esperar cualquier mensaje del Agente Móvil. Cuando un mensaje se recibe, se procesarán los datos y se fabricará un mensaje respuesta que será enviado al Agente Móvil de forma inmediata. Este procesamiento será llevada a cabo en el método encontrarProducto de la clase ShopAgent. Consistirá en buscar el producto demandado en la base de datos de la tienda. Una vez recibido el mensaje respuesta por el Agente Móvil, procederá de nuevo a desplazarse al Container Principal. - Una vez que todas las tiendas se encuentran conectadas, se procederá a inicializar la aplicación en el host La clase TestValues contendrá todos los productos que se utilizan como ejemplos en el desarrollo de la aplicación como se ha descrito previamente. Se crearán diversos objetos de modelos idénticos con diferentes precios y tiempos de entrega dependiendo de la Tienda correspondiente, con el fin de poder probar las diferentes capacidades de la aplicación. Como se ha comentado previamente, la solución implementada tendrá como principal estructura diversos ejemplos analizados en la Guía de Programador JADE [5] y en los Tutoriales JADE[4, 5] Un breve resumen de la solución implementada sería el siguiente diagrama UML de las clases JAVA desarrolladas: Cliente. De esta forma se creará el agente Cliente y se inicializará la interfaz del usuario mediante la llamada a la clase ClientAgentGui. Una vez inicializados todos los agentes, y previamente a crear el Agente Móvil, el esquema de containers será el mostrado en la siguiente figura: Figura 7. Ventana Jade Remote Agent Management GUI con el MobileAgent ya creado y visitando la Tienda1. - El Agente Móvil creado obtendrá los datos del producto deseado del Cliente, y una vez se ha llevado a cabo esta operación será movido al Container Principal. En este punto, dicho agente procederá a preguntar al Agente AS acerca de las tiendas que hay conectadas, siendo enviado por el mismo a los containers correspondientes de cada Tienda. Primeramente se moverá al Container de la Tienda1, donde preguntará al Agente Tienda1 sobre el producto en cuestión. Una vez que el Agente Tienda obtiene los datos del producto, realizará una llamada al método encontrarProducto, el cuál recorrerá la base de datos correspondiente buscando las características indicadas por el usuario. A continuación, procederá a la creación de un nuevo mensaje respuesta con los resultados enviándoselo al Agente Móvil, procesando el mismo la respuesta recibida y moviéndose de nuevo al Container Principal. Una vez allí, se procederá a repetir el mismo proceso con el resto de tiendas conectadas. - Las respuestas recibidas en cada Tienda, son analizadas dentro de la clase MobileAgent. Para ello, esta clase poseerá unas variables determinadas para guardar la marca, el modelo, el precio y el tiempo de entrega de la mejor respuesta recibida hasta el momento. Estos valores serán comparados con los resultados que se reciben en cada caso de cada Tienda, siendo sustituidos en caso de ser mejores que los guardados previamente. Inicialmente, los valores precio y tiempo de entrega serán fijados a infinito en la clase MobileAgent. Cuando el Agente Móvil finaliza visitando todas las tiendas, volverá al Container Principal, y de ahí, al Container del Cliente, donde enviará un mensaje al Agente Cliente con las mejores características encontradas para el objeto en cuestión. Este resultado será mostrado por pantalla de la siguiente forma: Figura 5. Ventana Jade Remote Agent Management GUI Y la interfaz que aparecerá en el host Cliente al usuario será la siguiente: Figura 6. Interfaz del Usuario Por defecto, aparecerán en la misma los datos correspondientes a un producto de la base de datos siendo posible modificar esa configuración en la clase ClientAgentGUI. En esa interfaz serán introducidos los datos del producto que se quiere encontrar, y una vez pulsado el botón “Buscar Producto”, el Agente Móvil será creado dando comienzo a todo el proceso de búsqueda explicado en los puntos anteriores. - En este ejemplo, se ha desarrollado la aplicación para que pueda ejecutarse hasta en un máximo de 3 tiendas, ya que para evitar mayores problemas de complejidad y limitarse al objetivo principal del uso de agentes móviles, hemos utilizado un fichero TestValues con valores fijos, tanto de los productos de cada tienda, como del nombre de los Containers y agentes de cada tienda. Figura 8. Resultado obtenido en la aplicación para un producto disponible Si el producto requerido con sus características, no es encontrado o no esta disponible con las mismas, se mostrará un mensaje por pantalla indicándolo: Una posible mejora sería desarrollar una interfaz para la clase ShopAgent, que nos solicitase los productos que tiene cada tienda o se pudiese leer por fichero los mismos. Asimismo, sería posible desarrollar una aplicación que descubriese el nombre de todos los containers que están conectados en cada momento al Servidor, ya que se van asignando progresivamente (Container-1, Container2….) pero la desconexión de una de las tiendas y la posterior reconexión es un problema ya que no se le asigna el Container que tenía previamente, sino uno nuevo. 6. REFERENCES [1] Java Agent Development Framework http://jade.tilab.com/ Figura 9. Mensaje mostrado por la aplicación en caso de no estar disponible el producto 5. CONCLUSIÓN En el desarrollo de esta aplicación se ha comprobado el posible uso de agentes móviles, tal como se relataba en las definiciones de JADE, y la gran facilidad que proporciona para intercomunicar diferentes hosts. El uso de diferentes mensajes puede ayudarnos en las diferentes mejoras posibles tal como se explica en alguna de las implementaciones desarrolladas en la Guía del Programador JADE [5]. El único gran problema encontrado aparte de la implementación misma del software ha sido el encontrar una versión JAVA adecuada para la versión JADE descargada y utilizada. En este caso, se trata de la última versión JADE 3.50 disponible. La versión JAVA utilizada ha sido la 1.6.0. [2] JADE v3.5 API http://jade.tilab.com/doc/api/index.html [3] Foundation for Intelligent Physical Agents http://www.fipa.org [4] JADE TUTORIAL. Jade programming for Beginners. http://jade.tilab.com/doc/JADEProgramming-Tutorial-forbeginners.pdf Author: Giovanni Caire (TILAB, formerly CSELT) [5] JADE PROGRAMMER’S GUIDE http://jade.tilab.com/doc/programmersguide.pdf Authors: Fabio Bellifemine, Giovanni Caire, Tiziana Trucco (TILAB, formerly CSELT), Giovanni Rimassa (University of Parma) [6] JADE Tutorial and Primer http://www.iro.umontreal.ca/%7Evaucher/Agents/Jade/JadeP rimer.html Author: Jean Vaucher and Ambroise Ncho