LogicRaptors - ktulu.com.ar
Transcripción
LogicRaptors - ktulu.com.ar
LogicRaptors “Una Arquitectura de Software Integrada a la WWW para Soportar Agentes Móviles Basados en Prolog” Tesis de Grado de la carrera Ingeniería de Sistemas Julio 2002 Alumnos: Diego Tolbaños Luis Parravicini Directores: Alejandro Zunino Edgardo Belloni Facultad de Ciencias Exactas Universidad del Centro de la Provincia de Buenos Aires Indice de Contenidos 1 Introducción...........................................................................................................................................1 1.1 Motivaciones ....................................................................................................................................1 1.2 Solución Propuesta ...........................................................................................................................3 1.2.1 Infraestructura para el soporte de Agentes Móviles Inteligentes ...............................................3 1.2.2 LogicRaptors .............................................................................................................................4 1.2.3 Aplicaciones del trabajo ............................................................................................................5 1.3 Organización de la documentación...................................................................................................6 2 Conceptos Básicos sobre Agentes de Software y Agentes Móviles ............................................7 2.1 Introducción......................................................................................................................................7 2.2 Paradigmas de redes de computación ...............................................................................................8 2.2.1 Paradigma Cliente-Servidor ......................................................................................................9 2.2.2 Paradigma de Código por Demanda ..........................................................................................9 2.2.3 Paradigma de Evaluación Remota ...........................................................................................10 2.2.4 Paradigma de Agentes Móviles ...............................................................................................10 2.3 Agentes de Software.......................................................................................................................11 2.3.1 Clausura de Agentes ................................................................................................................12 2.4 Movilidad .......................................................................................................................................12 2.4.1 Nodos.......................................................................................................................................13 2.4.2 Movilidad de Agentes..............................................................................................................13 2.4.2.1 Agentes Estacionarios.......................................................................................................13 2.4.2.2 Agentes móviles ...............................................................................................................14 2.4.2.3 Contexto ...........................................................................................................................16 2.4.2.4 Lugares de ejecución ........................................................................................................16 2.5 Sistemas de agentes móviles...........................................................................................................16 2.5.1 Sistemas de Agentes Móviles vs Sistemas Middleware ..........................................................17 2.5.2 Características de los Sistemas de Agentes Móviles ...............................................................17 2.5.2.1 Ejecución de agentes ........................................................................................................17 2.5.2.2 Generación y administración de identidades ....................................................................18 2.5.2.3 Persistencia .......................................................................................................................18 2.5.2.4 Migración .........................................................................................................................19 2.5.2.5 Comunicación...................................................................................................................20 2.5.2.6 Acceso a recursos externos...............................................................................................21 2.5.2.7 Seguridad..........................................................................................................................21 2.5.3 Estandarización – MASIF – ....................................................................................................22 2.6 Aplicaciones basadas en agentes ....................................................................................................22 2.6.1 El conocimiento.......................................................................................................................22 2.6.2 Comunidades de Agentes ........................................................................................................23 2.6.2.1 Comunidad Homogénea ...................................................................................................23 2.6.2.2 Comunidad Heterogénea ..................................................................................................23 2.6.3 Aplicaciones de Agentes Móviles ...........................................................................................24 2.7 Usuarios finales ..............................................................................................................................25 3 Catálogo de Sistemas de Agentes Móviles ....................................................................................26 3.1 Introducción....................................................................................................................................26 3.2 Sistemas de Agentes Móviles .........................................................................................................26 3.2.1 Telescript .................................................................................................................................27 3.2.2 Aglets workbench....................................................................................................................28 3.2.3 ffMAIN....................................................................................................................................30 3.2.4 D'Agents ..................................................................................................................................31 3.2.5 AgentSpace..............................................................................................................................32 3.2.6 JiNNI .......................................................................................................................................34 3.3 Sistemas de Agentes Móviles alternativos .....................................................................................36 3.3.1 Voyager universal ORB...........................................................................................................36 i 3.3.2 Jumping Beans.........................................................................................................................37 3.3.3 Concordia ................................................................................................................................39 3.4 Comparaciones de los Sistemas de Agentes Móviles .....................................................................40 3.4.1 Similitudes...............................................................................................................................40 3.4.2 Diferencias...............................................................................................................................40 3.4.2.1 Terminología ....................................................................................................................40 3.4.2.2 Temas de nivel de soporte ................................................................................................41 3.4.2.3 Temas del nivel de administración ...................................................................................41 3.4.2.4 Temas del nivel de aplicación...........................................................................................42 3.4.2.5 Lenguajes de los agentes ..................................................................................................42 3.4.3 Características técnicas............................................................................................................42 3.4.3.1 Identidades........................................................................................................................42 3.4.3.2 Persistencia .......................................................................................................................43 3.4.3.3 Migración .........................................................................................................................43 3.4.3.4 Comunicación...................................................................................................................43 3.4.3.5 Acceso a recursos externos...............................................................................................44 3.4.3.6 Seguridad..........................................................................................................................44 3.4.3.7 Integración con la web......................................................................................................44 4 LogicRaptors .......................................................................................................................................45 4.1 Introducción....................................................................................................................................45 4.2 Arquitectura de Referencia.............................................................................................................45 4.3 LogicRaptor (Agente Móvil Inteligente) ........................................................................................47 4.4 Implementación de la Arquitectura ................................................................................................48 4.4.1 Nests ........................................................................................................................................48 4.4.2 Administrador de Agentes (AgentManager)............................................................................49 4.4.3 Administrador de Confiabilidad ..............................................................................................49 4.4.4 Servicio de Directorios ............................................................................................................50 4.5 Método de Extensión de JavaLog...................................................................................................50 4.5.1 Mecanismo de Extensión.........................................................................................................50 4.5.2 Nuevos Predicados ..................................................................................................................52 4.6 Protocolo MTP ...............................................................................................................................52 4.6.1 Descripción..............................................................................................................................53 4.6.2 Servicios de los Componentes .................................................................................................53 4.6.2.1 Nest...................................................................................................................................53 4.6.2.2 ExtendedNest....................................................................................................................54 4.6.2.3 Directory...........................................................................................................................55 4.6.3 Clases de MTP.........................................................................................................................55 4.7 LogicRaptors Center.......................................................................................................................57 4.7.1 Requerimientos........................................................................................................................57 4.7.2 Descripción de la Herramienta ................................................................................................57 4.7.2.1 Raptor Manager ................................................................................................................58 4.7.2.2 Nest View .........................................................................................................................58 4.7.2.3 Nest Observer ...................................................................................................................59 4.7.2.4 Documentation .................................................................................................................60 4.7.3 Implementación .......................................................................................................................60 4.8 Características técnicas de la arquitectura propuesta...................................................................... 61 4.8.1 Identidades...............................................................................................................................61 4.8.2 Persistencia ..............................................................................................................................61 4.8.3 Migración ................................................................................................................................62 4.8.4 Comunicación..........................................................................................................................62 4.8.5 Acceso a recursos externos......................................................................................................62 4.8.6 Seguridad.................................................................................................................................62 4.8.7 Integración con la web.............................................................................................................62 5 Performance de los LogicRaptors versus Agentes Estacionarios ..............................................63 5.1 Introducción....................................................................................................................................63 5.2 Descripción de la Experiencia ........................................................................................................64 5.2.1 El Problema de la Búsqueda de Información...........................................................................64 5.2.2 Diseño de la Solución .............................................................................................................64 ii 5.2.2.1 Librerías............................................................................................................................64 5.2.2.2 Configuración de los Agentes...........................................................................................65 5.2.2.3 Aproximación con Agentes Estacionarios ........................................................................65 5.2.2.4 Aproximación con Agentes Móviles ................................................................................66 5.2.3 Ambiente de Ejecución............................................................................................................67 5.3 Testeo y Análisis ............................................................................................................................67 5.3.1 KSnuffle ..................................................................................................................................68 5.3.2 Resultados ...............................................................................................................................68 5.3.2.1 Cantidad de paquetes ........................................................................................................68 5.3.2.2 Tráfico en kilobytes ..........................................................................................................69 5.3.2.3 Cantidad total de datos transmitidos en kilobytes.............................................................69 5.3.2.4 Tiempo consumido en minutos.........................................................................................69 5.3.3 Análisis de los datos obtenidos................................................................................................70 5.3.3.1 Tráfico generado en la red ................................................................................................70 5.3.3.2 Overhead de comunicación...............................................................................................71 5.3.3.3 Impacto en las comunicaciones ........................................................................................71 5.3.3.4 Tiempos de Ejecución ......................................................................................................73 5.4 Conclusiones de la experiencia.......................................................................................................74 6 Conclusiones.......................................................................................................................................76 6.1 Limitaciones y posibles trabajos futuros ........................................................................................77 Apéndice A: JavaLog ............................................................................................................................79 A.1 Introducción...................................................................................................................................79 A.2 Integración de objetos y lógica ......................................................................................................80 A.3 El lenguaje JavaLog.......................................................................................................................81 A.3.1 Objetos Java en programas Prolog..........................................................................................81 A.3.1.1 Creación...........................................................................................................................81 A.3.1.2 Interacción Java-Prolog ...................................................................................................81 A.3.1.3 Envío de mensajes ...........................................................................................................82 A.3.2 Prolog Embebido ....................................................................................................................83 A.3.2.1 Módulos lógicos...............................................................................................................83 A.3.2.2 Composición de Módulo lógicos .....................................................................................88 A.3.2.3 Preprocesador JavaLog....................................................................................................90 A.4 Interacción entre agentes ...............................................................................................................90 A.4.1 Arquitectura Blackboard.........................................................................................................91 A.4.2 Delegación ..............................................................................................................................93 Glosario de Términos............................................................................................................................96 Referencias Bibliográficas....................................................................................................................99 iii Indice de Figuras Figura 1.1: Componentes de la arquitectura de referencia Figura 2.1: Paradigma Cliente-Servidor Figura 2.2: Paradigma de Código por Demanda Figura 2.3: Paradigma de Evaluación Remota Figura 2.4: Paradigma de Agentes Móviles Figura 2.5: Diferentes semánticas ofrecidas por la operación de migración Figura 2.6: Relaciones entre un agente, y comunidades homogéneas y heterogéneas Figura 3.1: Esquema conceptual del framework Telescript Figura 3.2: Esquema conceptual del framework de los Aglets Figura 3.3: Esquema conceptual del framework ffMAIN Figura 3.4: Esquema conceptual del framework D´Agents Figura 3.5: Arquitectura AgentSpace Figura 3.6: Arquitectura Jumping Beans Figura 4.1: Diagrama de componentes de la arquitectura de referencia Figura 4.2: Diagrama de clases de los Nests Figura 4.3: Diagrama de Interacción de la carga de los predicados definidos Figura 4.4: Diagrama de clases de Javalog.raptors.mtp Figura 4.5: Vista de la interface de RaptorManager Figura 4.6: Vista de la interface de NestView Figura 4.7: Vista de la interface de NestObserver Figura 4.8: Diagrama de clases de LogicRaptors Center Figura 5.1: Diagrama de secuencia de búsqueda de un agente estacionario Figura 5.2: Diagrama de secuencia de búsqueda de un LogicRaptor Figura 5.3: Tráfico de red generado por los LogicRaptors vs los agentes estacionarios Figura 5.4: Porcentaje de desperdicio de ancho de banda Figura 5.5: Tráfico de red generado por los Agentes Estacionarios Figura 5.6: Tráfico de red generado por los LogicRaptors Figura 5.7: Tiempo de ejecución de los LogicRaptors vs los agentes estacionarios Figura A.1: Esquema de composición de módulos Figura A.2: Arquitectura Blackboard Figura A.3: Sistema de múltiples comunidades de agentes Figura A.4: Interacción entre agentes 04 09 10 10 11 20 24 28 29 31 32 33 37 46 48 51 55 58 59 60 61 66 66 70 71 72 72 74 80 92 94 94 iv Indice de Tablas Tabla 4.1: Descripción de los predicados incorporados a JavaLog. Tabla 5.1: Características de las computadoras utilizadas en la primer escenario de la experiencia. Tabla 5.2: Características de las computadoras utilizadas en el segundo escenario de la experiencia. Tabla 5.3: Datos obtenidos de la cantidad de paquetes transmitidos. Tabla 5.4: Datos obtenidos del tráfico de red generado. Tabla 5.5: Datos obtenidos de la cantidad total de datos transmitidos. Tabla 5.6: Datos obtenidos del tiempo de ejecución con velocidad de transmisión de 100 mbps. Tabla 5.7: Datos obtenidos del tiempo de ejecución con velocidad de transmisión de 10 mbps. 52 67 67 68 69 69 69 70 v 1 Introducción En este capítulo se presentan las motivaciones y objetivos del presente trabajo, dando además una primera visión general de la solución propuesta. También se describe la organización del resto de esta documentación. 1.1 Motivaciones La tecnología orientada a agentes de software y sus diversas ramas aparecen hoy en día como una de las más importantes para construir el software de las futuras computadoras. El éxito creciente de esta nueva generación de servicios y aplicaciones basadas en agentes produce un potencial industrial y un impacto económico en diferentes áreas. Entre las principales podemos mencionar: el comercio, los medios de comunicación, y en general todas aquellas áreas en donde sea necesario la adquisición y el manejo de información. Uno de los dominios mas importantes hoy en día de las aplicaciones basadas en agentes es Internet, y aunque la tecnología de las comunicaciones ha tenido un notable crecimiento estos últimos años, no ha podido crecer a la misma velocidad en que lo ha hecho la cantidad de información disponible en toda la red. Por otro lado, al mismo tiempo que creció la cantidad de información, también se incrementó el número de usuarios que utiliza los servicios provistos en Internet. Por lo tanto, se puede inferir que pronto los canales de comunicación no serán suficientes para abastecer las demandas de todos los usuarios, y debido a eso es que paradigmas computacionales de redes clásicos como el paradigma Cliente-Servidor o el paradigma de código en Demanda, están siendo reemplazados por el paradigma de agentes móviles. Dentro de las tecnologías orientadas a agentes, particularmente los sistemas de agentes móviles representan actualmente uno de los paradigmas más prometedores para la programación de sistemas ampliamente distribuidos y heterogéneos [Chess 95]. Este tipo de sistemas involucra dos conceptos básicos: sitios servidores de recursos y agentes que poseen la habilidad de trasladarse a los sitios para acceder a sus recursos, o contactarse con otros agentes [Kotz 99]. La movilidad de agentes, es decir su habilidad de migrar de un sitio a otro, constituye la principal diferencia de enfoque con respecto a otras alternativas existentes para el desarrollo de sistemas distribuidos, como los de llamadas a procedimientos remotos, evaluación remota o código por demanda [Fuggetta 98]. Introducción Las principales ventajas identificadas en el uso de agentes móviles, radican en la potencial reducción de costos de comunicación global mediante la migración de las unidades de computación a los datos y la posibilidad de distribuir computaciones complejas en diferentes sitios, posiblemente heterogéneos. Adicionalmente, varios trabajos [Lange 99], [Gray 00], [Wong 97] han mostrado la utilidad de los agentes móviles para aplicaciones de comercio electrónico, recuperación de información distribuida, entre otras. Tales aplicaciones se benefician al utilizar agentes móviles al explotar sus capacidades de procesamiento autónomo y asincrónico, adaptabilidad dinámica a los cambios de su ambiente de ejecución y tolerancia a fallas. Los lenguajes de programación orientados a objetos poseen características que permiten satisfacer parte de los requerimientos de la programación orientada a agentes [Shoham 97] y en particular de agentes móviles [Wong 99]. Según estos enfoques, un agente puede modelarse mediante un objeto cuyos métodos representan sus habilidades, y las variables de instancia su estado mental. De esta forma, un objeto encapsulará en sus métodos capacidades comportamentales de un agente y su conocimiento estará dado por el estado de sus variables de instancia. Actualmente, se ha desarrollado un número importante de sistemas que utilizan el lenguaje orientado a objetos Java como soporte de programación de agentes móviles. Ejemplos de estos sistemas de soporte basados en Java, son: Aglets [Lange 98], SOMA [Bellavista 99] y MOLE [Strasser 96]. Las ventajas que Java provee a la tecnología de agentes móviles, son fundamentalmente su soporte multiplataforma y la ubicuidad de su máquina virtual, lo cual facilita la adopción de agentes móviles en Internet. Adicionalmente, Java presenta características no encontradas en otros lenguajes que permiten la implementación directa de agentes móviles [Wong 99]. Por ejemplo, Java facilita la migración del código del agente y su estado mediante mecanismos de serialización de objetos y carga dinámica de clases locales o remotas. Por otra parte, el soporte de comunicaciones en redes provisto por Java incluye sockets, comunicaciones mediante diversos protocolos y una infraestructura para el acceso a objetos distribuidos denominado remote method invocation (RMI). A pesar de las bondades que los lenguajes orientados a objetos presentan para la programación orientada a agentes en general, y Java en particular para agentes móviles, estos lenguajes adolecen sin embargo de limitaciones. Estas limitaciones se evidencian a la hora de tratar con las actitudes mentales de los agentes, debido a que se deben implementar distintos algoritmos de inferencia sobre las variables de instancia que representan el conocimiento del agente. Estos algoritmos, en caso de ser implementados en lenguajes orientados a objetos, son en general, costosos de programar y poco flexibles a cambios [Zunino 01]. Es ampliamente aceptado que el paradigma de programación lógica representa una alternativa apropiada para manejar actitudes mentales debido a su evidente soporte para representar e inferir relaciones [Wooldridge 99]. Los lenguajes de programación en lógica permiten representar actitudes mentales en forma declarativa por medio de cláusulas lógicas. Estas cláusulas son interpretadas por algoritmos deductivos que, en el contexto de la programación de agentes, dan origen a razonamientos dependientes del conocimiento propio de los agentes. Desafortunadamente, los lenguajes lógicos presentan deficiencias en la programación de agentes debido a su imposibilidad de encapsular información y tratar con conocimiento privado [Amandi et al. 99]. JavaLog es un lenguaje de programación multiparadigma que integra ambas, programación lógica y orientada a objetos, por lo tanto facilita y mejora el desarrollo 2 Introducción de sistemas de agentes inteligentes. Esto ayuda a solucionar las limitaciones mencionadas anteriormente, permitiendo a los agentes manejar actitudes mentales complejas. Para poder integrar las ventajas que proveen los sistemas de agentes móviles mencionadas anteriormente, principalmente la reducción de costos de comunicación con las ventajas de utilizar agentes programados en Prolog se necesita tener una arquitectura que brinde soporte para la movilidad de tales tipos de agentes. Entre todos los sistemas de agentes móviles existentes, el más similar a nuestro sistema de agentes móviles ideal es Jinni, el cual consiste de un interprete Prolog desarrollado en Java. Pero, aunque presenta las ventajas mencionadas anteriormente sobre el uso conjunto de los paradigmas orientado a objetos y lógico; presenta también varias desventajas. Sólo soporta un subconjunto muy reducido de Prolog, lo que limita considerablemente su potencia expresiva. Otro aspecto que dificulta enormemente la utilización de Jinni lo constituye su limitado esquema de migración de unidades de ejecución. A pesar de que las alternativas para solucionar estas deficiencias utilizando los recursos propios del lenguaje son variadas, todas ellas adolecen de dos problemas: no son transparentes para el programador y en ciertos casos generan más problemas que los que solucionan. Estudiaremos con más detalle este sistema en el capítulo 3. Nuestra propuesta consiste en una arquitectura que permite implementar sistemas de agentes móviles usando Javalog. Esto permite que los agentes sean programados usando el paradigma de programación en lógica y todos los mecanismos de comunicación estén implementados en Java. 1.2 Solución Propuesta En esta propuesta se presenta un enfoque para soportar el diseño y programación de agentes móviles inteligentes basados en Prolog. Este enfoque es materializado esencialmente por una arquitectura de software basada en agentes móviles desarrollados en JavaLog [Amandi et al. 99], [Zunino 01], un lenguaje que integra los paradigmas de programación lógica y de orientación a objetos. 1.2.1 Infraestructura para el soporte de Agentes Móviles Inteligentes La Figura 1.1 presenta una arquitectura de software para el soporte de agentes móviles inteligentes. Esta se basa esencialmente en la arquitectura genérica de agentes móviles basados en Java descripta en [Belloni - Campo 01]. En el diagrama, que utiliza notación UML [Rumbaugh et al. 99], se pueden visualizar los diferentes componentes que forman parte de la arquitectura. Los principales componentes son el administrador de agentes, el administrador de comunicaciones entre agentes, el administrador de seguridad, el administrador de confiabilidad, el portal servidor de aplicaciones y un administrador de directorios. El administrador de agentes es responsable por la recepción de agentes para su ejecución en el sitio local y del envío de agentes para ser ejecutados en sitios remotos. Antes de efectuar la migración de un agente, este administrador lo serializa junto con su estado. Luego, delega el envío de esta representación serializada del agente al administrador de confiabilidad, el cual asegura que el agente es recibido por el administrador de agentes correspondiente en el sitio destino. Al recibirlo, este 3 Introducción componente reconstruye el agente y los objetos que el referencia, a partir de su representación serializada, creando su contexto de ejecución. Servidor de Agentes Móviles Inteligentes Administrador de Comunicaciones entre Agentes Servidor de Agentes Móviles Inteligentes Administrador de Agentes Administrador de Acceso a Servidores de Aplicaciones Aplicación Externa Brain Agente Móvil Inteligente (LogicRaptor) Módulo Lógico Administrador de Confiabilidad Administrador de Seguridad Administrador de Directorios Figura 1.1: Componentes de la arquitectura de referencia El administrador de seguridad es responsable por la autenticación del agente antes de que este comience su ejecución. La máquina virtual Java subyacente invocará automáticamente a este componente para autorizar cualquier intento de utilizar recursos del sistema por parte de los agentes. El administrador de comunicaciones entre agentes facilita la comunicación entre agentes móviles dispersos en diferentes sitios. Los agentes pueden utilizar el administrador de directorios para identificar la localización de un servidor de aplicaciones y luego migrar al sitio en el cual este servidor esta localizado. El portal servidor de aplicaciones representa para los agentes un punto de acceso a aplicaciones externas al sistema de agentes móviles, residentes en el sitio local, como por ejemplo acceso a servidores de bases de datos. 1.2.2 LogicRaptors Los agentes móviles descriptos son implementados con JavaLog [Amandi et al. 99], [Zunino 01], un lenguaje que integra los paradigmas de orientación a objetos (Java) y de programación lógica (Prolog). JavaLog utiliza objetos para modelar las habilidades de los agentes y cláusulas lógicas para modelar el estado mental de dichos agentes. Las habilidades de los agentes pueden estar representadas por capacidades de acción como por capacidades de comunicación con otros agentes, mientras que el estado mental puede presentarse en forma de creencias, intenciones y compromisos. JavaLog define al módulo como concepto básico de manipulación. En este sentido, un objeto y un método son vistos como módulos. Un objeto es un módulo que encapsula datos y un método es un objeto que encapsula comportamiento Los agentes móviles construidos con JavaLog son denominados LogicRaptors. Estos agentes encapsulan un objeto compuesto denominado brain. Este objeto es una 4 Introducción instancia de un intérprete de módulos lógicos que utiliza cláusulas Prolog. Este intérprete está implementado en Java y permite utilizar objetos dentro de cláusulas lógicas, así como embeber módulos lógicos dentro de código Java. Cada agente es una instancia de una clase que puede definir parte de sus métodos en Java y parte en Prolog. La definición de los métodos de una clase en JavaLog puede estar compuesta por varios módulos lógicos definidos en métodos y módulos lógicos referenciados por variables de instancia. Adicionalmente, la arquitectura permite incorporar servicios más inteligentes a los sitios Web mediante la utilización de agentes inteligentes móviles. Así, en cada sitio capaz de ejecutar LogicRaptors, existe al menos un Nest, el cual funciona como una dársena Web para los LogicRaptors, permitiendo así extender aplicaciones legadas cliente / servidor basadas en la Web con agentes móviles LogicRaptors. 1.2.3 Aplicaciones del trabajo El enfoque presentado para desarrollo de agentes va a ser aplicado en el dominio Socialware. El término Socialware se utiliza para caracterizar al tipo de sistemas multiagente que proveen mecanismos de asistencia a las actividades de sociedades virtuales [Hattori 99]. Como ejemplos típicos de estas actividades se encuentra el comercio electrónico, planificación de reuniones y convocatorias u ofrecimientos de voluntarios a campañas solidarias. Las aplicaciones descriptas pueden verse beneficiadas con el uso de agentes móviles representando a diferentes miembros de una comunidad virtual al desarrollar actividades sociales en comunidades remotas. Tales agentes podrían transportar las preferencias y restricciones de su representado, encapsulando estas actitudes mentales en forma declarativa. En particular, se utilizarán LogicRaptors en aplicaciones del dominio Socialware con el fin de establecer experimentalmente las ventajas de la utilización de agentes móviles respecto de tecnologías cliente / servidor tradicionales. En tal sentido, se evaluarán aspectos tales como performance, tráfico de red (tanto en LAN como en WAN), uso de recursos de hardware, etc. Como parte de este trabajo se realizó una experiencia cuyo principal propósito es recolectar datos cuantitativos que permitan determinar precisamente bajo que circunstancias conviene la utilización de agentes móviles y en que casos no. Mas aún, el objetivo de las mediciones es permitir fundamentar la conveniencia de elegir el uso de agentes móviles, en nuestro caso los LogicRaptors, por sobre los agentes estacionarios, cuando las comunicaciones son muy frecuentes y a una velocidad de transferencia muy inferior a la de una red local, como es el caso de Internet. Para realizar el análisis de performance entre los distintos sistemas multi-agentes desarrollamos soluciones con agentes móviles (LogicRaptors) y estacionarios al problema de búsqueda de información distribuida en Internet, más precisamente búsqueda de libros entre diferentes librerías virtuales. Cada una de las aproximaciones fue evaluada usando varias métricas para poder descubrir las ventajas y desventajas de cada variante. 5 Introducción 1.3 Organización de la documentación En el capítulo 2 se resumen los conceptos básicos y la terminología utilizada en el paradigma de agentes en general y en el de agentes móviles en particular. En el capítulo 3 se presentan algunos de los sistemas multi-agentes, mas significativos, existentes actualmente,. En el capítulo 4 se detalla el diseño y la implementación de nuestra propuesta. Luego en el capítulo 5 se detalla una experiencia realizada a fin de medir el desempeño de los LogicRaptors comparándolos con agentes estacionarios. En el capítulo 6 se enumeran las conclusiones y trabajos futuros. Finalmente en el apéndice A, se detallan las características más importantes de Javalog. 6 2 Conceptos Básicos sobre Agentes de Software y Agentes Móviles Este capítulo resume los conceptos básicos y la terminología utilizada en el paradigma de agentes en general y en el de agentes móviles en particular. 2.1 Introducción El paradigma de agentes no es nuevo puesto que ha sido una línea de investigación profusa en el área de Inteligencia Artificial Distribuida durante un número importante de años. En el presente, la world wide web y el lenguaje de programación Java han inyectado un gran interés por la investigación, desarrollo y difusión del paradigma de agentes. Una motivación particular para la utilización de agentes, hoy día, es la enorme cantidad de información disponible en Internet. En este contexto, los agentes presentan un potencial significativo en la búsqueda, recuperación y filtrado de información. Así mismo, la habilidad de los agentes para actuar en representación de los usuarios constituye una capacidad crucial del paradigma que garantiza su inminente implementación y distribución en un ámbito como el de Internet. Actualmente, existen al menos dos comunidades realizando investigación y desarrollos en el área de agentes: la comunidad de sistemas multi-agente y la comunidad de agentes móviles. La primera de estas comunidades se enfrenta mayormente a los problemas inherentes a los agentes estacionarios distribuidos en una red, los cuales pueden comunicarse y colaborar persiguiendo un objetivo común. La otra comunidad trata a los agentes móviles como un paradigma para el desarrollo de sistemas ampliamente distribuidos y heterogéneos. Esta última comunidad se ve representada en su mayoría por investigadores y desarrolladores en el área de tecnologías orientadas a objetos con una fuerte capacitación en sistemas operativos y sistemas distribuidos. Conceptos Básicos sobre Agentes de Software y Agentes Móviles Por lo tanto, y debido a que el paradigma de desarrollo basado en agentes de software es un área multidisciplinaria, se hace necesario establecer en primer término, un contexto común para discutir sobre agentes, sistemas de agentes y aplicaciones basadas en agentes. Este contexto común facilitará luego la comprensión y comparación de los Sistemas de Agentes Móviles existentes. En el presente capítulo se explican los principales paradigmas de redes de computación existentes en la actualidad (sección 2). Luego se introduce las definiciones básicas de agente, clausura de agentes y nodos (sección 3). Se presentan además, los conceptos relacionados con la movilidad de un agente (sección 4), y se establecen las definiciones elementales de contexto y lugar de ejecución (sección 5). Posteriormente, en la sección 6, se desarrolla el concepto de sistema de agentes móviles detallando las características principales de este tipo de sistemas. Finalmente, se caracterizan también las aplicaciones basadas en agentes en términos generales, y las de agentes móviles en particular (sección 7), resaltando además el rol de los usuarios en este tipo de aplicaciones (sección 8). 2.2 Paradigmas de redes de computación Poner a la disposición la capacidad de procesamiento de los sitios de una red no es una idea nueva, sino al contrario, se trata de una técnica muy usual; el paradigma cliente/servidor es la base para distribuir la utilización de los recursos de una red, incluyendo, desde luego, el de procesamiento. Bajo este esquema, el código denominado servicio, está prefijado en una estación que juega un papel específico -el servidor- y que está a la disposición de todos los sitios cliente. Bajo este esquema se puede distribuir el cómputo mediante la instalación de servicios en diferentes servidores de la red. Gracias a esta popular arquitectura, se han desarrollado intensamente los sistemas distribuidos que conocemos en la actualidad; sin embargo al crecer cada vez más las redes, se encontraron límites a este esquema. Así, se empezó a sentir la necesidad de flexibilizar la ejecución distribuida, basada en servicios prefijados en un servidor. Una primera idea fue la siguiente, en lugar de que los servicios estuvieran fijos siempre en una estación, por qué no moverlos a cualquiera de las estaciones conectadas a la red. Así, por ejemplo, aparecieron los programas que residen en el servidor pero que son ejecutados en los clientes (código en demanda); con esta técnica se libera a los servidores, aligerando su carga y por lo tanto, su tiempo de respuesta. Posteriormente, apareció Java como un lenguaje orientado a objetos y de propósito general, que permite la distribución de código a clientes remotos. Otra idea fue, si es posible mover código del servidor al cliente, por qué no, del cliente al servidor; este paradigma llamado evaluación remota, dio nacimiento al término de servidores elásticos. Con esta facilidad, el servidor no está sólo restringido a la ejecución de servicios generales prefijados, sino además, puede ejecutar servicios específicos requeridos por un cliente, quien envía el código correspondiente, pero no cuenta con los recursos que tiene el servidor. Así, una vez liberado el sentido del movimiento, por qué no liberar la iniciativa en la migración. De este modo, un programa con capacidad de migrar podría decidir por sí mismo una nueva migración si en el sitio al que llegó no encontró la información o los recursos necesarios para completar su misión. Para que esto sea factible, es necesario que el control de migración tenga una mayor flexibilidad y que esté a la disposición del programador de este tipo de aplicaciones. El mecanismo de decisión de migrar puede ser prefijado en un lenguaje imperativo como C o bien podría flexibilizarse aún con 8 Conceptos Básicos sobre Agentes de Software y Agentes Móviles técnicas de programación declarativa como la orientada a objetos o incluso, aún más, dando al lenguaje capacidades de procesar y almacenar conocimiento tal, que al viajar, le permita modificar, tanto su propio conocimiento como el del sitio visitado (si éste contara también con esa misma capacidad). Con este último esquema entramos en el terreno de la inteligencia artificial y a dicho tipo de entidades se les conoce como agentes móviles (entidades autónomas con una gran flexibilidad de movimiento y de cómputo). Así, mover y ejecutar código distante son los mecanismos fundamentales de este nuevo tipo de paradigma. Los agentes móviles proveen un paradigma poderoso y uniforme para redes de computación. Pueden revolucionar el diseño y desarrollo de sistemas distribuidos, para comprender mejor esto analizaremos con más detalle los paradigmas de redes de computación antes mencionados. 2.2.1 Paradigma Cliente-Servidor En el paradigma Cliente-Servidor (figura 2.1), el servidor publica un conjunto de servicios para acceder a algunos recursos. El código que implementa esos servicios está en el servidor (se dice que el servidor mantiene el know-how) y se ejecuta ahí mismo, es decir que el servidor también tiene la capacidad de procesamiento. Si el cliente está interesado en acceder a un recurso almacenado en el servidor entonces simplemente usa uno o más de los servicios provistos. Por lo tanto, en este paradigma el servidor mantiene todo: los recursos, el procesamiento y el know-how. Servidor Know How Cliente Figura 2.1: Paradigma Cliente-Servidor La mayoría de los sistemas distribuidos estén basados en este paradigma y es soportado por varias tecnologías como: Llamado a Procedimiento Remoto (RPC), CORBA, Invocación a Métodos Remotos de Java (RMI), etc. 2.2.2 Paradigma de Código por Demanda En el paradigma de código por demanda (figura 2.2) cuando el cliente es incapaz de ejecutar una tarea debido a la falta del código (know-how) puede solicitárselo a otro nodo en la red. Una vez que el código es recibido por el cliente la computación es llevada a cabo en el cliente. Por lo tanto el cliente mantiene la capacidad de procesamiento y los recursos. 9 Conceptos Básicos sobre Agentes de Software y Agentes Móviles Servidor Cliente Download (Applet) Know How Know How Figura 2.2: Paradigma de Código por Demanda Los Applets de Java son ejemplos prácticos de este paradigma. Los applets son descargados en navegadores web y ejecutados localmente utilizando los recursos que posee el cliente. 2.2.3 Paradigma de Evaluación Remota El paradigma de Evaluación Remota (figura 2.3) fue propuesto como una alternativa al paradigma Cliente-Servidor, a comienzos de la década del 90. En este paradigma, el cliente envía el código del procedimiento (know-how), requiriendo al servidor que lo ejecute y retorne luego los resultados. Cliente Know How Servidor Know How Figura 2.3: Paradigma de Evaluación Remota 2.2.4 Paradigma de Agentes Móviles En esta sección se dará una breve introducción del paradigma de agentes móviles. En la siguiente, cuando se describan los agentes móviles, se continuará y se agregarán detalles concernientes a este paradigma. El paradigma de agentes móviles (figura 2.4) puede ser comprendido como un concepto arquitectónico para la realización de sistemas distribuidos. Tal paradigma es particularmente conveniente si la adaptabilidad y la flexibilidad están entre las principales características que el sistema a desarrollar debe poseer. La característica clave de este paradigma es que cualquier sitio en la red posee un alto grado de flexibilidad para poseer cualquier combinación de know-how, procesamientos y recursos. Sus capacidades de procesamiento pueden ser combinadas con recursos locales. El know-how, en forma de agente móvil, ya no está atado a un sitio en particular. 10 Conceptos Básicos sobre Agentes de Software y Agentes Móviles Agente red Know How Host Agente red Know How red Host Figura 2.4: Paradigma de Agentes Móviles 2.3 Agentes de Software Existen numerosas definiciones acerca de agentes, y generalmente varían unas de otras dependiendo del dominio en donde se sitúen los agentes. Por lo tanto es difícil encontrar una definición que se ajuste con exactitud a lo que nosotros consideramos como un agente de software. Una definición básica de agente de software, aunque demasiado general y tomada desde el punto de vista de un usuario final es la siguiente: Un agente es un programa que asiste a alguien (una persona) o algo (una organización u otro agente) y actúa por sí mismo con cierta autonomía. [LangeOshima 98]. Otra de las definiciones de agente más comúnmente utilizada es aquella que presentan [Woolridge-Jennings 73]. Ellos elaboran acerca de lo que es un agente basándose principalmente en dos nociones: una definición fuerte de agente y otra débil. La definición fuerte involucra técnicas de inteligencia artificial y modelos para caracterizar a los agentes, desde un punto de vista interno, utilizando nociones mentales como ser su conocimiento, sus creencias, intenciones y obligaciones, o incluso sus atributos emocionales. Mientras que en la definición débil las características más importantes son la autonomía, sociabilidad, reactividad y movilidad, y estas se observan desde un punto de vista externo. Dado que existen muchos tipos de agentes que operan de diversas maneras, las características que todos estos agentes comparten constituyen la esencia para determinar con mayor precisión qué es un agente. Un agente es una entidad de software que: ¾ Está situado dentro de un ambiente de ejecución. ¾ Posee alguna de las siguientes características: • es reactivo: sensible a los cambios en el ambiente y actúa de acuerdo a esos cambios. • es autónomo: tiene control sobre sus acciones. • está dirigido por objetivos (proactivo). • es temporalmente continuo: está ejecutando continuamente . ¾ Y también puede poseer alguna de estas características ortogonales: • es comunicativo: capaz de comunicarse con otros agentes. • es móvil: puede migrar de un nodo a otro. 11 Conceptos Básicos sobre Agentes de Software y Agentes Móviles • es capaz de aprender: se va adaptando de acuerdo con experiencias previas. [Lange-Oshima 98] La anterior definición describe más detalladamente y desde el punto de vista de un programador, que es, como se comporta y las características que debe poseer un agente. 2.3.1 Clausura de Agentes El código de un agente consiste no solamente del código de su tipo/clase específico, sino también del código de todos los tipos/clases heredadas o referenciadas. A dicho conjunto se le llama la clausura del agente. 2.4 Movilidad La gran difusión en el uso de redes a gran escala, como lo es Internet, está planteando al mismo tiempo y de manera correlacionada, un nuevo dominio de aplicación y un nuevo paradigma de programación que, cada vez, se empieza a escuchar más y que tiene que ver con la movilidad. Últimamente se mencionan términos como código móvil, comunicación "inteligente", agentes móviles, migración de procesos, aplicaciones itinerantes, etc. Pero no sólo se habla de conceptos, también hay ya herramientas disponibles que integran esa característica, como por ejemplo, Java. La idea básica de este paradigma es la transmisión no de datos, sino la de código listo para ser ejecutado en algún servidor de la red. Si se analiza bien, esta idea no es nada nueva, la podemos encontrar desde los principios de las redes, cuando se iniciaba la descentralización de las grandes computadoras. En esa época se popularizaron los RJE (remote job entry), minicomputadoras de uso específico, cuya función era enviar lotes de programas (código) para ser ejecutados en una gran computadora central de propósito general, y posteriormente, recibir los resultados. En este caso no se transmitían datos, se enviaba código. Otro ejemplo, es el popular RSH (Remote Shell) de UNIX, que existe desde que el sistema operativo UNIX se integró a una red TCP/IP. Con este intérprete, no sólo se puede enviar y ejecutar código en cualquiera de las estaciones UNIX conectadas a una red, sino además permite intercomunicar los procesos distantes a través de un mecanismo de comunicación muy simple, los "pipes" (envío/ejecución de código distante y "pipes" son los mecanismos básicos de programación de procesos distribuidos en una red de sistemas UNIX). Igualmente, como ha sucedido con otros paradigmas, aunque el concepto básico ya existía, no se había generalizado ni tampoco se había analizado todo su potencial aplicativo. Este potencial sólo se hizo patente, primero, cuando el uso de las redes se hizo muy popular, gracias a las interfaces abiertas que permitieron la interconexión de sitios heterogéneos, como es el caso de los "navegadores"; y segundo, cuando la interconexión de estaciones se hizo a una gran escala, como es el caso actual de Internet. Con una red de esta dimensión, en principio se cuenta con la posibilidad de utilizar todos los recursos de la red, los cuales son prácticamente ilimitados, aún comparándolos con los que podría ofrecer la mayor supercomputadora del mundo. En particular, uno de los recursos más interesantes que se pueden utilizar es el de procesamiento que, potencialmente, ofrece todos los sitios conectados a la red. 12 Conceptos Básicos sobre Agentes de Software y Agentes Móviles El concepto de movilidad plantea, a nivel de la implementación, problemas tales como: lograr una ejecución homogénea en procesadores heterogéneos; distintos temas asociados con la seguridad del sistema; generalizar y controlar las funciones básicas para integrarlas en la semántica de un lenguaje orientado a la movilidad; y definir modelos que nos faciliten la especificación y diseño de aplicaciones itinerantes. Todos estos problemas, son temas de desarrollo e investigación que actualmente se están realizando en diversos centros y laboratorios de investigación. Sin embargo, aunque no se ha definido la movilidad, ya hay lenguajes que tienen ciertas características de movilidad, tales como Java y Telescript. Con estos nuevos lenguajes se pueden implementar aplicaciones que requieran de enviar instructivos completos (programas) en lugar de un intercambio de datos o llamadas a ejecución remota, o el envío de expertos viajantes (agentes móviles) con capacidad para migrar, si requiere de otros recursos no existentes en el sitio visitado; nuevas aplicaciones que antes no se planteaban al pensar que el código era inamovible. 2.4.1 Nodos Un nodo, también llamado comúnmente host, sitio ó servidor, es una infraestructura de hardware y software sobre la cual los agentes son ejecutados. Típicamente, un nodo es una computadora, pero en el futuro cercano seguramente este concepto abarcará computadoras móviles/portátiles, como por ejemplo asistentes personales digitales, comunicadores personales inteligentes, PCs hand-helds, televisores, teléfonos celulares y otros dispositivos. Usualmente, un agente ejecuta en un nodo. Sin embargo, durante su ciclo de vida, puede migrar a través de un número arbitrario de nodos. Un agente puede estar duplicado, pero cada agente sólo puede ser ejecutado en un nodo a la vez. 2.4.2 Movilidad de Agentes Dentro de la movilidad de código una de las aplicaciones mas importantes es la movilidad de agentes de software. Los sistemas que utilizan agentes móviles deben tener especial cuidado en considerar cuestiones relacionadas a como identificar a agentes viajantes desconocidos con los que se desea comunicar; como proteger a los sitios receptores de agentes "mal intencionados"; como proteger a los agentes viajantes de sitios "mal intencionados", etc. La movilidad es una propiedad ortogonal de los agentes, es decir que no todos los agentes son móviles. Por lo tanto, con respecto a esta propiedad, hay dos tipos de agentes: móviles y estacionarios (o estáticos). 2.4.2.1 Agentes Estacionarios Un agente estacionario ejecuta solamente en el sistema en donde comienza la ejecución. Si necesita información que no está en el sistema o necesita interactuar con un agente ubicado en un sistema diferente, típicamente usa un mecanismo de comunicación tal como llamado a procedimientos remotos (RPC). Una característica importante de los agentes estacionarios es que debido a que no migran de un nodo a otro, no presentan problemas de seguridad para el sistema, sin 13 Conceptos Básicos sobre Agentes de Software y Agentes Móviles embargo, en el sistema, igualmente, se deben prevenir ataques de agentes de otros sistemas de agentes móviles. 2.4.2.2 Agentes móviles Un agente móvil no está atado al sistema en donde comienza su ejecución. Tiene la habilidad de transportarse de un nodo a otro. Puede migrar entre diferentes nodos para ejecutar algunas tareas predefinidas de forma local a los recursos que le sean necesarios (tales como otros agentes, un sistema de archivos, o grandes bases de datos). Las ventajas de ejecutar localmente con respecto a los recursos necesitados frente a la ejecución remota, son principalmente, la disminución del tráfico de red y del tiempo de ejecución, Esta ventaja puede ser de mucha utilidad cuando la aplicación se ejecuta en redes muy saturadas o con alto nivel de latencia y bajas tasas de transferencia. Por medio de la transmisión de programas ejecutables entre diferentes máquinas (posiblemente heterogéneas), la computación basada en agentes móviles introduce un nuevo paradigma, como se explicó brevemente en la sección 2.2.3, para la implementación de aplicaciones distribuidas en un ambiente abierto y dinámico. A partir del punto de vista del clásico estilo arquitectónico cliente-servidor, el cual es actualmente el modelo arquitectónico que prevalece para el desarrollo de sistemas distribuidos, los agentes móviles pueden ser vistos como una extensión o generalización del bien conocido mecanismo de llamada a procedimiento remoto (RPC). No obstante, mientras que en el caso de RPC se mueven datos del cliente a un procedimiento que ya reside en el servidor, en el contexto de agentes móviles el cliente despacha un agente, el cual viaja al servidor y realiza allí su tarea interactuando localmente con los recursos de dicho servidor. Adicionalmente, es de destacar que en el caso de RPC, el cliente usualmente permanece ocioso mientras el procedimiento remoto es ejecutado. Por lo tanto, los agentes móviles son capaces de emular el mecanismo de llamada a procedimiento remoto pero fundamentalmente, ellos permiten también estructuras más flexibles y dinámicas que los tradicionales sistemas basados en el paradigma cliente-servidor. Comparado con mecanismos de menor nivel de abstracción tales como RPC o pasaje de mensajes, el uso de agentes móviles en el desarrollo de aplicaciones distribuidas tiene varios beneficios: • Ejecución asincrónica de tareas: Los clientes pueden realizar otras tareas mientras el agente actúa en su representación en un sitio remoto. • Mayor dinámica: No es necesario instalar un procedimiento específico en un servidor y anticipar tipos de requerimientos de servicios; un cliente o un proveedor de servicio puede enviar diferentes tipos de agentes (implementando nuevos servicios, por ejemplo) a un servidor sin necesidad de reconfigurar el mismo. • Reducción del ancho de banda de la comunicación: Si grandes volúmenes de datos del servidor deben ser procesados (datos acerca del clima, por ejemplo) o si sólo porciones relevantes de información deben ser filtradas, resulta más económico transferir la computación (es decir, un agente en este caso) a los datos que enviar los datos a la computación. 14 Conceptos Básicos sobre Agentes de Software y Agentes Móviles • Mejora de las capacidades de tiempo real: Agentes actuando localmente sobre un sitio remoto pueden reaccionar más rápido a eventos remotos que si estos eventos y reacciones a tales eventos tienen que ser comunicados entre la máquina remota y una entidad central. • Alto grado de robustez: Un agente puede ser instruido acerca de cómo tratar con problemas potenciales tales como servidores no disponibles (como por ejemplo, ir a fuentes alternativas o reintentar posteriormente). En general, la tolerancia a fallas es promovida debido a que el agente móvil es capaz de reaccionar ante situaciones adversas. • Soporte mejorado ante mecanismos conectados de forma intermitente: En lugar de estar en línea por algún largo periodo, un usuario puede desarrollar un agente móvil de forma desconectada, despachar el agente durante una breve sesión de conexión y recibir el agente nuevamente junto con el resultado posteriormente. Aplicaciones basadas en agentes móviles sobre un dispositivo personal (tal como un PDA) pueden moverse a un sitio que está en línea permanentemente cuando el dispositivo es apagado para salvar energía. En un sentido amplio, un agente es un programa que actúa en representación de un usuario. En este contexto, un agente móvil es un programa el cual representa a un usuario en una red de computadoras. Este programa es capaz de migrar de forma autónoma entre diferentes sitios, para realizar alguna computación en representación de dicho usuario [Karnik-Tripathi 98]. Esencialmente, el paradigma de agentes móviles ha evolucionado a partir de otros dos paradigmas antecesores: Cliente-Servidor y Evaluación Remota [KarnikTripathi 98]. Tradicionalmente, el desarrollo de las aplicaciones distribuidas se ha basado en el paradigma cliente-servidor en el cual los procesos clientes y servidores se comunican por medio de pasaje de mensajes o llamadas a procedimientos remotos (RPC). Esta forma de comunicación es sincrónica, es decir el cliente se suspende después de enviar un requerimiento al servidor, esperando por los resultados de la llamada remota. En RPC se transmiten datos entre el cliente y el servidor. Esta transmisión de datos se da en ambas direcciones. En el paradigma de evaluación remota, se envía código desde el cliente al servidor, y se retornan datos. En contraste con estos enfoques, en el paradigma de agentes móviles se envía, del cliente al servidor, un programa que encapsula código, datos y contexto de ejecución. A diferencia de una llamada a procedimiento, el agente móvil no tiene que retornar los resultados al cliente. El agente podría migrar a otros servidores y transmitir la información recolectada a su lugar de origen o volver a tal sitio según sea más apropiado. Los agentes móviles pueden ser considerados como el último punto en la evolución incremental de las abstracciones existentes sobre movilidad, que incluyen: código, objetos y procesos móviles [White 98]. Así por ejemplo, lo que se transfiere en un caso de código móvil, tal como la transferencia de un applet, consiste únicamente de código. En un caso de objeto móvil esto consiste de código y datos, mientras que en un caso de proceso móvil se incluye además el estado del hilo de ejecución. Entre tanto el estado transferido de un agente móvil consiste además del código, datos, y 15 Conceptos Básicos sobre Agentes de Software y Agentes Móviles contexto de ejecución, la autoridad de su propietario, que certifica sus derechos en el acceso a los recursos y servicios disponibles para el agente. Por otra parte, y teniendo en cuenta el patrón de movimiento [White 98], se pueden establecer diferencias importantes entre los agentes móviles, applets y servlets. Un applet es descargado (downloaded) en el cliente desde el servidor, mientras que un servlet se carga (uploaded) en el servidor como consecuencia de un requerimiento por parte del cliente. Los agentes móviles, por su parte, pueden migrar entre diferentes sitios sin interactuar continuamente con aquel que lo originara. Este sitio o lugar de origen se ve involucrado generalmente, en el ciclo de vida del agente móvil, sólo cuando el agente migra al primer sitio en su derrotero y cuando el agente retorna del último lugar visitado. 2.4.2.3 Contexto El contexto es la interfase pública provista por cada sistema de agentes móviles. Hay un mapeo directo y único entre el sistema de agentes móviles y el contexto, lo que significa que cada sistema de agentes móviles está representado por un correspondiente contexto. 2.4.2.4 Lugares de ejecución El contexto puede organizarse en un conjunto de entidades lógicas designadas por lugares de ejecución, places, sitios o simplemente lugares. Esto significa que un contexto contiene varios lugares. Los lugares y el contexto están unívocamente identificados por una dirección electrónica. Los lugares y los agentes constituyen los conceptos básicos inherentes a un sistema de agentes móviles [White 97]. Un sistema de agentes móviles involucra un número de lugares donde se proveen diferentes recursos y servicios dispuestos para los agentes. Los lugares son lugares lógicos donde los agentes ejecutan, se encuentran y se comunican con otros agentes, además pueden migrar o moverse entre varios lugares con el objeto de reunirse con otros agentes o para acceder a los servicios y recursos provistos por los lugares de ejecución. 2.5 Sistemas de agentes móviles El sistema responsable del soporte y manipulación de los agentes se denomina Sistema de Agentes Móviles. Uno o más sistemas de agentes móviles pueden existir en cada nodo. Algunas veces un sistema de agentes móviles es también llamado un "sistema de agentes". Sin embargo, preferimos sistema de agentes móviles ya que "sistema de agentes" es demasiado general y algunas veces ambiguo. Otros nombres que suelen recibir los sistemas de agentes móviles, son "motor" (engine), "servidor de agentes" (agent server), "punto de encuentro de agentes", etc. El sistema de agentes móviles provee un ambiente computacional completo para ejecutar un agente, así como también otras características tales como persistencia del agente, seguridad y movilidad. Para poder soportar aplicaciones distribuidas y en particular movilidad de los agentes, diferentes sistemas de agentes móviles deben poder comunicarse entre ellos usando protocolos de bajo nivel y acordar en formatos comunes de representación de agentes (por ejemplo, usando técnicas bien conocidas de 16 Conceptos Básicos sobre Agentes de Software y Agentes Móviles marshalling como las que se encuentran en los sistemas de RPC y CORBA). El sistema de agentes móviles debería también proveer (o al menos integrar) APIs específicas para permitir accesos a servicios externos y recursos, tales como bases de datos (por ejemplo ODBC o JDBC), el sistema de archivos y dispositivos físicos (mouse, pantalla, teclado o smart cards). 2.5.1 Sistemas de Agentes Móviles vs Sistemas Middleware Un Sistema Middleware es software que conecta dos aplicaciones separadas. Por ejemplo, hay numerosos productos middleware que enlazan sistemas de bases de datos a servidores Web. Esto permite a los usuarios requerir datos de una base de datos usando formularios mostrados sobre un navegador Web, y esto permite al servidor Web retornar páginas Web dinámicas basadas en el pedido y en perfil de los usuarios. El término middleware es usado para describir productos separados que sirven como pegamento entre dos aplicaciones. Es, por lo tanto, distinto de importar o exportar características que pueden ser construidas en una de las aplicaciones. Middleware es a veces llamado “tubería” porque conecta dos lados de una aplicación y pasa datos entre ellas. Es importante resaltar la relación entre sistemas de agentes móviles y sistemas middleware, tales como implementaciones CORBA, RMI y DCOM. Estos últimos presentan algunas similitudes porque soportan el desarrollo y la ejecución de aplicaciones distribuidas. Sin embargo, los sistemas de agentes móviles proveen un framework para desarrollar aplicaciones basadas principalmente en el paradigma de agentes. Mientras que los sistemas middleware usan el paradigma orientado a objetos. La principal diferencia entre estos tipos de sistemas es mejor discutida a través de dos dimensiones: flexibilidad y especificidad. Los sistemas de agentes móviles son diseñados e implementados para soportar tipos bien definidos de aplicaciones basadas en agentes, llamada la generación emergente de aplicaciones de agentes (móviles), en el contexto de comercio electrónico. Por otro lado, los sistemas middleware (tales como implementaciones CORBA, RMI y DCOM) son más flexibles porque ellos ofrecen características de soporte de bajo nivel. Se espera que la siguiente generación de sistemas de agentes móviles sea desarrollada sobre algún tipo de sistema middleware porque provee distintas características técnicas (tales como comunicación, seguridad y persistencia) que pueden ser usadas directamente y más fácilmente por arquitecturas de sistemas de agentes móviles 2.5.2 Características de los Sistemas de Agentes Móviles Los sistemas de agentes móviles tienen un conjunto de características, tanto técnicas como funcionales, que son necesarias para el soporte de aplicaciones basadas en agentes. A continuación analizaremos algunas de las mas significativas: 2.5.2.1 Ejecución de agentes El requerimiento más básico de un sistema de agentes móviles es el de proveer un ambiente de ejecución para los agentes. Este ambiente asigna a cada agente recursos, tales como espacio en disco, memoria, tiempo de CPU y canales de 17 Conceptos Básicos sobre Agentes de Software y Agentes Móviles comunicación.. El ambiente es responsable de la ejecución/interpretación del código del agente. Hay dos enfoques diferentes del diseño del sistema de sistemas móviles: • Sistemas de agentes móviles con lenguaje de programación de Agentes (APL): Este es lo usado por la mayoría de los sistemas, en el cual hay soporte sólo para agentes programados en un lenguaje de programación específico. • Sistemas MA independiente del APL. El diseño de este tipo de sistema de agentes móviles permite la integración de diferentes ambientes de ejecución de una manera independiente e incremental. De esta manera, el sistema soporta la ejecución de agentes construidos usando diferentes lenguajes de programación, ya que el ambiente de ejecución correspondiente existe. Sin embargo, se debe hacer notar que aunque los agentes pueden ser programados en diferentes lenguajes, deben proveer un modelo de objetos similar (por ejemplo: librerías de clases específicas). 2.5.2.2 Generación y administración de identidades Debido a la interacción entre agentes y entre agentes y usuarios aparece la cuestión de como identificar a los agentes y los lugares de ejecución donde ejecutan. Hay diferentes perspectivas: • Tipos de identificador: Un recurso puede ser identificado de diferentes maneras: por su dirección o por su nombre. • Modelos de administración: Hay dos modelos principales de administración de nombres/direcciones: uno lineal y otro jerárquico. En el primero a cada recurso se le asigna una identificación única global, independiente del lugar del recurso, es decir hay un único servidor encargado de asignar direcciones únicas o convertir nombres lógicos en direcciones físicas. En el modelo jerárquico, hay una jerarquía de dominios y cada uno manejado por su propio servidor, una dirección se compone de varias partes cada una representando una subdirección en la jerarquía de dominios. • Tipos de recursos: En general, los siguientes recursos deben ser identificados en forma distinta: sistemas de agentes móviles, lugares de ejecución y agentes. 2.5.2.3 Persistencia La persistencia puede ser definida como la capacidad de guardar la información del estado de un ambiente de ejecución a otro. La persistencia es una característica muy necesaria en ocasiones. Por ejemplo, un agente que va a estar inactivo por mucho tiempo puede ser almacenado en disco para ahorrar memoria, o un agente que migra a otro sitio puede querer continuar su ejecución en el mismo estado en que estaba antes de migrar. El agente debe ser serializado (convertido a una secuencia de bytes en un formato predeterminado) antes de ser almacenado o transmitido a través de una red, y 18 Conceptos Básicos sobre Agentes de Software y Agentes Móviles la operación inversa, deserialización, es realizada cuando el sistema de agentes móviles obtiene el agente desde un medio de almacenamiento o de la red. Hay diferentes tipos de persistencia, las más comunes son: • Solo datos: Se almacenan los datos manipulados por el agente. Estos datos consisten de un conjunto de variables locales, globales y compartidas. Desafortunadamente, no todas las variables son serializables. Por ejemplo, en Java, las variables static y transient no son incluidos en la serialización de un objeto. • Solo código: El código del agente es serializado, incluyendo referencias, código heredado y/o clases referenciadas (clausura de código). • Solamente la imagen: El estado de ejecución (información sobre la pila de ejecución) es almacenado, pero no el código del agente. • El agente entero: El agente es almacenado en una manera consistente, incluyendo datos, imagen de ejecución y el código específico. 2.5.2.4 Migración La migración de un agente es el proceso de moverse de un lugar de ejecución a otro. También se le llama navegación o simplemente movilidad. Desde el punto de vista del estado de ejecución hay dos aproximaciones: • Migración fuerte: En este tipo de sistemas de agentes móviles los agentes pueden contener primitivas de migración en cualquier punto en el código, sin necesidad de obtener el estado explícitamente en el nodo destino. Cuando una primitiva de migración es ejecutada, el estado actual del agente (datos y pila de ejecución) y el código son pasados por un proceso de marshalling y transmitidos al lugar de destino. Cuando arriba, el agente resume su ejecución a partir de la instrucción siguiente a la primitiva de migración. La obtención del estado es realizada por el sistema de agentes móviles e involucra los siguientes pasos: recepción del agente, realizar un unmarshalling del agente y recreación del ambiente de ejecución previo a la migración. • Migración débil: En este tipo de sistemas, un agente es transmitido pero su estado de ejecución no. Este es el caso de la mayoría de los sistemas basados en Java, ya que la máquina virtual no permite el acceso a la pila de ejecución de un thread. Debido a esto los diseñadores de sistemas de agentes móviles, si quieren soportar migración fuerte, deben proveer algún mecanismo para guardar el estado previo a la migración. 19 Conceptos Básicos sobre Agentes de Software y Agentes Móviles x = 1; moveTo(place2); b = b + 1; x = 1; moveTo(place2); b = b + 1; place2 place1 run() { while (true) switch(x) { case 0: ... x = 1; moveTo(place2); case 1: b = b + 1; break; default: x = 0; break; }} run() { while (true) switch(x) { case 0: ... x = 1; moveTo(place2); case 1: b = b + 1; break; default: x = 0; break; }} place1 Migracíon Fuerte place2 Migracíon Débil Figura 2.5: Diferentes semánticas ofrecidas por la operación de migración Por otro lado, aproximaciones: del punto de vista de la clausura del agente existen tres • El código no migra: En este caso sólo migra el estado del agente, esto es útil cuando los agentes ejecutan en lugares bien conocidos y estos lugares poseen todos el mismo código del agente. • La clausura del agente migra entera: En este caso el agente es autosuficiente, es decir él posee todo el código que necesita. La principal desventaja es que generalmente estos agentes son muy grandes y se hace muy costoso su transporte. • El código migra incrementalmente: Migra sólo el código básico. El restante es transportado dinámicamente (por demanda). 2.5.2.5 Comunicación Con respecto a la comunicación e interacción entre agentes es importante identificar las siguientes características: • Sincronicidad: la comunicación es síncrona cuando las partes involucradas se sincronizan ellas mismas antes de transmitir cualquier dato. Esto es útil en lugares donde se requieren confirmaciones urgentes o diálogos interactivos. La comunicación es asíncrona cuando las partes no necesitan coordinarse. • Localidad: de acuerdo a un análisis espacial la interacción entre agentes puede ser local o remota. Cuando la comunicación es local los agentes se reúnen en un lugar común y pueden utilizar cualquier mecanismo de comunicación entre procesos conocido, como memoria compartida, archivos, pipes, etc. Cuando la interacción es remota, los agentes se comunican utilizando pasaje de mensajes, RPC o algún otro mecanismo de comunicación remota. 20 Conceptos Básicos sobre Agentes de Software y Agentes Móviles • Intermediación: La interacción entre agentes puede ser directa o indirecta. En la primera un agente invoca un método del otro explícitamente. Cuando la interacción es indirecta, los agentes no se comunican directamente sino que utilizan un servicio de intermediación. • Destinatario: Si el destino de la comunicación es un solo agente la comunicación es punto a punto, si es un grupo restringido de agentes, se llama multicast, o si es a todos, broadcast. Una cuestión importante es la comunicación durante el proceso de migración, es decir que sucede cuando un agente, involucrado en alguna conversación/interacción con otro, debe migrar a otro lugar de ejecución. Básicamente hay dos aproximaciones. En una el canal no se mantiene abierto y cuando el agente migra simplemente se pierde toda comunicación con sus pares. Mientras que en la otra el sistema de agentes móviles es responsable de mantener los canales de comunicación abiertos entre los agentes. 2.5.2.6 Acceso a recursos externos Los agentes deben ser capaces de interactuar con recursos externos, tal como bases de datos, sistemas de archivos, dispositivos de interface de usuario (teclado, monitor, mouse, etc). Es responsabilidad del sistema de agentes móviles proveer a los agentes de un acceso controlado a tales recursos. Existen dos aproximaciones para estos accesos: • Solamente los agentes estacionarios pueden acceder a los recursos críticos: En esté caso loa agentes móviles están restringidos a interactuar con otros agentes. Los agentes estacionarios son responsables de explorar los diferentes recursos y se convierten en intermediarios entre esos recursos y los agentes móviles. Esta aproximación simplifica los mecanismos de seguridad. • Los agentes móviles acceden a recursos externos: Este es un enfoque mas liberal que el anterior, si el sistema de agentes móviles provee los medios necesarios y el agente cumple con los requisitos de seguridad, entonces podrá acceder a recursos externos. 2.5.2.7 Seguridad La seguridad es una característica crítica en el proceso de movilidad de código y particularmente en la migración de agentes. Los aspectos más importantes a tener en cuenta son: • Autenticación y control de acceso: Cuando un agente migra a nuevo nodo, su identidad debe ser verificada. Las identidades de su propietario o del propietario de su lugar de ejecución original pueden también ser verificadas. Si la autenticación tiene éxito el agente ejecuta en el lugar de ejecución, pero limitado por los permisos de acceso que le fueron otorgados, de acuerdo a las políticas del sistema. Los procesos de verificación de identidad más usuales están basados en mecanismos de firmas digitales, claves de criptografía, o certificados digitales. 21 Conceptos Básicos sobre Agentes de Software y Agentes Móviles • Integridad: Mientras un agente es transmitido por la red, su contenido puede ser alterado, es decir que sus objetivos pueden ser cambiados o comportamiento no deseado agregado. Para evitar esto se necesita un canal de comunicación seguro y esto se puede implementar: en el nivel de aplicación, mediante encriptación soportada por los sistemas de agentes móviles o en el nivel de red, con mecanismos como SSL o TLS. • Control de consumo de recursos: Este aspecto concierne el problema de como un sistema de agentes móviles puede controlar la consumición de recursos por parte de agentes externos. Esto se debe controlar pues un conjunto de agentes malignos podrían eventualmente degradar la performance de un sistema simplemente consumiendo su tiempo de CPU, o su memoria. 2.5.3 Estandarización – MASIF – A pesar que los sistemas de agentes móviles existentes difieren notablemente en cuanto a su arquitectura e implementación existen algunos intentos de conseguir estándares, principalmente para permitir su inserción masiva en el mercado. Uno de los intentos de estandarización más importante es la propuesta MASIF (Mobile Agent System Interoperability Facility). La especificación MASIF contiene un modelo conceptual detallado que fue aceptado por cinco proveedores de sistemas de agentes móviles. Sin embargo, se enfocó en la interoperabilidad de los sistemas de agentes móviles a través de la adopción de dos interfaces principales: MAF-AgentSystem, para la administración y transferencia de agentes; y MAFFinder, para la localización y los nombres. Más aún, la especificación MASIF fue diseñada principalmente para la OMG (Object Managment Group), consecuentemente está fuertemente atada a la arquitectura CORBA. 2.6 Aplicaciones basadas en agentes Una aplicación basada en agentes puede consistir de solo un agente (por ejemplo un agente de búsqueda de información) pero usualmente involucra varios agentes que interactúan y se comunican entre ellos. La típica metáfora usada para hablar informalmente sobre una aplicación basada en agentes es la comunidad (en este caso, una comunidad de agentes). Por lo tanto, en este trabajo se usaron ambos términos, dependiendo de si la oración es formal o informal. 2.6.1 El conocimiento El conocimiento es la descripción de algún hecho, alguna relación entre hechos y/o otras relaciones en algunos contextos restringidos. Cualquier agente en la misma comunidad puede usar el conocimiento mantenido por cualquier otro agente. Es probable que en el nivel de implementación, el conocimiento de todos los agentes pertenecientes a la misma comunidad será mantenidos en una base de datos. 22 Conceptos Básicos sobre Agentes de Software y Agentes Móviles 2.6.2 Comunidades de Agentes Una comunidad (esto es, una aplicación basada en agentes) esta formada por un conjunto de agentes que saben como comportarse, comparten su conocimiento, y se comunican usando un lenguaje común. La comunidad es el concepto lógico que se puede aplicar sobre un número de nodos. Un agente pertenece a una o varias comunidades si se le es permitido pertenecer a aquellas comunidades, hablar sus respectivos lenguajes y compartir su conocimiento. Habrá agentes invitados (guest agent) que se les permite sólo acceso limitado al conocimiento de la comunidad, probablemente introducido por otro agente que es responsable de su comportamiento. Otros agentes pueden especializarse como traductores para diferentes lenguajes, mediadores para resolver conflictos o agentes de policía para parar o matar agentes con mal comportamiento. 2.6.2.1 Comunidad Homogénea Una comunidad homogénea es un conjunto de agentes que comparten el mismo conocimiento y es soportado por un mismo sistema de agentes móviles. La noción de una comunidad homogénea hace surgir dos nuevos aspectos. El primero involucra la necesidad de un lenguaje de comunicación entre sistemas homogéneos. Básicamente hay dos formas: declarativo (por ejemplo KQML [LabrouFinn 97]) o procedural y/o orientado a objetos (por ejemplo Tcl, Telescript y Java). El segundo aspecto involucra como representar el conocimiento específico de una comunidad. También tiene dos acercamientos básicos: APIs específicos y protocolos comunes entre las principales entidades responsables (por ejemplo: KIF [GeneserethKetchpel], un DTD especifico en XML [XML 98]) y el desarrollo y manejo de la comunidad involucrada. [Riecken 94] [Singh 88]. 2.6.2.2 Comunidad Heterogénea Una comunidad heterogénea es una extensión del concepto de comunidad en términos de capacidades y complejidad deseadas ya que es un conjunto de agentes compartiendo el mismo conocimiento, pero soportados por diferentes sistemas de agentes móviles. Esta clase de aplicaciones basadas en agentes requieren interacciones y comunicación entre un conjunto de agentes heterogéneos. Por ejemplo, en el estado actual de los sistemas de agentes móviles, un agente Telescript y un agente Aglet no pueden comunicarse directamente usando sus primitivas estándar. Obviamente, pueden interactuar usando mecanismos de comunicación de bajo nivel tales como sockets o archivos compartidos. Sin embargo, si utilizan estos mecanismos, no pueden aprovechar las ventajas de sus primitivas de alto nivel integradas con sus respectivos modelos de objetos, por ejemplo, sus características de seguridad. En este caso la comunicación entre agentes debe ser independiente de cualquier lenguaje o sistema de agentes móviles. En este rango hay varios esfuerzos no necesariamente compatibles: • el esfuerzo KSE con el lenguaje KQML; • el ACL de Foundation for Intelligent Physical Agents [FIPA 97]; 23 Conceptos Básicos sobre Agentes de Software y Agentes Móviles • la iniciativa del W3L con el concepto de "servicio web" con tecnologías tales como SOAP [Box 00], WSDL [Christensen 01] y UDDI [UDD1 00]. La figura 2.6 muestra las relaciones entre un agente y comunidades homogéneas y heterogéneas. complejidad Comunidad Heterogénea Agente Comunidad Homogénea características Figura 2.6: Relaciones entre un agente, y comunidades homogéneas y heterogéneas 1. El agente ofrece capacidades básicas, tales como autonomía y persistencia, pero no necesariamente movilidad y comunicación con los usuarios. 2. Un conjunto de agentes homogéneos define una comunidad homogénea el cual es el segundo nivel de la jerarquía. 3. En el tercer nivel de la jerarquía, la noción de comunidad heterogénea requiere comunicación e interacción entre un conjunto de agentes heterogéneos. 2.6.3 Aplicaciones de Agentes Móviles Comparado con los enfoques tradicionales para computación distribuida, los agentes móviles prometen (al menos en muchos casos) tratar de forma más eficiente y elegante con un ambiente abierto, dinámico y heterogéneo como aquel que caracteriza hoy día a las aplicaciones basadas en Internet. Un tipo particular de aplicaciones basadas en agentes son aquellas que involucran agentes móviles. Debido a las características propias de los agentes móviles el dominio de las aplicaciones se incrementa notablemente. Los agentes móviles pueden ser útiles en un sin número de aplicaciones. Ciertamente, el comercio electrónico es una de las áreas más atractivas a este respecto: un agente móvil puede actuar (en representación de un usuario) como un comprador, vendedor, o intermediario en el comercio de mercaderías, servicios, e información. En este contexto, los agentes móviles pueden emular un tour de compras en Internet, localizando las ofertas más baratas o convenientes publicadas en los servidores de web, y cuando estuvieran equipados con una estrategia de negociación y preferencias tales como rangos de precios aceptables, ellos podrían realizar transacciones en representación de sus usuarios. Otro dominio de aplicación general es el de búsqueda de información en Internet (donde la información reside frecuentemente en los servidores de web) o el de recuperación de información en grandes bases de datos remotas cuando las consultas no puedan anticiparse. En este caso los agentes transportan un perfil de su respectivo 24 Conceptos Básicos sobre Agentes de Software y Agentes Móviles usuario, alguna otra representación de las preferencias del usuario, o bien ellos incorporan directamente una implementación de una consulta específica de información (es decir un procedimiento de recuperación) y permitir así compresión semántica de información por medio del filtrado remoto de datos. En particular, una aplicación útil para agentes móviles es la de recolección de información dispersa en muchos sitios y la realización de algunas transacciones cuando es encontrada información apropiada. Otro dominio de aplicación típico es el de Monitoreo: Los agentes pueden ser enviados a sitios remotos a esperar por la ocurrencia de ciertos eventos o a que cierta información este disponible y entonces reaccionar en consecuencia (como por ejemplo, comprar acciones en una bolsa de comercio virtual). Similarmente, los agentes móviles pueden también ser utilizados para la automatización de muchas tareas respecto de la administración y configuración de redes (como por ejemplo, para diagnóstico remoto), en particular para los así llamados servicios de red inteligentes. Los agentes pueden instalar software en máquinas remotas, o bien ellos pueden personalizar dispositivos y servicios remotos. 2.7 Usuarios finales Todos los usuarios de una aplicación basada en agentes tienen en general agentes que ejecutan tareas para ellos. Los usuarios pueden interactuar con sus propios agentes, o pueden eventualmente interactuar con los agentes que pertenecen a otros usuarios si sus respectivos administradores de seguridad le otorgan ese comportamiento. Los usuarios interactúan con los agentes de varias formas de acuerdo a sus interfaces. Por ejemplo, pueden interactuar a través de e-mail, formularios HTML, applets Java, o componentes Active-X. Los usuarios tienen derechos sobre sus agentes, como suspender la ejecución, cambiar sus conocimiento y objetivos, o incluso eliminarlos. Sin embargo, estos derechos están restringidos por el sistema de agentes móviles soportado así como también por decisiones políticas de las respectivas aplicaciones. 25 3 Catálogo de Sistemas de Agentes Móviles En este capítulo se analizan varios de los Sistemas de Agentes Móviles existentes hoy en día. 3.1 Introducción Hay muchos sistemas de agentes móviles disponibles, tales como Aglets Workbench, D'Agents, Telescript, Odyssey, Tacoma, Concordia, Jumping Beans, AgentSpace, Mole, MOA, PageSpace y JiNNi, cada uno de ellos con características y funcionalidad similares. Aunque en algunos casos contienen diferencias técnicas y conceptuales importantes. Teniendo en cuenta el capítulo anterior, ahora es posible analizar y comparar sistemas de agentes móviles conocidos de acuerdo a la terminología y conceptos detallados anteriormente. El capítulo está organizado en cinco secciones. La sección 2 presenta un estudio de los principales sistemas de agentes móviles existentes en la actualidad. En la sección 3 se describen otros sistemas que no son considerados "verdaderos" Sistemas de Agentes Móviles, porque carecen de algunas características necesarias para ser considerados como tales. Finalmente, en la sección 4 se realiza una comparación de los sistemas anteriormente descriptos. 3.2 Sistemas de Agentes Móviles Telescript fue el estándar de referencia para los sistemas de agentes móviles en 1995 porque fue innovador y fue un punto de quiebre en tecnologías de agentes. Sin embargo, Telescript falló porque era muy grande, inestable, tenía una performance pobre y además incluía un lenguaje de programación difícil de aprender. Por otro lado, ffMAIN tenía un lenguaje y un sistema independientes. Sin embargo, tenía severas limitaciones que afectaban la performance para el desarrollo de aplicaciones complejas. Los Aglets Workbench, hoy la referencia en sistemas de agentes móviles basados en Java, necesitan un modelo de objetos elaborado, por ejemplo una noción de lugares de ejecución organizados jerárquicamente o la administración de familias de agentes y clusters. También le faltan capacidades técnicas, como niveles de control de acceso y un administrador de agentes, y asociación transparente entre usuarios y agentes. Es de Catálogo de Sistemas de Agentes Móviles esperar que estos (y otros sistemas de agentes móviles) mejoren para poder soportar el desarrollo y ejecución de aplicaciones basadas en agentes flexibles, confiables, seguras y eficientes. Para lograr estos objetivos, los sistemas de agentes móviles futuros deberían incorporar una combinación de las mejores características de los sistemas de agentes móviles existentes, por ejemplo cada uno debería proveer: La independencia de protocolo de TCP/IP y/o sistemas de agentes móviles basados en HTTP, como encontramos en ffMAIN, para habilitar la migración y la comunicación entre agentes independientemente del sistema de agentes móviles o de un lenguaje de programación específico. La fuerte integración con Java, como la soportada por Aglets Workbench, debido a que Java es el estándar para el desarrollo de aplicaciones de agentes móviles. 3.2.1 Telescript Telescript [White 94][White 97][Gral.Magic 97], desarrollado por General Magic, fue el primer producto comercial que proveyó la tecnología para el desarrollo de aplicaciones distribuidas basada en agentes móviles. El modelo de Telescript estaba inspirado en el paradigma del mercado electrónico, compuesto de dos tipos principales de participantes: clientes y proveedores de servicios (productores o brokers). Los clientes envían agentes a visitar un conjunto de lugares donde pueden encontrar los servicios provistos por los proveedores de servicios. Las nociones de agentes móviles y lugares de ejecución (simplemente llamados lugares) son muy claras. En Telescript, un lugar es un proceso del sistema operativo que provee no solo un contexto para los agentes pero también provee servicios. Por lo tanto, un lugar Telescript puede ser categorizado como un conjunto de lugares y agentes estacionarios. Telescript esta principalmente compuesto de los siguientes componentes: • El lenguaje de programación (también llamado Telescript), muy basado en objetos y similar a SmallTalk, en el cual "todo" es un objeto, dinámico, persistente, portable y seguro. • El sistema de agentes móviles, llamado el "motor". Este componente ejecuta el lenguaje Telescript, esto es, soporta y ejecuta los recursos del modelo de objetos, tales como agentes y lugares. El sistema de agentes móviles también maneja aquellos recursos vía tres APIs: manejo de persistencia, transporte de agentes y acceso a los recursos externos (ver Figura 3.1). • Protocolos para representar los agentes (esto es: el protocolo de serialización de objetos) y su transporte entre motores Telescript. Telescript fue diseñado para el desarrollo de aplicaciones basadas en agentes homogéneos, en ambientes propietarios, tales como servicios en redes de telecomunicaciones manejadas por sus respectivos operadores. PersonalLink de AT&T fue uno de los pocos ejemplos de esta tecnología. 27 Catálogo de Sistemas de Agentes Móviles Agent Agent Agent place place Telescript Engine API Figura 3.1: Esquema conceptual del framework Telescript Luego, Telescript adoptó el ambiente abierto de la web con un sistema llamado Trabiz [Gral.Magic 95], pero no tuvo mayor éxito comercial. Trabiz estaba compuesto de un conjunto de servicios, los cuales integraban tecnologías tanto de Telescript como de la web, basadas en modelos web basados en servidores [Rodrigues Silva et al. 97]. En 1997, General Magic anunció que abandonaba sus productos Telescript/Trabiz. Al mismo tiempo, General Magic anunciaba su nuevo sistema de agentes móviles basado en Java, llamado Odyssey [Gral.Magic 97], el cual adoptó algunos de los conceptos y técnicas de Telescript. Sin embargo, Odyssey actualmente es también un proyecto difunto. Se debe hacer notar que tanto Telescript, Trabiz así como también Odyssey fueron abandonados no solo por sus problemas técnicos, sino principalmente por los cambios de negocios de General Magic. Telescript era un sistema de agentes móviles avanzado en varias áreas, tales como seguridad, movilidad, persistencia y comunicación. Sin embargo, no era lo suficientemente flexible y dinámico, ya que fue diseñado para aplicaciones propietarias en ambientes cerrados. Por ejemplo, el manejo del nombre y dirección no estaba basado en estándares de Internet; la interacción directa entre agentes implicaba que tenían que conocerse en tiempo de desarrollo. Como tal, no fue posible introducir nuevos agentes, con nuevas interfaces y funcionalidad, en tiempo de ejecución. Peor aún, Telescript era un sistema enorme e inestable con mala performance. 3.2.2 Aglets workbench Aglets Workbench (AWB) o simplemente Aglets [Lange-Oshima 98][IBM 97] es un sistema de agentes móviles concebido en el Laboratorio de Investigación de IBM en Tokio y es soportado por la tecnología Java. Contiene los siguientes componentes principales (como se muestra en la Figura 3.2): • JAAPI (Java Aglet API): Consiste de un conjunto de clases e interfaces que permiten la construcción de agentes y aplicaciones basadas en aquellos agentes. • Servidor de Aglets (Aglet Server) (agletsd): Una aplicación Java que esta dividida en los siguientes componentes: (1) servidor del protocolo propietario ATP (Aglet Transport Protocol) sobre el cual están soportadas las operaciones 28 Catálogo de Sistemas de Agentes Móviles de migración y comunicación de agentes; (2) el contexto de ejecución de los Aglets; y opcionalmente (3) un monitor de aglets con GUI. Esta herramienta, conocida como Tahiti, provee una interface gráfica (basada en el paquete AWT de Java) para manejar y monitorear aglets. • Fiji: Permite la creación de applets con soporte (esto es: contextos de ejecución) para la existencia de aglets. Este componente le permite a los usuarios enviar aglets desde cualquier web browser (siempre que estos browsers ejecuten applets Java). Aglet Aglet Context agletsd + Tahiti Java VM Figura 3.2: Esquema conceptual del framework de los Aglets El modelo de objetos de los Aglets incluye un conjunto de clases e interfaces contenidas en la librería JAAPI. Un aglet es un objeto (potencialmente móvil) que existe y es ejecutado, en cada momento, en algún contexto determinado (AgletContext). Cada aglet tiene un objeto shadow que lo representa, llamado AgletProxy. Este proxy funciona como un escudo y pasa todos los mensajes a su respectivo aglet. El proxy previene acceso directo a los métodos del aglet y provee transparencia de lugar. Desde una perspectiva tecnológica, los Aglets tienen las siguientes características principales: • Identidades: El manejo de identidades de un servidor (o contexto) de Aglets esta basado directamente en el mecanismo de URL (uniform resource locator). Por otro lado, los aglets son unívocamente identificados a través de una instancia de AgletIdentifier, la cual se garantiza que sea única y global para cada aglet. • Persistencia: Aunque no esta especificado en forma explícita en la documentación disponible, se provee persistencia externa para los datos de los aglets. Por otro lado, el código se mantiene en disco de la misma forma que cualquier otra clase Java es almacenada. • Migración: En parte debido al hecho de que la especificación actual de la maquina virtual Java no provee acceso a la pila del thread que actualmente esta corriendo, los Aglets no proveen migración de todo el estado de los agentes (migración débil). Esto significa que el programador tiene que controlar de que lugar el agente llega usando variables de estado globales. 29 Catálogo de Sistemas de Agentes Móviles • Comunicación: El modelo de proxy minimiza el problema de la comunicación entre agentes móviles. Como se explicó brevemente anteriormente, los agentes se comunican entre ellos usando sus respectivos proxies. Adicionalmente, varias semánticas de comunicación son provistas, tales como síncrona, asíncrona y semánticas futuras. • Accesos a recursos externos: Ya que los aglets son objetos Java, no hay restricciones de interacción entre ellos y otros recursos externos siempre que existen y los aglets conozcan sus repetitivas APIs (por ejemplo: AWT, JDBC, RMI). Adicionalmente, el security manager, definido en el nivel global del servidor, permite cada tipo de interacción para los agentes creados localmente (ver más abajo). • Seguridad: Un security manager (una instancia de la clase AgletSecurityManager) está definido para reconocer dos tipos de aglets: trusted y untrusted. Un aglet es trusted cuando ha sido creado localmente y su codebase es local. Si estas suposiciones no están verificadas, no es trusted. El server manager puede configurar, basado en un conjunto predefinido de categorías (por ejemplo: sistema de archivos, red, sistema de ventanas), las diferentes operaciones no permitidas a los aglets untrusted. Por otro lado, los aglets trusted tienen acceso a la mayoría de las operaciones provistas por el servidor. 3.2.3 ffMAIN El proyecto ffMAIN [Lingnau et al. 95] fue desarrollado en la Universidad Göethe, en Alemania. La principal importancia de ffMAIN es su paradigma de agentes móviles para ambientes abiertos y su exclusivo uso de tecnologías web. La arquitectura general de este sistema contiene tres componentes, como se muestra en la Figura 3.3: el servidor de agentes, el ambiente de ejecución, y el agente. El servidor de agentes consiste de un servidor HTTP modificado para manejar un nuevo conjunto de métodos (además de GET, PUT y POST) y mantener un espacio de información para soportar la comunicación entre agentes. El ambiente de ejecución consiste de una máquina virtual que soporta la ejecución e interpretación del código del agente. En el caso concreto, se utilizó un interprete Tcl [Lingnau et al. 95]. Sin embargo, de acuerdo a los autores, no hay restricciones que prevengan que otros lenguajes sean soportados. El servidor de agentes crea un proceso autónomo por cada agente y su respectivo ambiente de ejecución. De esta manera, se obtiene la independencia entre el sistema de agentes móviles y el agente. El proceso de transportar agentes esta basado en el protocolo HTTP. Cuando el usuario quiere crear un agente, un mensaje HTTP es enviado. Este mensaje contiene la información POST server/create (donde server es el url del servidor HTTP extendido) en el encabezado y los datos, código y atributos del agente (encapsulado en un tipo MIME) en el cuerpo del pedido. Cuando el servidor recibe este mensaje, el mensaje es validado (de acuerdo a los atributos indicados), y en el caso de que sea válido y contenga un agente reconocible, el servidor envía la ejecución del agente al ambiente apropiado. Finalmente, el servidor devuelve un mensaje de respuesta al usuario indicando el resultado de la operación. 30 Catálogo de Sistemas de Agentes Móviles RS = Run-time Support RS RS Shared Information Space Agent Server (Servidor HTTP modificado) Figura 3.3: Esquema conceptual del framework ffMAIN El mecanismo de manejo de agentes (suspensión, actualización de parámetros, borrado) es hecho por el usuario o por otro agente a través de mensajes específicos enviados al servidor (métodos POST, GET, y DGET). Por ejemplo: POST server/create; POST server/moves; POST server/visit/id; POST server/info?key; GET server/info?key; DGET server/info?key; La comunicación de los agentes es hecha indirectamente a través de operaciones elementales de escritura (POST), lectura (GET), y lectura destructiva (DGET) en un espacio de información público como el propuesto por el modelo Linda [Freeman 96][Gelernter 85]. Este espacio es mantenido y manejado en cada nodo por el respectivo servidor de agentes y consiste de un conjunto de tuplas en la forma <K,A,V>, donde K es la clave (identidad); A es una lista de control de acceso que especifica todas las operaciones y entidades que se les permite realizar operaciones sobre la tupla; y V consiste de la información en sí misma, cuya sintaxis y semántica estando definidas en el contexto de cada aplicación. 3.2.4 D'Agents D'Agents (llamados anteriormente Agent-Tcl) [Darmouth 88][Gray 95] es una infraestructura de agentes móviles (de acuerdo a su definición original: "agente transportable") que fue desarrollado en Dartmouth College, en USA. Aunque fue desarrollado basado en un intérprete Tcl, D'Agents fue diseñado para que sea independiente de la maquina virtual y su respectivo lenguaje. Actualmente, además de Tcl, D'Agents soporta Scheme, Java, y C/C++ para agentes móviles. D'Agents no toma en cuenta la noción de lugar de ejecución como una estructura de encuentro y ejecución de agentes, el lugar de ejecución corresponde en D'Agents a la identificación de un servidor de agentes. 31 Catálogo de Sistemas de Agentes Móviles El interprete Tcl consiste de una máquina virtual Tcl extendida con los siguientes cuatro componentes (como se muestra en la Figura 3.4): (1) un módulo para capturar el estado del agente para proveer checkpoint/restart transparentes en las operaciones de migración; (2) un modelo de seguridad, para inhibir a los agentes de la ejecución de operaciones impropias; (3) una interfaz (API) para que el servidor de agentes implemente, conteniendo, por ejemplo, primitivas de comunicación y migración; y (4) el interprete Tcl. Agents Interpreter Tcl security state capture Java Scheme AgentServer E-Mail TCP/IP server API Agent Agent VM VM soc ket proc ess Agent Server table agent Figura 3.4: Esquema conceptual del framework D´Agents El servidor de agentes consiste de dos procesos cooperativos: (1) un proceso de sockets que es responsable de la creación, manejo y transporte de agentes, soportando, por ejemplo, las primitivas agent_fork, agent_jump y agent_submit; y (2) un proceso asíncrono (tabla de agentes) que es responsable por el manejo de identidades y la comunicación entre agentes a través de las primitivas agent_send y agent_receive. Cada agente es un proceso autónomo, creado por el servidor de agentes, que más allá de su código específico, tiene el código del intérprete respectivo. Consecuentemente, D'Agents provee (tal como ffMAIN), una independencia real entre el ambiente de ejecución y el lenguaje en el cual el agente es desarrollado. 3.2.5 AgentSpace AgentSpace [Rodrigues Silva et al. 98] es un framework para agentes móviles en Java desarrollado en la Universidad Técnica de Lisboa (IST/INSEC), en Portugal. Los objetivos principales de AgentSpace son el soporte, desarrollo y manejo de aplicaciones distribuidas y dinámicas basadas en agentes. Estos objetivos están provistos por tres componentes separados pero bien integrados entre ellos, como se muestra en la Figura 3.5. 32 Catálogo de Sistemas de Agentes Móviles AS-Client plac e Voyager plac placee Java VM c ontext AS-API AS-Server Voyager Other applications Java VM Figura 3.5: Arquitectura AgentSpace Tanto el componente del servidor como el del cliente corren sobre Voyager [ObjectSpace 99] y la máquina virtual Java (JVM), y pueden ejecutar en la misma o en diferentes máquinas. Los agentes siempre corren en el contexto del server AgentSpace. Por otro lado, interactúan con su usuario final a través de applets (o frames) corriendo en el contexto de un web browser o aplicaciones genéricas corriendo directamente sobre una JVM. El servidor AgentSpace (AS-Server) es un proceso Java con múltiples threads en el cual los agentes ejecutan. AS-Server provee varios servicios: (1) creación de agentes y lugar, (2) ejecución de agentes, (3) control de acceso, (4) persistencia de agentes, (5) movilidad de agentes, (6) generación de identidades únicas (UID), (7) soporte para comunicación de agentes, y opcionalmente (8) una interface de línea de comando para manejar/monitorear el servidor y sus agentes. El cliente AgentSpace (AS-client) soporta (dependiendo del nivel de acceso del usuario), el manejo y monitoreo de agentes y recursos relacionados. AS-Client es una aplicación/applet Java (almacenada en una máquina que tenga un AS-Server). Provee una adecuada integración con la web y ofrece a los usuarios de Internet la posibilidad de manejar sus agentes remotamente. Más aún, el AS-Client puede acceder a varios ASServer al mismo tiempo, proveyendo un conveniente trade-off entre integración e independencia. La interface de programación de aplicaciones AgentSpace (AS-API) es un paquete de interfaces Java y clases que definen las reglas para construir agentes y usar otros recursos mantenidos en el Servidor AgentSpace. En particular, AS-API incluye soporte para lo siguiente: (1) construcción de clases de agentes y sus instancias, creados y almacenados para su posterior uso en la base de datos del AS-Server, y (2) desarrollo de applets/frames clientes para proveer interfaces a los agentes. AgentSpace, como los Aglets, proveen un ambiente para desarrollar aplicaciones basadas en Java. Aunque ambos sistemas tiene estas similitudes, sus respectivos modelos de objetos y APIs son diferentes. Las diferencias entre AgentSpace y los Aglets, tales como elegancia en la programación, mecanismos de seguridad, integración con el usuario final o transparencia de ubicación, proveen ventajas para el programador. Mas aún, AgentSpace presenta un modelo de objetos más completo al proveer lo siguiente: (1) una mejor organización de recursos, a través de la noción de lugares de 33 Catálogo de Sistemas de Agentes Móviles ejecución, (2) el manejo integrado de usuario, grupos de usuario y permisos, (3) mecanismo de seguridad flexibles que permitan ligar dinámicamente security managers tanto a los agentes como a los lugares, (4) la asociación transparente de políticas de seguridad, un usuario y un agente en el tiempo de creación de un agente, (5) una integración adecuada de los agentes con aplicaciones basadas en Internet/web. Por otro lado, los Aglets tienen las siguientes ventajas sobre AgentSpace: (1) un elaborado mecanismo basado en mensajes de comunicación y manejo, (2) un modelo flexible para manejar eventos, y (3) una significante colección de agentes especializados y clases helper asociadas (por ejemplo: brokers KQML; notificación de eventos; puntos de encuentro). Este último punto es una consecuencia de su inherente popularidad y su asociación con IBM. AgentSpace y Voyager (ver mas abajo para una breve descripción de Voyager Universal ORB) están muy relacionados entre sí. Naturalmente, algunas de las ventajas de AgentSpace son consecuencia de la adopción de Voyager, el cual es una mejor alternativa middleware, que, por ejemplo, RMI. Sin embargo, AgentSpace tiene sus propias virtudes, específicamente en el nivel de la definición del modelo de objetos, donde hay una estrecha asociación entre agentes, usuarios y security managers en tiempo de creación de agentes. 3.2.6 JiNNI Jinni (Java INference engine and Neworked Interactor) es un lenguaje de programación lógico multithreading comercial, para la integración de componentes de procesamiento de conocimiento basado en Prolog y objetos Java en aplicaciones distribuidas, tales como aplicaciones cliente/servidor en redes o applets en Internet.. Es un lenguaje interpretado y su sintaxis está basada en un subgrupo del lenguaje Prolog que no incluye operadores. Esencialmente, Jinni define una ontología para el desarrollo de aplicaciones en el lenguaje. Esta ontología involucra cosas, lugares y agentes. Las cosas son representadas como términos Prolog. Los lugares son procesos ejecutando sobre diferentes sitios con un componente server escuchando en un puerto y un componente blackboard que permite sincronizar las transacciones Linda multiusuario [Carriero-Gelernter 89], los llamados a predicados remotos y las operaciones de movilidad de código. Los agentes son colecciones de threads ejecutando un conjunto de objetivos, posiblemente distribuidos sobre un conjunto de diferentes lugares y usualmente ejecutando transacciones locales y remotas en coordinación con otros agentes. Aunque Jinni define esta ontología, Jinni no provee abstracciones en el lenguaje para agentes o lugares. Jinni permite movilidad en ambientes heterogéneos ya que su intérprete está desarrollado en Java. Las unidades de ejecución de Jinni son denominadas engines, o threads móviles. Un engine incluye el estado de las variables Prolog, las cláusulas que conforman el programa y el estado de ejecución del mismo. Las unidades de ejecución utilizan un servidor Jinni que provee los servicios de soporte. Dicho intérprete corre sobre la máquina virtual Java. La comunicación entre entidades de ejecución se realiza mediante blackboards (espacios de tuplas con cláusulas lógicas) locales a los threads, intercambio de mensajes y memoria compartida (la base de datos de cada intérprete Jinni) y la sincronización mediante unificación de términos. 34 Catálogo de Sistemas de Agentes Móviles Un unidad de ejecución puede enviar código a otras unidades o a un servidor Jinni para que ser ejecutado (ejecución remota). Las unidades de ejecución y los procesos que ellas realizan pueden ser móviles. La movilidad es soportada mediante migración proactiva, es decir explícitamente usando los predicados predefinidos move y return. La administración del espacio de datos se efectúa por copia (todos los recursos son transferibles). Esto no presenta mayores inconvenientes, debido a que el lenguaje no permite manipular recursos que requieran de otros mecanismos (tales como archivos o ventanas). La seguridad no es uno de los puntos fuertes del lenguaje. Sólo provee un mecanismo de seguridad inter-EC basado en autenticación por identificador. La mayor ventaja de Jinni es su facilidad de uso, debido a la combinación de un lenguaje declarativo (Prolog) y movilidad fuerte. Al estar basado en un subconjunto de Prolog, la programación de agentes inteligentes con Jinni es mucho más simple que con las otra plataformas existentes. A pesar de estas ventajas, Jinni sólo soporta un subconjunto muy reducido de Prolog (por ej. no soporta corte en el backtracking), lo cual limita considerablemente su potencia expresiva. Otro aspecto que dificulta enormemente la utilización de Jinni lo constituye su limitado esquema de migración de unidades de ejecución. Una unidad de ejecución Jinni está formada por un thread más el código de la cláusula actual. Con el fin de clarificar el mecanismo de migración de Jinni, considérese el siguiente ejemplo: there, move, println(on_server), member(X,[1,2,3]), return, println(back). Al ejecutarse los predicados there y move, el lenguaje migra el estado del thread más el código de la cláusula en ejecución al servidor Jinni. Luego, evalúa member(X,[1,2,3]) y retorna. Nótese que en éste fragmento de código se asume que member está definido en el servidor. El problema surge si esto no sucede, pues el lenguaje no provee otros mecanismos para definir la clausura de código de un agente. A pesar de que las alternativas para solucionar estas deficiencias utilizando los recursos propios del lenguaje son variadas, todas ellas adolecen de dos problemas: no son transparentes para el programador y en ciertos casos generan más problemas que los que solucionan. Por ejemplo, un esquema muy utilizado para migrar el código de un agente en su totalidad consiste en definir un predicado moveAgent que coloca todo el código del agente en una lista Prolog, transfiere el thread al servidor, luego aserta el código del agente contenido en la lista en el servidor y continúa ejecutando el thread. El problema de esta solución consiste en cómo determinar qué código pertenece al agente. Adicionalmente, puede ocurrir que parte del código de un agente se encuentre ya definido en el servidor remoto, con lo cual se producirían duplicaciones de código o incluso fallas en la ejecución por tratarse de una cláusula con el mismo nombre y parámetros, pero con diferente significado. 35 Catálogo de Sistemas de Agentes Móviles 3.3 Sistemas de Agentes Móviles alternativos Por supuesto que hay muchos otros sistemas de agentes móviles, algunos desarrollados en ambientes académicos y otros desarrollados por la industria. Sin embargo, algunos de estos sistemas ya han desaparecido (tal como Kafta u Odyssey), y otros desaparecerán, mientras que otros emergerán en un futuro cercano. Aun más, hay otros sistemas que no pueden ser definidos como "verdaderos" sistemas de agentes móviles aunque proveen algunas características de movilidad de código. Ejemplos de estos sistemas son Voyager Universal ORB [ObjectSpace 99] y el sistema Jumping Beans [AdAstra 99]. A continuación describimos algunos aspectos arquitectónicos de estos sistemas híbridos. 3.3.1 Voyager universal ORB Voyager es un producto comercial de ObjectSpace Inc. que soporta el desarrollo de aplicaciones distribuidas basadas en Java. Voyager es un conjunto de productos 100% en Java. Originalmente (la primera versión), Voyager era solo un ORB Java mucho mejor que su equivalente RMI de Sun. Sin embargo, actualmente uno debería ver Voyager Universal ORB (versión 3.1) como una línea de productos con los siguientes items [ObjectSpace 99]: • Voyager ORB - Un broker de objetos de alta performance que simultáneamente soporta CORBA y RMI. Su innovadora generación dinámica del proxy lleva a la facilidad de uso a un nivel mas alto al remover la necesidad de generadores de stubs. Voyager ORB incluye un servicio de nombres universal, directorio universal, framework de activación, publicación-suscripción, y tecnología de agentes móviles. • Voyager ORB Professional - A partir de la base de Voyager ORB, con una framework de activación, soporte COM, integración JNDI, directorio replicado persistente, servicio de nombres CORBA, XML Dinámico, manejo de conexiones y soporte para clientes ultra-livianos (15K). • Voyager Management Console - Permite la creación y mantenimiento de perfiles de configuración para los servidores Voyager. Además, provee la habilidad para monitorear servicios Voyager, tales como seguridad y transacciones, en tiempo real. La utilidad de administración es totalmente extensible, proveyendo un framework para la administración grafica de objetos del usuario por medio de la consola. (Requiere Voyager ORB Professional). • Voyager Security - Incluye un framework de seguridad flexible, implementación de seguridad liviana, soporte para comunicaciones seguras por medio de adaptadores SSL, y tunneling de firewalls usando HTTP o el protocolo estándar SOCKS. (Requiere Voyager ORB Professional). • Voyager Transactions - Soporte de transacciones distribuidas totalmente compatibles con OTS, incluyendo commit de dos fases, un adaptador JDBC de commit de una fase, transacciones planas y anidadas. (Requiere Voyager ORB Professional). • Voyager Application Server - Ofrece un verdadero ambiente de desarrollo EJB (Enterprise Java Beans) que desacopla la lógica de la aplicación de la lógica de la programación de sistemas. Construido sobre Voyager ORB Professional, 36 Catálogo de Sistemas de Agentes Móviles Voyager Application Server abarca todo el API Enterprise Java para soportar la interacción de un amplio rango de tecnologías. Voyager permite que las organizaciones disminuyan sus inversiones en tecnología actuando de puente entre APIs legacy y las nuevas APIs Enterprise Java. Y debido a que Voyager Application Server tiene esas nuevas API, las organizaciones pueden evolucionar junto con la industria. Es importante hacer notar que Voyager no es un sistema de agentes móviles real, tal como se ha explicado anteriormente. Sin embargo, Voyager tiene también la noción explícita de un agente (como un objeto autónomo y móvil), así como también la noción de un lugar (un objeto o una aplicación a donde el agente puede moverse). 3.3.2 Jumping Beans Jumping Beans es un producto comercial de Ad Astra Engineering Inc. [AdAstra 99] que permite a los desarrolladores Java construir aplicaciones móviles que pueden saltar de computadora a computadora durante su ejecución. Jumping Beans provee un modelo conceptual y arquitectónico diferente a los analizados hasta ahora, tal como se muestra en la Figura 3.6: Host Enviroment Host Enviroment Mobile applic ation Mobile applic ation Mobile applic ation Mobile applic ation Mobile applic ation Jumping Beans Agency Jumping Beans Agency Server Host Enviroment Host Enviroment Mobile applic ation Mobile applic ation Mobile applic ation Jumping Beans Agency Jumping Beans Agency Figura 3.6: Arquitectura Jumping Beans Jumping Beans usa los términos "aplicación móvil" y "Jumping Beans Agency, los cuales corresponden (mas o menos) a los términos "agente" y "contexto" usados en nuestro modelo de referencia. Más aún, Jumping Beans incluye algunas características innovadoras en el nivel técnico. Mientras que la mayoría de los sistemas de agentes móviles están diseñados sobre una arquitectura punto-a-punto, Jumping Beans presenta una arquitectura clienteservidor. Los clientes son el software instalado en cada máquina donde las aplicaciones móviles pueden correr, y son llamados "agencias". El servidor es el componente de software responsable por la administración y el control de seguridad. Las aplicaciones 37 Catálogo de Sistemas de Agentes Móviles móviles nunca corren en el contexto del servidor. Un conjunto de agencias con un server constituyen un dominio Jumping Beans. Un dominio tiene un servidor central, el cual autentica las agencias que se unen al dominio. Otras características adicionales de Jumping Beans son las siguientes: • La arquitectura Jumping Beans, incluyendo su esquema de direccionamiento y modelo cliente/servidor, es totalmente escalable, mientras que otras tienen problemas. • Jumping Beans es fácil de integrar en ambientes existentes porque: (1) no requiere migración a un ORB propietario, (2) instancia la aplicación que llega a una JVM ordinaria, y no requiere un ambiente de ejecución propietario, (3) no requiere herencia Java, solamente una simple implementación de interfaces. • Las aplicaciones móviles Jumping Beans son fácilmente administradas desde el servidor central. Otras tecnologías de agentes no tienen en cuenta la administración de los agentes. • Jumping Beans tiene seguridad built-in que es comprensiva y fácil de administrar. Otras tecnologías de agentes proveen poca seguridad o no proveen seguridad. Otras ofrecen características de seguridad que son difíciles de manejar y requieren un esfuerzo de desarrollo significante de parte del usuario final para implementarlo. • Jumping Beans es tolerante a fallas. En el evento de una falla de hardware inesperada, Jumping Beans se recuperará al último estado almacenado de todos sus componentes. También, la transferencia de aplicaciones móviles Jumping Beans de un sitio a otro es totalmente transaccional, por lo que una aplicación móvil no estará duplicada o se perderá en el evento de una falla inesperada de la red. • Otras tecnologías de agentes requieren un embarazoso post-procesador. Las aplicaciones móviles Jumping Beans usan clases Java y no requieren ningún post-procesamiento. • Jumping Beans se puede usar fácilmente en problemas del mundo real con muchas contingencias y complicadas relaciones entre si, tales como redes con fallas, temas de seguridad, operación desconectada, y administración. Otras tecnologías se han centrado en resolver problemas ideales, en vez de problemas reales. Por lo tanto, no están diseñadas para ser fácilmente implementadas en un ambiente real de una empresa. Es claro que la arquitectura de Jumping Beans tiene un punto central de fallas y un potencial cuello de botella en cuanto a performance en el servidor central. Sin embargo, una solución para resolver estos problemas es crear muchos dominios de pequeño tamaño, cada uno con su propio servidor. Sin embargo, en la versión actual de Jumping Beans los agentes no pueden migrar entre dominios. Jumping Beans aclara que soportará esta versión en el futuro. 38 Catálogo de Sistemas de Agentes Móviles 3.3.3 Concordia Concordia es una infraestructura middleware basada en Java para desarrollar y administrar aplicaciones de agentes móviles. Fue desarrollada en Mitsubishi Electric ITA [Mitsubishi 99][Wong et al. 97] y consiste de un conjunto de librerías de clases Java para la ejecución del servidor, desarrollo de aplicaciones y activación de agentes. Cada nodo en el sistema, referido como Concordia Server, contiene los siguientes componentes sobre un JVM: • Security Manager: Este componente es un objeto Java cuyo dueño es la JVM que administra la protección de recursos. A los agentes se les asignan identidades que les permite acceder a los recursos del servidor. A diferencia de los Aglets, la protección de los recursos esta basada en el usuario del agente en vez del desarrollador. • Service Bridge: Este componente le permite a los desarrolladores agregar servicios al Servidor Concordia para soportar agentes cuando estos migran al servidor. • Directory Manager: Este componente habilita a los agentes a localizar a los servidores con los que estos desean interactuar en un sitio. • Administrator: Este componente corre en una JVM aparte y es responsable de comenzar y parar otros componentes del sistema. Además, administra cambios en los perfiles de seguridad, tanto de agentes como de servidores, monitorea el progreso de agentes, y almacena estadísticas de los agentes y del sistema. • Persistent Store Manager: Este componente es responsable por el almacenamiento del estado interno de un agente y la recuperación de un agente luego de una falla en el servidor o un crash del sistema. • Event Manager: Este componente acepta registraciones de eventos desde objetos y agentes, escucha y recibe eventos, notifica a los objetos y agentes (locales y remotos) interesados de los eventos que recibe - una aplicación del patrón observer. • Queue Manager: Este componente administra las colas de entrada y salida para transportar los agentes rápida y confiablemente, a través de la red entre Servidores de Agentes (Agent Servers) locales y remotos. Los agentes están almacenados en la cola local mientras que un servidor remoto está en reparación, para proveer un mecanismo de almacenamiento y reenvío y son almacenados en disco (localmente) para implementar el bien conocido protocolo de commit de dos fases, incrementando la confiabilidad. • Agent Manager: Este componente es responsable por la propagación de agente a otro Agent Manager en otro servidor Concordia y la invocación de método predeterminado del agente (ubicado en su Itinerario y configurable acuerdo al lugar) una vez que llega a destino. También provee el contexto ejecución para un agente. • Agente: Este componente es un objeto conteniendo una combinación del código y datos del agente. Los viajes de un agente están descriptos en su Itinerario, una colección de destinos definidos como pares lugar/método, mantenidos fuera del agente. un un de de 39 Catálogo de Sistemas de Agentes Móviles Concordia tiene varias características que vale la pena mencionar. Primero, su esquema de itinerarios para la invocación de un método arbitrario del agente una vez que migra a un servidor. Segundo, además de manejar comunicación asíncrona de eventos entre agentes, esta la comunicación inter-agentes colaborativa de Concordia. En esta situación, las clases CollaboratorAgent y AgentGroup se proveen para que los agentes sincronicen reuniones, y analicen y compartan resultados. Finalmente, está el soporte de Concordia ante fallas. Además de hacer a los agentes persistentes, Concordia considera otras situaciones tales como fallas de los managers, por ejemplo cuando EventManager se reinicializa, y situaciones donde los agentes fallan en llegar a sus reuniones. En estas situaciones, el uso de proxies ha incrementado la confiabilidad del sistema escudando agentes u objetos de los efectos de fallas del sistema y del servidor. Para que sea un éxito comercial, el sistema futuro debe considerar estos y otros temas de calidad de servicio. 3.4 Comparaciones de los Sistemas de Agentes Móviles Aunque los sistemas de agentes móviles analizados tienen muchos aspectos comunes o similares, también tienen grandes diferencias. A continuación se analizaran tales similitudes y diferencias teniendo en cuenta las características comunes de los sistemas de agentes móviles explicadas en la sección 2.3. 3.4.1 Similitudes Todos requieren algún tipo de servidor (el cual llamamos en esta documentación "sistema de agentes móviles") que soporta las principales funcionalidades. Todos proveen agentes como entidades autónomas y componentes activos (u objetos activos) que pueden ser procesos autónomos, threads, o grupos de threads, los cuales son independientes del nivel de implementación. Todos proveen características para soportar el mismo tipo de aplicaciones: aplicaciones distribuidas basadas en el paradigma de agentes, las cuales son independientes de la complejidad del modelo de objetos, riqueza, o facilidad de uso. 3.4.2 Diferencias Por otro lado, las principales diferencias entre los sistemas de agentes móviles analizados están basadas en los temas analizados en las siguientes subsecciones. 3.4.2.1 Terminología Se utilizan diferentes nombres en diferentes sistemas de agentes móviles para referirse al mismo concepto. Por ejemplo, los agentes son llamados "agente móvil", "agente transportable" y "aglet"; los sistemas de ejecución de agentes son llamados "motor", "servidor HTTP extendido", "agletsd", y "AS-Server". Más aún, el mismo nombre es usualmente usado con diferentes significados. Por ejemplo, el "lugar" de Telescript es mejor visto como un conjunto de "agentes estacionarios" que un lugar de acuerdo a la definición en la sección 2.4. 40 Catálogo de Sistemas de Agentes Móviles 3.4.2.2 Temas de nivel de soporte Hay esencialmente dos componentes conceptuales en todos los sistemas de agentes móviles. En general, el conjunto de estos componentes es llamado "sistema de agentes móviles". El primer componente, el sistema de ejecución de agentes, es común a todos los sistemas discutidos. Sin embargo, en el otro componente llamado Agent Execution Environment, tienen grandes diferencias. Todos los sistemas analizados proveen un ambiente donde los agentes son ejecutados. Estos ambientes son máquinas virtuales de los lenguajes de programación soportados, tales como Telescript (para Telescript), Java (para los Aglets y AgentSpace), y Tcl (para ffMAIN y D'Agents). Sin embargo hay una diferencia fundamental entre ellos, en los sistemas de agentes móviles tales como ffMain o D'Agents, los agentes corren como procesos externos autónomos separados de sus respectivos ambiente de ejecución. Los sistemas como estos son más modulares y abiertos en cuanto al soporte para múltiples lenguajes de programación. Por otro lado, en sistemas como Telescript, Aglets y AgentSpace, los agentes y el ambiente de ejecución son ejecutados en el mismo proceso porque los agentes están implementados como threads o grupos de threads. Esta situación implica un acoplamiento mas estrecho entre los ambientes de ejecución y los agentes y, consecuentemente logran una mejor performance. 3.4.2.3 Temas del nivel de administración Los sistemas deberían proveer herramientas especializadas asociadas con cada componente definido en el nivel de soporte. Diferentes usuarios podrían acceder y administrar diferentes recursos tales como agentes, clases de agentes, clases de meta agentes, lugares, o grupos de usuarios. Estas herramientas tendrían que ser suficientemente genéricas para ser usadas independientemente de cualquier dominio de aplicación específico. No encontramos ninguna información relevante sobre herramientas para Telescript, debido a que fue comercializado como parte del paquete del servidor web Tabriz y luego fue sacado del mercado, y también debido al hecho de que las herramientas conocidas están orientadas a dominios de aplicaciones específicos. D'Agents tiene bastantes herramientas de debugging y tracking. También tiene managers para manejar recursos internos, tales como archivos, librerías, programas y la red. Para ffMAIN, las herramientas provistas son páginas HTML relativamente simples con acceso directo al correspondiente AES (servidor HTTP extendido). A pesar de alguna funcionalidad útil, esta interface es demasiado simple y restrictiva para los puntos de vista del usuario final y del programador. Con respecto a los Aglets y AgentSpace, ambos sistemas ofrecen herramientas con GUI basadas en librerías Java, las cuales son llamadas Tahiti y AS-Client respectivamente. Sin embargo, hay otras diferencias entre ellos. Tahiti corre como un thread interno de un agletsd con lo que hay un mapeo uno-a-uno entre Tahiti y el servidor. Por otro lado, AS-Client corre como un applet Java o una aplicación Java. Esto implica que los AS-Clients y AS-Servers pueden correr independientemente en la misma o en diferentes maquinas porque interactúan a través de un protocolo de comunicación local/remota. Más aun, AS-Client permite a los usuarios conectarse con uno o más AS-Servers en Internet. Por último, AS-Client es la única herramienta que ofrece administración de clases de agentes y meta clases (esto es, incorpora el componente ATS manager). 41 Catálogo de Sistemas de Agentes Móviles 3.4.2.4 Temas del nivel de aplicación Todos los sistemas de agentes móviles analizados ofrecen soporte para aplicaciones homogéneas basadas en agentes. Sin embargo, ninguna de ellas considera el soporte para aplicaciones basadas en agentes heterogéneas. Sin embargo, este aspecto puede ser atacado a través de la adopción de algún mecanismo de comunicación de alto nivel (por ejemplo: basado en KQML [Labrou - Finn 97]). Otra manera de manejar este tema, en el nivel arquitectónico del sistema de agentes móviles, es a través de la adopción de algún estándar interoperativo, tal como MASIF de la OMG [Milojicic et al. 98]. GrassHopper [IKV++ 98] fue el primer sistema de agentes móviles que implementó el estándar. 3.4.2.5 Lenguajes de los agentes En este grupo analizamos las relaciones entre los sistemas multi-agentes y lenguajes usados para construir agentes. Identificamos dos tipos distintos de lenguajes: • Lenguajes de programación de agentes (APL). Estos son los lenguajes usados para programar agentes. La mayoría de los sistemas de agentes móviles actuales utilizan Java como el lenguaje para desarrollar agentes. Este es el caso de los Aglets y AgentSpace pero también para otros sistemas como Mole [Strasser et al. 96], MOA [LaForge et al. 98], Odyssey [Gral.Magic 97], JAE [Park-Leuker 97], CyberAgents [CAgents 99], GrassHopper [IKV++ 98], Concordia [Wong et al. 97], e incluso, mas recientemente, D'Agents. Sin embargo, sistemas como ffMAIN y D'Agents que son abiertos en cuanto a los lenguajes de programación pueden también (al menos en teoría) soportar Java. Sin embargo, en todos los casos hay un modelo de objetos común con un API propietario. • Lenguajes de comunicación de agentes (ACL). Los sistemas de agentes móviles que analizamos tienen una razón común a los ACLs: los agentes se comunican usando primitivas propietarias provistas por el modelo de objetos de sus respectivos sistemas de agentes móviles. Debido a que el principal interés de los sistemas de agentes móviles no era soportar aplicaciones basadas en agentes heterogéneas, los agentes se comunican entre ellos usando su propio lenguaje de comunicación y estas primitivas de bajo nivel. Por ejemplo, los Aglets ofrecen un paquete Java basado en KQML para que los agentes intercambien mensajes KQML. Es posible que en el futuro cercano que la mayoría de los sistemas de agentes móviles ofrezcan algún tipo de API basada en KQML y/o el ACL de FIPA. 3.4.3 Características técnicas A continuación detallaremos las principales características técnicas de los sistemas de agentes móviles analizados. Nos hemos centrado en los siguientes aspectos: identidades, persistencia, migración, comunicación, acceso a los recursos externos, seguridad e integración con la web. 3.4.3.1 Identidades Como se hizo notar en la Sección.2.5.2.2, hay muchos tradeoffs y decisiones técnicas que involucran la definición de la identidad de un agente cuando se diseña un 42 Catálogo de Sistemas de Agentes Móviles sistema de agentes móviles. Para Telescript y D'Agents las identidades de los agentes están en espacios de nombres lineales basados en esquemas de propiedades. Todos los otros sistemas adoptaron un esquema abierto basado en uniform resource identifiers (esto es, URI/URL internos). 3.4.3.2 Persistencia Todos los sistemas usan un repositorio externo para mantener la información requerida. En los sistemas Java (Aglets y AgentSpace) el código del agente se mantiene en el sistema de archivos (en algún directorio referenciado por el classpath del sistema de agentes móviles). Por otro lado, los datos del agente (esto es: la versión serializada del agente) son mantenidos en algún archivo binario con formato propietario junto con todos los recursos administrados por tales sistemas. Finalmente, en la mayoría de los sistemas la imagen de ejecución del agente no se mantiene porque JVM no permite el acceso a la pila del thread. Sin embargo, otros sistemas (tales como D'Agents), proveen una JVM modificada para poder capturar el la pila del thread. Esto no ocurre en sistemas comerciales basados en Java (tales como Aglets, Jumping Beans o Concordia). 3.4.3.3 Migración Como se mostró en la Figura 2.5, hay dos maneras de realizar la migración de los agentes: migración fuerte (Telescript y D'Agents), y migración débil (Aglets, ffMAIN, y AgentSpace). Sin embargo, hay una gran diferencia entre la migración en los Aglets y AgentSpace. En los Aglets, el mismo callback (concretamente el callback run) es llamado luego de la operación de migración. En AgentSpace, el programador puede especificar (como un argumento del método moveTo) que callback tendría ser invocado luego de la operación de migración, proveyendo una solución de programación más elegante y flexible. 3.4.3.4 Comunicación Todos los sistemas proveen primitivas de comunicación de bajo nivel, basadas en el intercambio de mensajes. Un aspecto analizado es la semántica de las primitivas de comunicación. Los Aglets y AgentSpace proveen un conjunto versátil de primitivas de comunicación tales como soporte para modelos síncronos, asíncronos y futuros. En cuanto a la localidad, todos los sistemas de agentes móviles proveen comunicación inter-agentes independientemente de su posicionamiento relativo. Sin embargo, hay una importante diferencia entre ellos: Sistemas como ffMAIN y D'Agents proveen interacción indirecta, mientras que los demás proveen capacidades de interacción directas. (Por supuesto, los agentes D'Agents o ffMAIN pueden comunicarse directamente usando mecanismo de comunicación de bajo nivel, tales como sockets o pipes. Además, D'Agents tiene soporte para RPC en el caso de Tcl). La interacción indirecta representa un modelo más general, independiente del lenguaje e incluso seguro. Sin embargo, la interacción directa es más apropiada in aplicaciones cerradas, debido mayormente a la performance. 43 Catálogo de Sistemas de Agentes Móviles 3.4.3.5 Acceso a recursos externos Todos los sistemas de agentes móviles proveen funcionalidades y APIs que permiten que los agentes accedan a los recursos externos tales como bases de datos, y sistema de archivos. Sin embargo, hay algunas diferencias entre estos sistemas. Por ejemplo, en Telescript los agentes móviles no pueden acceder a los recursos externos directamente; solo a través de los lugares Telescript (que son, como se vio antes, agentes estacionarios de acuerdo al modelo de referencia). En D'Agents, Aglets y AgentSpace existe la posibilidad de prevenir que agentes móviles externos accedan a recursos críticos. Esto es usualmente controlado por SecurityManagers definidos y configurados en cada nivel del servidor de agentes. 3.4.3.6 Seguridad D'Agents y Telescript son los sistemas de agentes móviles más seguros. En general, cada sistema provee algunas características de seguridad, al menos para prevenir ataques de agentes móviles externos. Esto es considerado el nivel mínimo de seguridad y se provee, por ejemplo, por los Aglets. Adicionalmente, otros servicios de seguridad deberían ser considerados en aplicaciones reales y críticas, tales como control de acceso basado en autentificación del usuario, integridad del agente y privacidad, y prevención contra el consumo de recursos. Este ultimo requerimiento es una de las mayores limitaciones de seguridad de los actuales sistemas de agentes móviles en Java debido al hecho de la JVM no ofrece ningún soporte para controlar los recursos consumidos por un objeto Java. 3.4.3.7 Integración con la web Excepto por Telescript, la mayoría de los sistemas de agentes móviles actuales proveen una fuerte integración con la tecnología de Internet/Web. Incluso con la extensión del protocolo HTTP ocurridas en el sistema ffMAIN, la mayoría de los actuales sistemas de agentes móviles no cambian, o extienden, componentes estándar de la web (tales como servidores web, clientes o protocolo). Usualmente, la integración con la web se realiza en el nivel del cliente a través de algún applet Java que puede acceder al servidor de agentes y, consecuentemente, puede interactuar con los agentes. Algunos applets proveen un contexto mínimo para correr agentes en el contexto del cliente Web (como en los Aglets) mientras que otros solo proveen soporte para la interacción con agentes remotos (como en AgentSpace). 44 4 LogicRaptors En este capítulo se detalla el diseño y la implementación de los LogicRaptors y de la arquitectura que brinda soporte para su movilidad. 4.1 Introducción En los capítulos anteriores se introdujeron los conceptos necesarios para comprender el funcionamiento de los sistemas de agentes móviles y luego se analizaron diferentes sistemas existentes en la actualidad, logrando comprender las ventajas y desventajas de cada uno. En el presente capítulo se detallará el diseño y la implementación de los LogicRaptors y de la arquitectura que brinda el soporte para su movilidad. Primero, en la sección 4.2 se describe brevemente una arquitectura genérica de sistemas de agentes móviles tomada como referencia para este trabajo; en la sección 4.3, se explicarán los agentes móviles desarrollados; luego en la sección 4.4 la instanciación de la arquitectura descripta anteriormente. Después se explicará el mecanismo provisto por JavaLog para extender su comportamiento (sección 4.5), el cual es de suma importancia en el desarrollo de la presente propuesta. A continuación se detalla el protocolo utilizado para la comunicación entre servidores (sección 4.6), y la herramienta desarrollada para facilitar el uso de la arquitectura y manipular los LogicRaptors (sección 4.7), y por último, en la sección 4.8, se resumen las principales características de la arquitectura presentada. 4.2 Arquitectura de Referencia En el presente trabajo es necesario implementar un sistema de agentes móviles, para ello se tomó como referencia una arquitectura genérica, descripta en [BelloniCampo 01]. A continuación se detallarán las características más relevantes de la arquitectura mencionada. La siguiente figura muestra el diagrama de componentes de una arquitectura de software para el soporte de agentes móviles inteligentes. El diagrama utiliza notación UML [Rational 97]. LogicRaptors Servidor de Agentes Móviles Inteligentes Administrador de Comunicaciones entre Agentes Servidor de Agentes Móviles Inteligentes Administrador de Agentes Administrador de Acceso a Servidores de Aplicaciones Aplicación Externa Brain Agente Móvil Inteligente (LogicRaptor) Módulo Lógico Administrador de Confiabilidad Administrador de Seguridad Administrador de Directorios Figura 4.1: Diagrama de componentes de la arquitectura de referencia En esta arquitectura se reconocen diferentes componentes principales: un administrador de agentes; un administrador de comunicaciones entre agentes; un administrador de seguridad; un administrador de confiabilidad; un portal servidor de aplicaciones; y un administrador de directorios. El administrador de agentes es responsable por la recepción de agentes para su ejecución en el sitio local y del envío de agentes para ser ejecutados en sitios remotos. Antes de efectuar la migración de un agente, este administrador lo serializa junto con su estado. Luego, delega el envío de esta representación serializada del agente al administrador de confiabilidad, el cual asegura que el agente es recibido por el administrador de agentes correspondiente en el sitio destino. Al recibirlo, este componente reconstruye el agente y los objetos que él referencia, a partir de su representación serializada, creando su contexto de ejecución. El administrador de seguridad es responsable por la autenticación del agente antes de que este comience su ejecución. La máquina virtual Java subyacente invocará automáticamente a este componente para autorizar cualquier intento de utilizar recursos del sistema por parte de los agentes. El administrador de comunicaciones entre agentes facilita la comunicación entre agentes móviles dispersos en diferentes sitios. Los agentes pueden utilizar el administrador de directorios para identificar la localización de un servidor de aplicaciones y luego migrar al sitio en el cual este servidor esta localizado. El portal servidor de aplicaciones representa para los agentes un punto de acceso a aplicaciones externas al sistema de agentes móviles, residentes en el sitio local, como por ejemplo acceso a servidores de bases de datos. Los agentes móviles descriptos son implementados con JavaLog, un lenguaje que integra los paradigmas de orientación a objetos (Java) y de programación lógica (Prolog). JavaLog utiliza objetos para modelar las habilidades de los agentes y cláusulas lógicas para modelar el estado mental de dichos agentes. Las habilidades de los agentes pueden estar representadas por capacidades de acción como por capacidades de 46 LogicRaptors comunicación con otros agentes, mientras que el estado mental puede presentarse en forma de creencias, intenciones y compromisos. JavaLog define al módulo como concepto básico de manipulación. En este sentido, un objeto y un método son vistos como módulos. Un objeto es un módulo que encapsula datos y un método es un objeto que encapsula comportamiento Los agentes móviles construidos con JavaLog son denominados LogicRaptors. Estos agentes encapsulan un objeto compuesto denominado Brain. Este objeto es una instancia de un intérprete de módulos lógicos que utiliza cláusulas Prolog. Este intérprete está implementado en Java y permite utilizar objetos dentro de cláusulas lógicas, así como embeber módulos lógicos dentro de código Java. Cada agente es una instancia de una clase que puede definir parte de sus métodos en Java y parte en Prolog. La definición de los métodos de una clase en JavaLog puede estar compuesta por varios módulos lógicos definidos en métodos y módulos lógicos referenciados por variables de instancia. Adicionalmente, la arquitectura permite incorporar servicios más inteligentes a los sitios Web mediante la utilización de agentes inteligentes móviles. Así, en cada sitio capaz de ejecutar LogicRaptors, existe al menos un Nest, el cual funciona como una dársena Web para los LogicRaptors, permitiendo así extender aplicaciones legadas cliente / servidor basadas en la Web con agentes móviles LogicRaptors. 4.3 LogicRaptor (Agente Móvil Inteligente) Los módulos lógicos móviles de JavaLog son vistos en nuestra aproximación como agentes basados en lógica llamados LogicRaptors, capaces de moverse entre diferentes servidores (Nests) para poder realizar sus tareas cerca de los recursos requeridos, de esta manera se evita congestionar la red transfiriendo los datos hacia el lugar de procesamiento. Como una especialización de un componente Brain, un LogicRaptor soporta todos los predicados definidos por un intérprete Prolog estándar, así como también aquellos mecanismos de intercomunicación entre agentes basados en módulos lógicos provistos por JavaLog. Un LogicRaptor extiende un componente Brain con servicios de movilidad y provee soporte para ofrecer sus servicios a aplicaciones web. Para que un LogicRaptor migre a otro sitio, se utiliza el predicado moveTo. Antes del transporte, el administrador de agentes (AgentManager) en el sitio local serializa el LogicRaptor y su estado. Por ejemplo: su base de conocimiento, objetivos corrientes a satisfacer, variables instanciadas, puntos de backtracking, etc. Luego, el AgentManager lo envía a su par en el sitio destino. Una vez que el AgentManager en el sitio remoto recibe un agente, reconstruye el LogicRaptor y a los objetos que referencia y luego resume su evaluación. Eventualmente, después de realizar algún procesamiento, el LogicRaptor podría retornar a su sitio de origen llamando al predicado built-in goHome. 47 LogicRaptors 4.4 Implementación de la Arquitectura Tomando como referencia la arquitectura genérica explicada en las sección 4.2, se decidió implementar algunos de sus componentes, como el Administrador de Agentes, el Administrador de Confiabilidad y el Administrador de Directorios, además del ambiente de ejecución para los agentes(LogicRaptors), al cual se le dió el nombre de nest (nido). Los demás componentes que forman parte de la arquitectura de referencia, como el Administrador de Seguridad o el Administrador de Acceso a Aplicaciones, fueron pensadas como posibles futuras mejoras a la arquitectura. 4.4.1 Nests Los agentes móviles requieren ambientes de ejecución que actúen como servidores que aceptan agentes y proveen recursos para ellos. En nuestra arquitectura tales servidores son llamados Nests. Un Nest es responsable de la ejecución del código del agente y de proveer operaciones para los programadores de agentes, tales como aquellas que le permiten a los agentes migrar, comunicarse, acceder a los recursos del sitio, etc. Como se puede ver en la Fig. 2 la clase base de cualquier Nest es la clase abstracta GenericNest. Esta sólo se encarga de atender los pedidos de los clientes y delegar la atención de estos al comportamiento que implementen sus subclases. La funcionalidad que provee la clase Nest es el soporte para la recepción y envío de agentes móviles y un blackboard para la comunicación entre los agentes presentes en dicho Nest. Sobre esto, ExtendedNest agrega servicios para manipular en forma remota sus conocimientos y/o el contenido del módulo de conocimientos utilizado en la comunicación entre agentes (blackboard) que posee. Un Nest es identificado unívocamente en toda la red por medio de su dirección (URL). Esta dirección es la utilizada por los agentes móviles cuando desean migrar hacia algún Nest. La clase Directory es la encargada de administrar las direcciones de los Nests que se encuentran activos y es la forma de que luego los agentes móviles puedan conocer nuevos Nests hacia donde migrar para realizar sus procesamientos. GenericNest Nest Directory ExtendedNest Figura 4.2: Diagrama de clases de los Nests 48 LogicRaptors Todos los pedidos y respuestas utilizan el protocolo MTP creado a tal efecto (ver sección 4.6 para más detalles sobre el protocolo). El mecanismo de delegación de la atención de los pedidos de los clientes en GenericNest fue diseñado de tal manera que para agregar nueva funcionalidad sólo sea necesario agregarlos a una subclase sin tener que modificar la clase base. Otra ventaja de este diseño es que es posible habilitar / deshabilitar los servicios provistos por los Nests en tiempo de ejecución sin necesidad modificar a las clases. Los Nests permiten que la mayoría de sus parámetros de inicialización puedan ser modificados, permitiendo entre otras cosas: • Mostrar información de utilidad en el debugging de nuevo código. • Llevar un log de las acciones hechas por los agentes. • Elegir el contenido inicial del blackboard. • Cambiar el nombre del blackboard. • Qué administrador de directorios utilizar. Si el Nest desea registrar su dirección con el administrador de directorios o no. Aunque la utilidad principal de un Nest es que sea conocido por los agentes móviles para que puedan migrar a él, esta opción es sumamente útil cuando se está desarrollando o depurando código y se desea evitar el arribo de agentes móviles al Nest. 4.4.2 Administrador de Agentes (AgentManager) La decisión de aceptar un agente o no así como de enviar un agente a otro Nest es hecha por la clase AgentManager. Esta clase tiene el comportamiento básico para aceptar y enviar un agente. Además, mediante el patrón de diseño Observer permite que un observador sepa cuando un agente es enviado o recibido. La transferencia del agente se hace pasando los objetos serializados por un filtro que comprime los datos, para aprovechar el ancho de banda disponible y acelerar la transmisión del agente. Esta transferencia del agente puede efectuarse en forma tanto sincrónica como asincrónica. La funcionalidad provista por AgentManager es mínima para que cualquier control o funcionalidad extra que se quiera agregar pueda realizarse creando subclases de AgentManager. Un ejemplo de esto es el manager que utiliza Nest, NumberedAgentManager, esta clase se encarga de administrar un conjunto acotado en numero de agentes (El tamaño del conjunto es definido por el objeto que utiliza al administrador). Este método de agregar funcionalidad tiene la desventaja de que los diferentes tipos de funcionalidad agregados al estar cada uno en una subclase son o mutuamente exclusivos o completamente inclusivos. 4.4.3 Administrador de Confiabilidad El componente de confiabilidad presente en el sistema es minimalista. Actualmente es un observador de NumberedAgentManager que al recibir la notificación de que un agente murió (es decir, termino su evaluación) y si su Nest origen no es el actual, se envía su cuerpo al sitio destino. Un agente no debería morir en un Nest que no es el de origen a menos que haya ocurrido algún error por parte del programador, por lo 49 LogicRaptors que este componente la única utilidad que tiene es como ayuda para el debugging de los agentes. 4.4.4 Servicio de Directorios Para resolver el problema de como un agente llega a conocer otros Nests que le son de interés, se diseñó un sistema de directorio de Nests. Cada Nest cuando es creado registra su URL con un Directory (al cual debe conocer de antemano), luego, cuando un agente desea obtener una lista de Nests a los cuales puede llegar a migrar, solo debe pedirse ese listado mediante alguna de las versiones del predicado getHosts. El proceso de registración de un Nest con un Directory utiliza un intervalo entre reintentos pequeño y luego duplica este intervalo entre reintentos sucesivos, hasta que un valor máximo es alcanzado [DeSchon - Braden 98] (dicha técnica es llamada retroceso exponencial) para casos donde el Directory no puede ser alcanzado por alguna razón especial (congestión en la red, etc.). Debido a que el alta de un nuevo Nest en el directorio no es una operación frecuente, los datos del directorio se mantendrán constantes por períodos de tiempo grandes. Por lo tanto, una optimización a la que se recurrió para disminuir el tiempo de respuesta de un getHosts fue utilizar el patrón proxy para tener almacenados localmente los datos de los directorios usados. Esto es implementado por LocalDirectory, el cual puede almacenar el contenido de varios directorios y asignarles a cada uno por separado un tiempo de vida, durante el cual los datos cacheados localmente se consideran frescos y todos los pedidos se responden utilizando estos datos. Directory permite almacenar métricas referentes a un sitio para que los agentes puedan conocer características del sitio antes de realizar la migración. Las métricas del sitio se agregan cuando el Nest se registra con el Directory. Y cada métrica consiste de una dupla de valores de la forma <nombre, valor>. El agente puede hacer uso de estas métricas utilizando alguna de las variantes del predicado getHosts (ver 4.5.2 para más información) las cuales dada una lista de métricas, devuelven todos los sitios que cumplen con tales requisitos. La semántica otorgada a cada métrica corre por cuenta de los agentes móviles y los Nests. El URL del Directory por omisión se obtiene del NestManager, el cual a su vez, lo obtiene del valor de la propiedad del sistema javalog.marlets.defaultDirectoryManager. 4.5 Método de Extensión de JavaLog Para agregar el comportamiento de movilidad necesario para nuestro trabajo, se utilizó el mecanismo de extensión soportado por JavaLog. Este mecanismo, utilizado para definir los predicados, consta de dos pasos; el primero es definir los nuevos predicados con código Prolog y luego crear una subclase de JavaLog.extension donde se encuentre la nueva funcionalidad. A continuación se explica con mayores detalles dichos pasos. 4.5.1 Mecanismo de Extensión Primero, la definición mediante código Prolog de los nuevos predicados: Cuando PlEngine se inicializa, consulta todos los archivos .pl dentro del directorio "init". Aquí 50 LogicRaptors se encuentran las asociaciones entre predicados Prolog y código nativo. Así, por ejemplo, la definición de getHosts(H) es la siguiente: getHosts(H) :- builtIn(getHosts, H). Esto indica que el predicado getHosts(H) debe resolverse utilizando el método nativo getHosts, lo que nos lleva al segundo paso. Todos los métodos públicos de las clases del paquete JavaLog.extension son los métodos que hasta ahora hemos llamado "nativos". Esto fue para llevar una analogía con los métodos nativos de Java, que podría verse similar a estos, ya que existen formas de invocar código en cierto lenguaje y estos métodos son hooks a código en otro lenguaje. Estos métodos pueden ser asociados con un predicado Prolog como se indico arriba. Para cargar las clases se invoca al método loadExtensions de la clase que se encarga de referenciar a todas las clases del paquete JavaLog.extension haciendo así que estas sean inicializadas (en el caso de poseer inicializaciones estáticas). Luego se registra cada clase en PlBuiltIn mediante el método RegisterClass, el cual se encarga de agregar la clase al vector de clases registradas y agregar a una tabla de hash los métodos públicos de la clase que se está registrando. Esta tabla de hash es luego utilizada para invocar a los predicados builtIn. JavaLog.Loader El siguiente diagrama de interacción ejemplifica el proceso detallado anteriormente (para reducir el tamaño del diagrama se muestran sólo dos clases de JavaLog.extension). Loader PlBuiltIn extension. LogicRaptors extension. Database loadExtensions() inicialización estática RegisterClass() inicialización estática RegisterClass() Figura 4.3: Diagrama de Interacción de la carga de los predicados definidos 51 LogicRaptors 4.5.2 Nuevos Predicados A continuación se detallan los predicados que fueron agregados a JavaLog para el soporte de movilidad: Predicado Descripción MoveTo(Sitio) Intenta migrar el estado del LogicRaptor cuyo código contiene dicho predicado en evaluación al Nest apuntado por el URI Sitio. En caso de fallar, la evaluación continua localmente. En caso de lograr la migración del código satisfactoriamente, la evaluación local y las variables ligadas hasta el momento son devueltas como respuesta. La evaluación continua en el Nest destino. CloneAt(Sitio) Similar a moveTo(Sitio), con la excepción de que se continua la evaluación local tanto como si falla como si tiene éxito la migración de código. Con esto se logra un clon del agente en el Nest referenciado por Sitio. Sería similar a un fork(3), pero remoto. GetHosts(Sitios) Devuelve en Sitios una lista con todos los URIs de los Nests registrados en el Directory por omisión. GetHosts(Sitios, Directory) Ídem getHosts(Sitios) pero el query es enviado al URI Directory. GetHosts(Métrica, Operador, Valor, Sitios) Devuelve la lista de Nests que cumplen con la condición de que tengan como valor en la métrica Métrica un valor que satisfaga el operador Operador. Los operadores definidos son: max, min, lt, le, gt, ge, eq, ne. En el caso de utilizar el operador max o min, el argumento Valor es innecesario. GetHosts(Métrica, Operador, Valor, Sitios, Directory) Ídem el predicado anterior, pero realizando la consulta al Directory Directory. GetHosts(Políticas, Sitios) Políticas representa una lista con condiciones que debe cumplir (todas) un Nest para ser incluido en la lista de retorno Sitios. Cada elemento de esta lista es otra lista donde, el primer elemento es la métrica, el segundo el operador y, en el caso de que el operador no sea max o min, es necesario un tercer elemento con el valor a comparar. Así, el query getHosts([[offers,gt,100], [distance,lt,3]],H) devuelve todos los Nests que tengan mas de 100 ofertas publicadas y estén a una distancia menor a 3. Tabla 4.1: Descripción de los predicados incorporados a JavaLog 4.6 Protocolo MTP El protocolo usado en la comunicación entre Nests se denomina MTP (MTP Transfer Protocol). A continuación se detallará el protocolo y luego, como este es utilizado por los Nests, ExtendedNests y Directories para ofrecer sus servicios. En general habrá una descripción del servicio y luego se detallará lo mismo mediante BNF [BNF 02] y las extensiones a BNF definidas en [Crocker et al 82] para descartar cualquier ambigüedad. Luego de finalizada la descripción del protocolo, se presentará la jerarquía de clases que proveen mecanismos de comunicación por medio de este protocolo. 52 LogicRaptors 4.6.1 Descripción Los terminales LF y SP se utilizan para especificar un fin de línea (\n) y un espacio en blanco (\s), respectivamente; por lo que cualquier espacio en blanco en los BNF que no esté representado por el terminal SP, debe ignorarse, pues solo fueron incluidos para mejorar la legibilidad. Un pedido se compone de un nombre de servicio con cero o más argumentos y la respuesta esta compuesta del valor de éxito / fracaso del pedido e información de respuesta adicional, la cual es dependiente del pedido y puede ser nula. En caso de que el pedido haya fracasado, la información adicional contiene la razón de esto. <pedido> ::= <nombre_servicio> *( LF <argumento> ) LF El nombre del servicio es sensitivo a las mayúsculas / minúsculas. Todas las respuestas son de la forma: la primer línea indica éxito o fracaso del servicio, el éxito se indica con la cadena "OK" y el fracaso con la cadena "ERROR". En ambos casos pueden devolver información adicional. En el caso de error la siguiente línea tiene una cadena con el mensaje de error y en el caso de éxito la información adicional devuelta es dependiente del servicio pedido. Si no se recibe nada como servicio, el error es la cadena "missing service". <respuesta> ::= ( <exito> | <fracaso> | missing service ) LF <exito> ::= OK [<datos>] <fracaso> ::= ERROR [<descripcion-del-error>] 4.6.2 Servicios de los Componentes A continuación se detallarán los servicios característicos de los diferentes tipos de Nests y el servidor de directorios. 4.6.2.1 Nest Los servicios provistos por Nest son los mínimos necesarios para aceptar agentes móviles, y son los siguientes: <servicio-nest> ::= ( <acceptBrain> | <acceptBrain-sync> | <getAgentsStatus> ) LF acceptBrain acepta un agente en forma asincrónica. Luego del servicio viene en forma serializada y filtrada a través del algoritmo de compresión gzip el estado del Brain. <acceptBrain> ::= acceptBrain LF <agente> acceptBrain-sync acepta un Brain, continua la ejecución y devuelve los resultados (answer()). <acceptBrain-sync> ::= acceptBrain-sync LF <agente> 53 LogicRaptors getAgentsStatus devuelve una línea por agente presente en el Nest, teniendo esta un booleano indicando si el agente está evaluando su código (está vivo) o no (ha muerto). En el caso de estar muerto el agente, seguido del booleano se muestra el estado de sus variables. Este servicio se encuentra habilitado siempre que el Nest que recibe el pedido tenga la opción de debugging habilitada. <getAgentsStatus> ::= getAgentsStatus <respuesta> ::= OK LF *( true | false *( <lista> ) ) 4.6.2.2 ExtendedNest Los servicios que ExtendedNest agrega a los definidos por Nest son para poder manipular el Brain que posee la clase base, Nest. <servicio-extendednest> ::= ( <addCapability> | <activeCapability> | <removeCapability> | <answerQuery> ) LF addCapability agrega un módulo lógico al Brain, cuyo nombre y código es provisto por los argumentos del pedido. <addCapability> ::= addCapability LF <nombre-modulo> LF <código> activeCapability activa un modulo lógico cuyo nombre fue provisto como argumento del pedido. Este servicio es usualmente usado luego de crear un módulo mediante addCapability. <activeCapability> ::= activeCapability LF <nombre-modulo> LF removeCapability elimina un modulo lógico (siempre que este no esté activado). <removeCapability> ::= removeCapability LF <nombre-modulo> LF answerQuery evalúa el código provisto como argumento del pedido y devuelve el estado de las variables. Los datos que devuelve en caso de devolver OK son: la primer línea es un booleano (convertido a cadena (true / false)) que indica el resultado del query. En el caso de que el query haya tenido éxito, la siguiente línea contiene estado de las variables; devuelve el resultado de Brain.answer().toString(). <answerQuery> ::= answerQuery LF <código> En el caso de que no haya ocurrido ningún error la respuesta es: <respuesta> ::= OK LF (true | false) LF *( <nombre_variable> = <valor> ) LF <valor> ::= <numero> | <cadena> | <lista> <lista> ::= [ *( <valor> ) ] 54 LogicRaptors 4.6.2.3 Directory Los servicios provistos por Directory son los necesarios para mantener y suministrar información acerca de los diferentes nest. <servicio-directory> ::= ( <getHosts> | <registerNest> | <transferData> ) LF getHosts devuelve la lista de sitios registrados en este DirectoryManager. El formato de la lista es el del Hashtable.toString. Por ejemplo, si hay tres elementos y estos son x1, x2 y x3, el resultado sería: "['x1','x2','x3']". <getHosts> ::= getHosts | getHosts LF <metrica> LF <operador> LF <valor> registerNest agrega un Nest a la lista de sitios disponibles. En caso de ya estar registrado no hace nada. Opcionalmente, se pueden registrar ciertas propiedades del sitio, para que posteriores búsquedas las devuelvan. Estas propiedades podrían llegar a ser usadas, por ejemplo, para proveer métricas de los sitios que un agente pueda decidir basándose en esa información si migrar al sitio o no. <url> es cualquier URI absoluto [Berners-Lee et al 98]. <registerNest> ::= registerNest LF <url> LF *( <propiedad> LF <valor> ) LF transferData envía como respuesta todos los hechos que contienen los nests registrados, así como también las métricas de estos. Es utilizado por LocalDirectory para poder cachear localmente una copia del Directory. <transferData> ::= transferData 4.6.3 Clases de MTP Las clases encargadas de llevar a cabo la comunicación entre Nests mediante MTP son las que se encuentran en el paquete Javalog.raptors.mtp donde cada una de ellas provee esta comunicación a diferentes niveles de abstracción. DefaultMessage NestMessage ProtocolMessage DirectoryMessage Figura 4.4: Diagrama de clases de Javalog.raptors.mtp 55 LogicRaptors A continuación se describe cada clase de la jerarquía y se muestra como realizar la misma tarea con cada una de ellas. El ejemplo que se utilizará es obtener un listado de los Nests registrados en cierto DirectoryManager. La clase base ProtocolMessage es una clase que provee comunicación a nivel de streams con los Nests, en una forma similar a la provista por java.net.URLConnection. De hecho, se utiliza una instancia de URLConnection para proveer estos servicios. Esta clase es utilizada solo para proveer los servicios básicos a DefaultMessage. Aunque la comunicación se realiza mediante una conexión HTTP, es posible soportar diferentes protocolos (SMTP, CORBA, etc.) con solo cambiar el método de conexión de esta clase (los protocolos de conexión soportados son los soportados por el Java o los que se agreguen mediante nuevos SocketFactory). A continuación de presenta un ejemplo de la utilización de la clase ProtocolMessage: ejemplo: .... ProtocolMessage conn = new ProtocolMessage("http://raptors.org.ar/Directory"); conn.writeLine("getHosts"); String[] res = conn.getResponseAsArray(); if (res.length > 0 && res[0].equals("OK")) { // respuesta exitosa } else { String error = (res.length > 1 ? res[1] : null); System.out.println("Ocurrió el error: " + error); } .... La clase DefaultMessage es una clase abstracta que utiliza una instancia de ProtocolMessage y provee soporte para el protocolo de comunicación que es utilizado por los Nests (MTP), el cual fue descrito anteriormente. En este nivel de abstracción, ya no se manejan streams de datos sino pedidos / respuestas MTP. Es importante hacer notar que esta clase entiende de pedidos / respuestas MTP solo a un nivel sintáctico. Los clientes de esta clase (sus subclases o el código que la utilice) le da valor semántico a los datos que transporta DefaultMessage. Las clases que heredan de DefaultMessage son provistas para facilitar la comunicación entre código Java y Nests, ya que cada una de ellas implementa una interfase (interfase en el sentido general del termino y no una interfase Java) de comunicación entre los diferentes tipos de Nests y el Directory. Cada una de estas subclases de DefaultMessage tiene un método Java por cada servicio que provee el Nest con el que se comunica alguna de estas clases. 56 LogicRaptors A continuación de presenta un ejemplo de la utilización de la clase DirectoryMessage, que es una de las que heredan de la clase DefaultMessage. ejemplo: .... DirectoryMessage conn = new DirectoryMessage("http://raptors.org.ar/Directory"); if (conn.getHosts()) { // respuesta exitosa } else { System.out.println("Ocurrió el error: " + conn.getLastError()); } .... 4.7 LogicRaptors Center En la sección anterior se describió el diseño e implementación de una arquitectura para soportar agentes móviles basados en Prolog. Sería interesante poder manipular agentes sin tener que tener amplios conocimientos de todos los detalles de bajo nivel, tales como comunicación, sincronización etc., involucrados en la implementación de la arquitectura anteriormente descripta. Para ello se diseño LogicRaptors Center, el cual es una herramienta básica para la administración de los LogicRaptors y supervisión de los Nest, con ella y desde el LogicRaptor Manager se puede crear, editar, enviar a recolectar datos a un LogicRaptor y luego examinar los resultados, también se puede, desde el NestView, hacer consultas directamente a un Nest como lo haría un LogicRaptor, desde el NestObserver, se puede consultar el estado de un Nest para determinar en que estado se encuentra y por último también se puede consultar la documentación de todas las clases Java que componen este trabajo. 4.7.1 Requerimientos El diseño de la herramienta se basó principalmente en dos puntos: debía ser de fácil utilización aún para aquellas personas no familiarizadas con la programación en Java, sólo con algunos conocimientos básicos de Prolog y en segundo lugar, dado que la implementación de la arquitectura de los LogicRaptors se realizó en Java, lo que garantiza su funcionamiento en muchas plataformas, la herramienta también debía poder utilizarse desde las plataformas soportadas por Java. 4.7.2 Descripción de la Herramienta En la herramienta se identifican cuatro utilidades: Raptor Manager, Nest View, Nest Observer y Documentation. 57 LogicRaptors 4.7.2.1 Raptor Manager Es la parte central de LogicRaptors Center, desde aquí se pueden crear agentes LogicRaptors, en el momento de la creación se le debe configurar su nombre y sus preferencias para la búsqueda. Las preferencias de búsqueda son condiciones lógicas, cada una independiente de las otras y unidas por un AND lógico. Luego que un LogicRaptor es creado, se encuentra listo para ser enviado a Nests remotos en busca de información, cuando regresa se puede visualizar la cantidad de aciertos que tuvo la búsqueda y si se quiere se pueden conocer los detalles de los resultados de la búsqueda. Los datos de un LogicRaptor, tales como su nombre o sus preferencias pueden ser editadas en cualquier momento haciendo click sobre su nombre, si el agente se encuentra viajando, estas modificaciones no surgirán efecto hasta que regrese. Otra utilidad que brinda Raptor Manager es la de poder editar el código Prolog que el LogicRaptor luego va a utilizar para realizar las diferentes búsquedas. Si no se edita tal código el agente será creado con el código por omisión provisto por la herramienta. Por último cuando un LogicRaptor ya no es útil, Raptor Manager provee la posibilidad de eliminarlo. Para ilustrar lo mencionado anteriormente sobre Raptor Manager se muestra a continuación la interface de la herramienta. Figura 4.5: Vista de la interface de RaptorManager 4.7.2.2 Nest View Es una interfase a un ExtendedNest para poder, desde un navegador, hacer pedidos al ExtendedNest para manipular su Brain. Los pedidos que se pueden hacer son el de agregar una capacidad, activar una capacidad, remover una capacidad y responder 58 LogicRaptors a un query, por lo que NestView puede funcionar como un miniambiente de programación en JavaLog. A continuación se muestra la interface de NestView. Figura 4.6: Vista de la interface de NestView 4.7.2.3 Nest Observer Muestra los agentes presentes en un ExtendedNest dado y refresca la información cada una cantidad de segundos indicada por el usuario, esto es de mucha utilidad cuando se quiere rastrear a un LogicRaptor ya sea para medir su performance o para determinar la ruta que esta siguiendo. A continuación se muestra la interface de NestObserver. 59 LogicRaptors Figura 4.7: Vista de la interface de NestObserver 4.7.2.4 Documentation En esta sección se encuentra la documentación de todas las clases Java que forman parte de la implementación de la arquitectura de los LogicRaptors, esta documentación fue generada automáticamente por la herramienta JavaDoc que provee el JDK (Java Development Kit). 4.7.3 Implementación Para que la herramienta funcione bajo cualquier plataforma y dado la amplia aceptación del uso de Internet hoy en día se decidió implementar LogicRaptors Center con tecnologías compatibles con la web, como HTML, WebMacro, JavaScript y Java Servlets. Las tres primeras se usaron para desarrollar la interfase, mientras que con los servlets se desarrolló la funcionalidad de la herramienta. Estas tecnologías permiten que LogicRaptor Center pueda ser navegado desde cualquier navegador ya sea local o remotamente utilizando el protocolo HTTP. WebMacro [WM 01] es un motor para plantillas HTML. WebMacro simplifica el desarrollo de servlets separando el diseño de las paginas web de la programación. JavaScript es un lenguaje interpretado creado por Netscape usado en el desarrollo de paginas web para agregar comportamiento dinámico [WHA 03]. Los servlets implementados para LogicRaptors Center son tres: AgentsHome, NestView y NestObserver. En la siguiente figura se detalla el diagrama de clases de la herramienta. 60 LogicRaptors HttpServlet GenericNest NestView NestObserver Nest AgentHome Figura 4.8: Diagrama de clases de LogicRaptors Center AgentsHome se encarga de toda la funcionalidad provista por RaptorManager. Hereda de Nest; debido a que los agentes deben utilizar funcionalidad de movilidad propia de los Nests, además, AgentsHome es un intermediario entre el usuario y un Nest, y se encarga solamente de manipular a los agentes del usuario y dejando las operaciones propias de movilidad como responsabilidad de las clases pertenecientes a la implementación de la arquitectura. Las clases NestView y NestObserver se encargan de implementar la funcionalidad provista por las utilidades homónimas. 4.8 Características técnicas de la arquitectura propuesta A continuación detallaremos las principales características técnicas de la arquitectura presentada. En este resumen nos hemos centrado en los mismos aspectos que analizamos en los sistemas de agentes móviles estudiados en el capítulo 3, es decir: identidades, persistencia, migración, comunicación, acceso a recursos externos, seguridad e integración con la web. 4.8.1 Identidades El esquema para las identidades de los Nest y Directory está basado directamente en el mecanismo de Uniform Resource Locators (URL). En cuanto a las identidades de los agentes, estos tienen un identificador único por Nest. O sea que pueden existir identificadores de agentes duplicados en el sistema. 4.8.2 Persistencia La persistencia provista es la que provee el API de serialización de Java. Aunque este comportamiento no fue implementado para el caso de los nests, es posible almacenar el estado de un nest en algún repositorio externo para, por ejemplo, la 61 LogicRaptors recuperación ante fallas. El estado del nest comprende a los agentes presentes en el nest, a sus datos, su estado de ejecución y el contenido del blackboard. 4.8.3 Migración El tipo de migración de código utilizado es migración fuerte. Esto presenta una ventaja en cuanto que el código del agente es mucho más legible que el código de un agente con migración débil. 4.8.4 Comunicación La comunicación provista es principalmente una interacción agente – blackboard, aunque se podrían usar los predicados JavaLog existentes para crear una comunicación entre agentes. 4.8.5 Acceso a recursos externos Al ser los agentes objetos Java, estos pueden acceder a los recursos externos siempre que estos existen y los agentes conozcan sus respectivas APIs. 4.8.6 Seguridad En nuestro caso, la seguridad no era un objetivo fundamental del trabajo, por lo que como se explicó anteriormente, el componente de seguridad implementado es mínimo. 4.8.7 Integración con la web Hay dos tipos de comunicación existente en el sistema LogicRaptors, la comunicación entre los componentes de la arquitectura y la de los agentes–blackboard. Toda la comunicación entre los componentes del sistema se realiza sobre HTTP. A excepción de la comunicación agentes–blackboard que se realiza mediante RMI, y esta comunicación es siempre local al sitio. Además, las aplicaciones desarrolladas para monitorear el estado de un Nest y administrar los agentes móviles también utilizan HTTP para comunicarse. 62 5 Performance de los LogicRaptors versus Agentes Estacionarios En este capítulo se detalla una experiencia realizada a fin de medir el desempeño de los LogicRaptors comparándolos con agentes estacionarios. . 5.1 Introducción En los capítulos anteriores se presento una arquitectura integrada a la web para soportar agentes móviles basados en lógica. Esta arquitectura permite materializar sistemas multi-agentes. En los últimos años, los sistemas multi-agentes han crecido en popularidad como una solución viable para complejos sistemas de información distribuidos. El “sistema abierto” mas grande es Internet, donde nuevos contenidos están siendo generados día a día. La naturaleza distribuida de la información en Internet conduce por sí misma a soluciones multiagentes. Los sistemas multi-agentes presentan ventajas como la de ser más rápidos, consumir menos ancho de banda en comunicaciones y ser más confiables que los demás sistemas, y particularmente el tipo de agentes usados, móviles o estacionarios, también tienen sus propios conjuntos de ventajas y desventajas. El propósito de este capítulo es recolectar datos cuantitativos que permitan determinar precisamente bajo que circunstancias conviene la utilización de agentes móviles y en que casos conviene la utilización de estacionarios. Mas aún, el objetivo de las mediciones es fundamentar la conveniencia de elegir el uso de agentes móviles, en nuestro caso los LogicRaptors, por sobre los agentes estacionarios, cuando las comunicaciones son muy frecuentes y a una velocidad de transferencia muy inferior a la de una red local, como es el caso de Internet. Para realizar el análisis de performance entre los distintos sistemas multi-agentes desarrollamos soluciones con agentes móviles (LogicRaptors) y estacionarios al problema de búsqueda de información distribuida en Internet, más precisamente búsquedas de libros entre diferentes librerías virtuales. Cada una de las aproximaciones fue evaluada usando varias métricas de performance para poder descubrir las ventajas y desventajas de cada variante. Performance de los LogicRaptors vs. Agentes Estacionarios El resto del capítulo está estructurado como sigue. En la sección 2 se realiza una descripción del problema a simular, el diseño de las soluciones y algunas cuestiones técnicas involucradas en el desarrollo de la experiencia, en la sección siguiente (sección 3) se presentan y se analizan los datos obtenidos, y por último, en la sección 4 se discuten las conclusiones arrojadas por la experiencia. 5.2 Descripción de la Experiencia El objetivo de la experiencia, como se dijo anteriormente, es obtener datos para fundamentar la conveniencia de la utilización de agentes móviles en vez de estacionarios. Para llevar a cabo esta experiencia se debía seleccionar un dominio de aplicación suficientemente general, como para que las conclusiones obtenidas sigan teniendo valor mas allá de ese dominio. Con esa consigna, se decidió realizar la experiencia basados en el problema de búsqueda de información distribuida. Se implementó la arquitectura descripta en el capítulo anterior, utilizada por ambas soluciones, la de agentes estacionarios y la de agentes móviles. Los nests representan a las librerías virtuales. Además, también se debía seleccionar un ambiente de ejecución donde llevar a cabo la experiencia. Se decidió realizar la experiencia en una red de computadoras aislada con distintas plataformas y sistemas operativos. En la sección 5.2.3 se dan más detalles técnicos acerca del ambiente de ejecución de la experiencia. 5.2.1 El Problema de la Búsqueda de Información La búsqueda de información es de gran importancia en la actualidad. El problema es que, hoy en día, los usuarios tienen grandes cantidades de información a su disposición distribuida a través de una inmensa infraestructura de almacenamiento de datos, esta infraestructura además de ser muy grande está creciendo notablemente día a día. Un caso particular del problema de búsqueda de información es el de búsqueda de libros en librerías virtuales. Hoy en día existen numerosos portales de Internet encargados de vender libros, tal es el caso de portales como Amazon, Submarino, Virtual Bookstore, etc. Estos sitios publican las ofertas de los libros que desean vender y los compradores se encuentran con el problema de encontrar el libro que desean entre una enorme cantidad de portales que lo ofrecen. 5.2.2 Diseño de la Solución Para realizar la experiencia se utilizó la arquitectura de los LogicRaptors, tanto para los agentes móviles, que es para lo que fue creada, como para los agentes estacionarios. Esto se logró modificando el código de los agentes, negándoles la posibilidad de migrar a otro sitio y exigiéndoles que las consultas las hagan en forma remota utilizando los predicados connect y disconnect de JavaLog. 5.2.2.1 Librerías Cada librería va a estar representada por un nest en donde va a estar publicada la oferta de libros que posee. La cantidad de libros publicados es de aproximadamente 64 Performance de los LogicRaptors vs. Agentes Estacionarios 150. Cada libro es publicado en el blackboard de la librería como un hecho Prolog, que tiene la siguiente estructura: Book([lang],place,edit,pub_date,pages,stock,[author],title,code) Donde: [lang] Lista de idiomas en los que está disponible el libro. place Lugar de origen del libro. edit Editorial que editó el libro. pub_date Fecha de publicación el libro. pages Cantidad de páginas del libro. stock Cantidad de ejemplares del libro que posee la librería en stock. [author] Lista de los autores que escribieron el libro. title Título del libro. code Código del libro. 5.2.2.2 Configuración de los Agentes Para realizar la experiencia se utilizaron tres agentes diferentes. Al primer agente se le configuraron sus preferencias de manera que no encuentre ningún libro de la base de datos de las diferentes librerías, el segundo agente encuentra aproximadamente la mitad de los libros y por último el tercer agente encuentra todos los libros de las librerías. El motivo para crear a los tres agentes con distintas preferencias fue lograr que, cuando se comunica un sitio con otro para intercambiar información, el volumen de los datos a transmitir sea diferente. En un sistema de agentes móviles la información transferida es el agente entero, y en el caso de un sistema de agentes estacionarios se transmiten los datos requeridos y se reciben los que son encontrados. En ambos casos, los parámetros que se van a medir (tráfico de red, tiempo, etc) dependen mucho de las preferencias del agente, es decir cuanto más datos encuentre más datos se deben transmitir por la red. 5.2.2.3 Aproximación con Agentes Estacionarios Los agentes utilizados en esta experiencia permanecen estacionarios en un mismo sitio y consultan cada una de las librerías existentes buscando si tienen algún libro que sea de interés para el usuario de acuerdo a sus preferencias. En la figura 5.1 se ve la secuencia que sigue un agente estacionario para consultar las diferentes librerías: 65 Performance de los LogicRaptors vs. Agentes Estacionarios Host Origen Host Origen Librería 1 Librería 2 (Nest) (Nest) Librería 3 Librería n (Nest) (Nest) request results Librería N ... Librería 1 request results request results Librería 2 Librería 3 request Librería 6 results Librería 5 Librería 4 Figura 5.1 Diagrama de secuencia de búsqueda de un agente estacionario La forma de evaluación remota es por medio del predicado connect. El siguiente pseudo-código muestra el algoritmo que sigue un agente estacionario: obtener librerías por cada librería por cada libro si el libro concuerda con preferencias de usuario agregar libro a libros encontrados devolver datos al usuario 5.2.2.4 Aproximación con Agentes Móviles Los agentes utilizados en esta experiencia migran a cada librería y realizan consultas en forma local buscando libros que sean de interés para el usuario de acuerdo a sus preferencias. En la figura 5.2 se ve la secuencia que sigue un LogicRaptor para consultar las diferentes librerías: Host Origen Host Origen Librería N ... Librería 1 Librería 1 (Nest) Librería 2 (Nest) Librería 3 (Nest) ... Librería n (Nest) code + request code + request + results code + request + results code + request + results Librería 6 Librería 2 Librería 3 Librería 4 code + complete results Librería 5 Figura 5.2 Diagrama de secuencia de búsqueda de un LogicRaptor El agente utiliza los predicados connectb y disconnectb para conectarse al blackboard de la librería. El siguiente pseudo código muestra el algoritmo que utiliza un agente móvil. 66 Performance de los LogicRaptors vs. Agentes Estacionarios obtener librerías por cada librería migrar a la librería si no se pudo migrar a la librería continuar con la sig. por cada libro si el libro concuerda con preferencias de usuario agregar libro a libros encontrados devolver datos al usuario Como se puede observar si se lo compara con el código anteriormente mostrado para el agente estacionario, la única diferencia es la migración de código. La implementación de los fragmentos de pseudo-código mostrados anteriormente es realizada en el paradigma de programación lógico, utilizando los predicados de JavaLog más los explicados en la sección 4.5.2 (getHosts, moveTo, etc) 5.2.3 Ambiente de Ejecución La experiencia se llevó a cabo en dos escenarios diferentes. La mayor parte de las mediciones (tráfico de red, cantidad de paquetes, etc) se realizaron sobre el primer escenario, compuesto por siete computadoras pertenecientes a una red aislada cuya velocidad de transferencia es de 100 Mbps. En el segundo escenario se midieron los tiempos de ejecución en cinco computadoras conectadas a 100Mbps y a 10 Mbps. En ambos casos se utilizaron máquinas diferentes, con distintas plataformas y sistemas operativos. En las tablas 5.1 y 5.2 se pueden ver las características de las computadoras utilizadas en ambos escenarios. 1º Escenario (100Mbps) Cantidad Procesador Memoria (MB) 1 SUN Ultra Sparc 2 128 3 SUN Ultra Sparc 10 256 3 PII 400Mhz 128 Sistema Operativo Solaris 5.8 Solaris 5.8 Mandrake 7.0 Tabla 5.1: Características de las computadoras utilizadas en la primer escenario de la experiencia. 2º Escenario (10Mbps) Cantidad Procesador Memoria 4 SUN Ultra Sparc 10 256 1 2 x SUN Ultra Sparc 250 512 Sistema Operativo Solaris 5.8 Solaris 5.8 Tabla 5.2: Características de las computadoras utilizadas en el segundo escenario de la experiencia. 5.3 Testeo y Análisis Se realizaron mediciones comparando la solución al problema descripto anteriormente, que utiliza agentes móviles con la que utiliza agentes estacionarios. Se realizaron cuatro pruebas para cada una de las tres configuraciones de agentes a fin de reducir la desviación producida por algún fenómeno aleatorio como puede ser un error en el canal de comunicación. 67 Performance de los LogicRaptors vs. Agentes Estacionarios Para capturar las comunicaciones y realizar las mediciones necesarias se utilizó la aplicación ksnuffle versión 2.2. 5.3.1 KSnuffle Ksnuffle 2.2 es una herramienta para monitorear el tráfico en una red, que ejecuta en el sistema operativo Linux. Ksnuffle utiliza como base el código de tcpdump, que es una herramienta Unix. Las características mas importantes de Ksnuffle 2.2 son: • Soporta los protocolos TCP/IP y UDP/IP. • Permite realizar un filtrado básico a través de la GUI y un filtrado más avanzado vía programas. • Múltiples monitores concurrentes. • Sniffing remoto vía un proceso de server remoto. • Estructura del protocolo visualizado a nivel de aplicación. • Visualización del flujo de datos TCP. • Generación de archivos de logs. • Visualización textual del tráfico de red. • Histogramas de carga de red y visualización de promedios de carga. • Ejecución de comandos sobre eventos específicos. • Generación de un resumen del tráfico total en una red o en una parte de ella. KSnuffle realiza el filtrado de paquetes exactamente como tcp-dump. Para más detalles leer las páginas del manual de Linux correspondiente a esta utilidad. 5.3.2 Resultados En las mediciones se tomaron en cuenta, principalmente, cuatro métricas de performance, la cantidad de paquetes TCP enviados, el tráfico de red, la cantidad total de datos transmitidos y el tiempo consumido. 5.3.2.1 Cantidad de paquetes Esta métrica da la cantidad de paquetes capturados por ksnuffle durante la experiencia por ambas aproximaciones. Móvil 1º corrida 264 2º corrida 262 3º corrida 280 4º corrida 262 Promedio 267 Ag1 Estacionario 12301 13091 12930 9112 11858,5 Móvil 911 869 874 920 893,5 Ag2 Ag3 Estacionario Móvil Estacionario 655400 1470 812886 635700 1445 820572 608955 1436 846372 661244 1487 841536 640324,7 1459,5 830341,5 Tabla 5.3: Datos obtenidos de la cantidad de paquetes transmitidos. 68 Performance de los LogicRaptors vs. Agentes Estacionarios 5.3.2.2 Tráfico en kilobytes Es la suma de todos los datos transmitidos por la red. Esto incluye los datos de los encabezados de los protocolos usados y los datos propios de la experiencia realizada. Móvil 1º corrida 125 2º corrida 125 3º corrida 129 4º corrida 125 Promedio 126 Ag1 Estacionario 3343 3579 3533 2337 3198 Móvil 677 650 632 68 664,2 Ag2 Estacionario 185355 173988 165464 186112 177729,7 Móvil 708,8 736,8 695,5 697,3 709,6 Ag3 Estacionario 231430 234230 242466 240768 237223,5 Tabla 5.4: Datos obtenidos del tráfico de red generado. 5.3.2.3 Cantidad total de datos transmitidos en kilobytes Estos son sólo los datos de la experiencia realizada. Sin incluir los encabezados de los protocolos que se utilizan para enviar los datos de la experiencia. Ag1 Móvil Estacionario 1º corrida 116 2910 2º corrida 116 3118 3º corrida 119 3077 4º corrida 116 2014 Promedio 116,75 2779,75 Móvil 645 621 605 674 636,2 Ag2 Estacionario 164854 150785 146788 166698 157281,2 Móvil 659 687,9 646,8 650,3 661 Ag3 Estacionario 202852 205397 212742 211209 208050 Tabla 5.5: Datos obtenidos de la cantidad total de datos transmitidos. 5.3.2.4 Tiempo consumido en minutos Estos datos corresponden al tiempo, en minutos, insumido por los agentes desde que comienzan su evaluación hasta que terminan. Las mediciones se tomaron en el escenario 2, detallado en la sección 5.2.3. Adicionalmente se varió la velocidad de transmisión entre las máquinas pertenecientes al escenario, con el fin de realizar un seguimiento del comportamiento de los agentes móviles/estacionarios a medida que la red es mas lenta. Primero, se testeó con una velocidad de transferencia de 100 Mbps y posteriormente con una de 10 Mbps. 100 mbps Móvil 1º corrida 2:47 2º corrida 2:50 3º corrida 2:43 4º corrida 2:45 Promedio 2:46 Ag1 Estacionario 00:30 00:29 00:30 00:30 00:29 Móvil 05:40 05:47 05:37 05:42 05:41 Ag2 Estacionario 06:05 06:12 06:02 06:05 06:06 Móvil 11:25 11:20 11:32 11:23 11:25 Ag3 Estacionario 20:08 20:02 20:10 19:46 20:01 Tabla 5.6: Datos obtenidos del tiempo de ejecución con velocidad transmisión de 100 mbps. 69 Performance de los LogicRaptors vs. Agentes Estacionarios 10 mbps Móvil 1º corrida 03:01 2º corrida 03:01 3º corrida 02:54 4º corrida 03:03 Promedio 02:59 Ag1 Estacionario 00:40 00:40 00:39 00:41 0:40 Móvil 7:01 7:03 6:54 7:10 7:02 Ag2 Estacionario 9:24 9:25 9:12 9:38 9:24 Móvil 13:54 13:56 13:40 14:06 13:54 Ag3 Estacionario 30:02 30:03 29:45 30:24 30:03 Tabla 5.7: Datos obtenidos del tiempo de ejecución con velocidad de transmisión de 10 mbps. 5.3.3 Análisis de los datos obtenidos Como se explicó anteriormente las tres primeras métricas están estrechamente relacionadas, las tres miden la carga de red generada por cada sistema. En consecuencia, tomaremos a las mediciones de tráfico total de red como parámetro principal a analizar, ya que es la que tiene mayor incidencia en la performance final de la red donde se ejecuten los sistemas multi-agentes. 5.3.3.1 Tráfico generado en la red Los datos obtenidos del tráfico de red producido por ambas aproximaciones marcan una enorme diferencia a favor de los sistemas de agentes móviles. Por ejemplo, para el agente 2, el cual es un caso medio entre el 1 y el 3, el tráfico que genera el agente estacionario es en promedio de 177.730 kilobytes, mientras que, para el agente móvil el promedio es de 664 kilobytes. Es decir, que el agente estacionario genera aproximadamente el tráfico que generarían 267 agentes móviles ejecutando a la vez. 250000 Tráfico (Kb) 200000 LogicRaptors 150000 Agentes Estacionarios 100000 50000 0 Agente 1 Agente 2 Agente 3 Figura 5.3 Tráfico de red generado por los LogicRaptors vs los agentes estacionarios. Si analizamos al agente 1 vemos que el agente estacionario genera, aproximadamente, el mismo tráfico que generarían 25 agentes móviles. Mientras que con el agente 3, el tráfico del estacionario equivaldría a 334 agentes móviles ejecutando simultáneamente. 70 Performance de los LogicRaptors vs. Agentes Estacionarios Estos números permiten concluir, que a medida que la cantidad de datos transportados es mayor, la diferencia de tráfico generado por ambas aproximaciones se va haciendo cada vez mayor. En la figura 5.3 se puede ver el tráfico de red generado por una aproximación y por otra. 5.3.3.2 Overhead de comunicación Otro aspecto interesante para ver es como, debido a la excesiva cantidad de paquetes generados por los agentes estacionarios, se produce un gran desperdicio de ancho de banda. Este desperdicio es producido principalmente por el overhead propio de los encabezados de los paquetes TCP/IP. Como consecuencia de esto, los agentes estacionarios sufren una considerable baja en el porcentaje de datos trasmitidos. Si observamos, por ejemplo los datos pertenecientes al agente 2, trasmite para el agente móvil un promedio de 893 paquetes, mientras que, para el agente estacionario el promedio es de 640.325 paquetes. Esto influye notablemente en los porcentajes de datos transmitidos. Para el agente móvil el tráfico total es, en promedio, de 664 kilobytes, de los cuales 636 kilobytes, es decir un de 96 por ciento, son datos y solamente un 4 por ciento es overhead de comunicación. En cambio, el agente estacionario genera un tráfico total, en promedio, de 177.730 kilobytes, de los cuales 157.281 kilobytes son datos, esta da un porcentaje de casi 12 % de desperdicio. En la figura 5.4 Se pueden visualizar los porcentajes de desperdicio de kilobytes. LogicRaptor Agente Estacionario 12% 4% 96% 88% Datos Trasmitidos Desperdicio Figura 5.4 Porcentaje de desperdicio de ancho de banda. De este análisis se deduce que los agentes móviles no solo producen menos carga en la red, sino también que la aprovechan mejor. 5.3.3.3 Impacto en las comunicaciones Como se puede ver en la figura 5.5, el flujo del tráfico de red total generado por la aproximación que utiliza agentes estacionarios es de carácter continuo, es decir que agrega importante carga en la red desde el momento en que el agente comienza a realizar la búsqueda de libros hasta que termina. 71 Performance de los LogicRaptors vs. Agentes Estacionarios Figura 5.5 Tráfico de red generado por los Agentes Estacionarios Por otro lado, como se visualiza en la figura 5.6, los agentes móviles (LogicRaptors) solo generan tráfico de red durante pequeñas porciones de tiempo, que corresponden al momento en que se trasladan de un sitio a otro. Figura 5.6 Tráfico de red generado por los LogicRaptors 72 Performance de los LogicRaptors vs. Agentes Estacionarios Esta forma de comunicación por ráfagas de tiempo, produce un notable impacto positivo en las comunicaciones, ya que ha diferencia del sistema que utiliza agentes estacionarios permite que otras aplicaciones utilicen la red, sin mayores problemas, al mismo tiempo que el sistema multi-agente está ejecutando. 5.3.3.4 Tiempos de Ejecución Con respecto a los tiempos de ejecución, antes de realizar cualquier análisis, es importante aclarar, que los tiempos obtenidos son grandes debido principalmente a dos motivos. En primer lugar, el algoritmo que utilizan los agentes para hacer las búsquedas (matching) en los blackboard de cada librería tiene una complejidad de O(n2) y esto es muy costoso en relación con algoritmos de búsqueda estándar que están en orden de O(n.log n). Una alternativa para reducir el costo temporal del algoritmo sería utilizar el predicado retract. que es la forma usual de recorrer los hechos del blackboard, pero el uso de este método para recorrer el blackboard tendría como consecuencia (en el caso de existir más de un agente realizando consultas simultáneamente sobre el blackboard) que cada agente solo pudiera ver información parcial. Además, cualquier modificación de los datos del blackboard ocasionaría problemas de sincronización y por ende resultados de búsqueda erróneos. Otra razón para que los tiempos de ejecución sean grandes es que debido a que la versión de JavaLog utilizada en el trabajo, usa para almacenar la base de datos Prolog una tabla de dispersión, y va dispersando los diferentes hechos y cláusulas por su cabeza y aridad. En nuestro caso todas las publicaciones de libros (hechos) tienen la misma cabeza (book) y la misma aridad (9), por lo tanto, todas caen en el mismo balde de la tabla de dispersión, provocando que la búsqueda en esa estructura sea similar a buscar en una lista, perdiendo de esta manera las ventajas que tienen las tablas de dispersión para realizar búsquedas. En la figura 5.7 se pueden visualizar las curvas pertenecientes al tiempo de ejecución de los agentes en función de la cantidad de datos transmitidos, tanto cuando la velocidad de transmisión de la red es 100mbps como cuando es de 10mbps. Decimos tiempo de ejecución en función de la cantidad de datos transmitidos ya que, debido a como se configuraron los agentes, el agente 3 transmite mayor cantidad de datos que el agente 2 y este, a su vez, transmite mas que el agente 1. En el gráfico se puede ver que los tiempos de ejecución para los agentes estacionarios crecen abruptamente a medida que aumenta la cantidad de datos que trasportan. En cambio, la curva temporal para los agentes móviles tiene un crecimiento mucho más suave, tendiendo a mantenerse constante cuando la cantidad de datos transportados es grande. Esta tendencia se hace más notoria cuando la velocidad de la red es 10 mbps. 73 Performance de los LogicRaptors vs. Agentes Estacionarios Tiempo (minutos) 40 30 20 10 0 Agente 1 Agente 2 Agente 3 Cantidad de Datos Transmitidos (Kilobytes) LogicRaptor (100mbps) Ag.Estacionario (100 mbps) LogicRaptor (10mbps) Ag.Estacionario (10mbps) Figura 5.7 Tiempo de ejecución de los LogicRaptors vs los agentes estacionarios. 5.4 Conclusiones de la experiencia Luego de realizar el análisis de los datos obtenidos, se puede concluir, como se esperaba, que la carga de red generada es la principal ventaja de los sistemas de agentes móviles, con respecto a los agentes estacionarios. Por otro lado, la tendencia marca que el sistema de agentes móviles es más rápido a medida que la velocidad de transferencia de red es menor y la cantidad de datos trasportados es mayor. Por lo tanto, para aplicaciones que manejan un volumen importante de datos en Internet, donde la velocidad de transferencia es mucho menor a la que poseen las redes donde se realizó la experiencia, es ampliamente recomendable el uso de sistemas de agentes móviles. Más aún, en Internet, un sistema de agentes estacionarios, como el usado en esta experiencia, es una solución inviable, ya que haciendo una progresión sobre los datos obtenidos, si bajáramos la velocidad de transmisión de la red a los valores reales de Internet, obtener resultados nos llevaría unas cuantas horas. Creemos que la principal razón por la que los sistemas de agentes estacionarios son más lentos es debido a la cantidad de overhead, en comunicaciones y en tiempo de CPU, necesario para mantener las conversaciones con los otros sitios, en donde están las librerías. Aunque nuestra experiencia nos muestra que los sistemas de agentes móviles son la mejor opción, principalmente debido a la ineficiencia de la aproximación con agentes estacionarios, también es cierto que esta experiencia no incluye todos los casos posibles. Sería interesante poder ampliar la experiencia a diferentes dominios de aplicación y ambientes de ejecución. 74 Performance de los LogicRaptors vs. Agentes Estacionarios Aunque tratamos un solo problema y en un número limitado de casos, creemos que experimentos como este son un paso importante hacia una objetiva evaluación de los sistemas multi-agentes, que permitan tener datos cuantitativos sobre los cuales basar y justificar decisiones de diseño. 75 6 Conclusiones En este capítulo se analizan las diferentes conclusiones sobre el trabajo y se presentan propuestas para trabajos futuros. . En este trabajo se presentó una arquitectura integrada a la web para soportar agentes móviles basados en lógica. Esta arquitectura fue desarrollada utilizando el paradigma lógico y el orientado a objetos. Esto permite que los agentes sean programados usando el paradigma de programación en lógica y todos los mecanismos de comunicación estén implementados en Java. También se presentó una herramienta web, llamada LogicRaptors Center, que permite administrar los sistemas de agentes móviles que utilizan la arquitectura desarrollada. La primer parte del trabajo consistió en un estudio exhaustivo de varios de los principales sistemas de agentes móviles existentes hoy en día. Este análisis se realizó con el fin de encontrar las características buenas y malas de cada uno, permitiendo de esta manera que el diseño de nuestra arquitectura solucione algunas de las limitaciones encontradas en los sistemas de agentes móviles estudiados. Para el diseño de la arquitectura se utilizó como referencia una arquitectura genérica para sistemas de agentes móviles (sección 4.2), esto permitió focalizarnos estrictamente en el diseño del soporte para agentes basados en lógica, dejando de lado cuestiones ya ampliamente discutidas por varios autores, como, por ejemplo, la de decidir que componentes debe contener una arquitectura de agentes móviles y cuales no. La arquitectura presentada permite, además de aprovechar las ventajas del paradigma lógico para la representación de estados mentales y de Java para la comunicación, mantener el estado de ejecución de un agente, mientras migra de un host a otro (Migración Fuerte). Para coordinar las comunicaciones necesarias entre los diferentes nests fue implementado un protocolo de comunicación llamado MTP (MTP Transfer Protocol). Esto permite obtener un alto grado de independencia con respecto a los protocolos de comunicación de bajo nivel como TCP/IP o UDP/IP. Otra característica importante que posee es la de permitir que un agente móvil sea programado utilizando toda la potencia expresiva que brinda JavaLog (predicados Prolog + predicados propios de JavaLog), solucionando de esta manera una de las principales limitaciones que posee Jinni, que solo soporta un subconjunto muy reducido Conclusiones de Prolog (por ejemplo no soporta corte en el backtracking), lo cual limita considerablemente su potencia expresiva. Otro aspecto de la arquitectura que mejora la alternativa propuesta por Jinni, es el esquema de migración de los agentes. En nuestra arquitectura un agente cuando migra transporta todos los módulos lógicos pertenecientes a su conocimiento. De esta manera se soluciona uno de los principales problemas de Jinni, en donde un agente al migrar solo está formado por un thread más el código de la cláusula actual y al no proveer, el lenguaje, otros mecanismos para definir la clausura de código de un agente, no se puede asegurar que el agente pueda continuar su ejecución en el sitio destino. La manera de solucionar el problema anterior que propone Jinni, no es transparente para el programador y en ciertos casos genera más problemas que los que solucionan. En nuestra propuesta, para lograr la movilidad de los agentes, el programador solo debe definirles sus preferencias y los algoritmos de búsqueda y no debe preocuparse por detalles de bajo nivel. Con el fin de poder manipular agentes sin tener que tener amplios conocimientos de todos los detalles de bajo nivel, se diseño LogicRaptors Center, el cual es una herramienta básica para la administración de los LogicRaptors y supervisión de los Nest. Una vez terminado el diseño e implementación de la arquitectura propuesta, y con el propósito de recolectar datos cuantitativos, que permitan determinar precisamente la conveniencia de la utilización de agentes móviles sobre la utilización de estacionarios, se realizó una experiencia simulando un sistema de búsqueda de ofertas de libros, en librerías virtuales. Se realizó el análisis de performance entre los sistemas multi-agentes móviles (LogicRaptors) y estacionarios, ambas aproximaciones fueron evaluadas usando varias métricas de performance para poder descubrir las ventajas y desventajas de cada variante. La experiencia realizada nos permite concluir, principalmente, que la carga de red generada es la mayor ventaja de los sistemas de agentes móviles, con respecto a los agentes estacionarios. En cuanto a la velocidad pudimos ver que, a medida que la velocidad de transferencia de red es menor y la cantidad de datos transportados es mayor, los agentes móviles realizan las tareas más rápidamente que los estacionarios. Esto es consecuencia directa de la cantidad excesiva de comunicación que debe realizar un agente estacionario para llevar a cabo sus tareas. 6.1 Limitaciones y posibles trabajos futuros Las pruebas realizadas a la arquitectura muestran que ésta funciona de manera satisfactoria, cumpliendo con los objetivos trazados al principio. Aunque, todas las pruebas fueron realizadas en un ambiente ideal, donde no había que considerar problemas de seguridad, por lo que queda como posibles extensiones implementar los componentes de la arquitectura de referencia que no fueron implementados como el administrador de seguridad, el de confiabilidad o el administrador de accesos a servidores de aplicaciones. Agregar un componente de confiabilidad al Nest permitiría que este pueda recuperar su estado ante el eventual caso de una caída del sistema. Para esto tendría que 77 Conclusiones almacenar, según alguna política a definir, los agentes presentes en el Nest con su correspondiente estado de ejecución y el estado del blackboard. Aunque no estaba dentro de los objetivos de nuestro trabajo, uno de los problemas que encontramos fue la performance de los agentes. Como se explicó en la sección 5.3.3.4, los tiempos elevados se deben en parte a que en el momento de desarrollo de nuestro trabajo, JavaLog no estaba optimizado para almacenar grandes volúmenes de datos. Por lo tanto, una posible mejora es integrar nuestro trabajo con la nueva versión de JavaLog, que mejora notablemente lo mecanismos de almacenamiento. Actualmente en JavaLog se puede almacenar un modulo lógico en una base de datos y conectarse a ella usando JDBC. Esto, sin dudas, mejorará notoriamente la performance en las búsquedas, en los blackboards, de los LogicRaptors. Otra manera de disminuir los tiempos de ejecución de los LogicRaptors sería agregar predicados a JavaLog dedicados a optimizar las búsquedas en la base de datos Prolog. JavaLog no posee un mecanismo para iterar sobre todos los hechos de una base de datos sin utilizar el método usado generalmente para tal fin, es decir, haciendo un recorrido recursivo, donde con cada iteración lo que se hace es eliminar el primer hecho encontrado, procesarlo, realizar la llamada recursiva y luego insertarlo nuevamente en la base de datos. Por lo tanto, para recorrer la base de datos se deben utilizar algoritmos cuya complejidad temporal es inaceptable. Una posible extensión a este trabajo, la cual optimizaría notablemente el comportamiento global de la arquitectura, sería permitir la comunicación entre los LogicRaptors para que puedan actuar colaborativamente en una tarea determinada, por ejemplo, en la búsqueda de información. Por otro lado, sería interesante extender LogicRaptors Center, para convertirla en una herramienta más completa para la manipulación y programación de agentes y administración de los nest. Algunas de las características que se le podrían agregar son: • Realizar un seguimiento de manera gráfica de la ruta tomada por los diferentes agentes, dado que esa información actualmente es volcada en archivos de logs. • Poseer directivas para los agentes que se encuentran viajando, por ejemplo: abortar la búsqueda y regresar a casa con los resultados conseguidos hasta el momento, no ir a un sitio determinado (filtrar hosts) o simplemente poder eliminar a un agente a distancia. • Mecanismos de persistencia para, tanto, las diferentes configuraciones de los agentes, como así también la información obtenida por ellos. Por último podemos agregar que adherir a un estándar como MASIF permitiría aceptar en los Nests no sólo LogicRaptors sino cualquier agente que cumpla con este estándar. Esto ampliaría el dominio de aplicación de la arquitectura, permitiendo ser usada en problemas más generales que los tratados en este trabajo. 78 A JavaLog En este apéndice se detallan las características más importantes de JavaLog. A.1 Introducción En este apéndice se presentará un resumen de las características más importantes de JavaLog. Es importante destacar que es fundamental la comprensión de algunos aspectos de JavaLog, ya que el trabajo presentado en los capítulos anteriores está construido usando este lenguaje. La programación de agentes involucra tanto el encapsulamiento de sus comportamientos como el de su estado mental. Estas características han llevado a que se utilicen lenguajes orientados a objetos para programar sistemas multi-agentes. Los lenguajes orientados a objetos han mostrado poseer varias de las características necesarias para codificar funciones clásicas de agentes. Sin embargo, cuando estados mentales complejos deben ser administrados, la programación lógica ha mostrado ser una mejor alternativa para la implementación de actitudes mentales. En consecuencia, viejas ideas con relación a lenguajes multi-paradigmas [Ishikawa 86] [Fukunaga 86] [Mello 87] aparecen como una posible solución a la programación de agentes. Entre tales las propuestas, JavaLog utiliza aquellas ubicadas en el contexto de utilizar cláusulas lógicas para representar conocimiento interno de objetos, intentando resolver los inconvenientes encontrados en la programación de agentes y sistemas multiagentes. JavaLog es un lenguaje multi-paradigma que permite construir agentes a partir de objetos Java capaces de manipular conocimiento en formato de cláusulas lógicas Prolog o extensiones de este lenguaje lógico. La integración de programación orientada a objetos y programación lógica alcanzada en JavaLog ha sido basada en el concepto de módulo lógico. Un módulo lógico es la encapsulación de una secuencia de cláusulas lógicas. Estos módulos pueden ser ubicados tanto en métodos Java como en variables, para luego ser combinados de diversas maneras. El apéndice se organiza de la siguiente manera. La sección 2 se presenta algunos aspectos sobre la integración de paradigmas. En la sección 3, presenta los componentes más relevantes del lenguaje, describiendo los mecanismos que hacen posible la JavaLog interacción entre objetos y cláusulas lógicas. En la sección 4 se describen las primitivas de comunicación provistas por JavaLog. A.2 Integración de objetos y lógica Los paradigmas lógico y orientado a objetos trabajan sobre diferentes elementos. Para integrar la programación orientada a objetos con la programación lógica y viceversa es necesario realizar un mapeo entre los elementos de cada uno. La programación orientada a objetos utiliza elementos (objetos) que son accedidos en un contexto restringido. Estos objetos son manipulados por métodos y encapsulan datos propios de la entidad que modelan. Por otro lado, la programación lógica trabaja con términos y cláusulas. JavaLog es una integración entre los paradigmas: lógico y orientado a objetos desarrollado para la programación de agentes. La programación orientada a agentes utiliza objetos para modelar las habilidades de los agentes y cláusulas lógicas para modelar el estado mental de dichos agentes. Las habilidades de los agentes pueden estar representadas por capacidades de acción como por capacidades de comunicación con otros agentes, mientras que el estado mental puede presentarse en forma de creencias, intenciones, compromisos, etc. Esta integración define el módulo como el componente básico de manipulación. En el dominio de JavaLog, un objeto y un método de la programación orientada a objetos se ven como módulos. Un objeto es un módulo que encapsula datos y un método es un módulo que encapsula comportamiento. Además, JavaLog utiliza el concepto de módulo lógico como un conjunto de cláusulas de Horn. De esta manera, un agente puede modelarse como una composición de módulos. En la figura A.1 se pueden observar dos agentes compuestos por módulos y una referencia a un objeto (llamado brain) que hace las veces de cerebro del agente. Este objeto es una instancia de un intérprete de módulos lógicos que utiliza cláusulas Prolog. Cada agente es una instancia de una clase que puede definir parte de sus métodos en Java y parte en Prolog. Así, la definición de los métodos de una clase puede estar compuesta por varios módulos lógicos. Una instancia de una clase de este tipo presenta una composición de módulos lógicos definidos en métodos y módulos lógicos referenciados por variables de instancia. Figura A.1: Esquema de composición de módulos 80 JavaLog Para realizar esta composición de módulos lógicos y orientados a objetos mediante la integración de objetos y lógica, JavaLog provee un intérprete Prolog basado en el concepto de módulo. Este intérprete está implementado en Java y permite utilizar objetos dentro de cláusulas lógicas, así como embeber módulos lógicos dentro de código Java. En las secciones siguientes se describen las distintas formas de integrar objetos y lógica con JavaLog. A.3 El lenguaje JavaLog Para poder utilizar objetos Java en programas Prolog y módulos lógicos Prolog en objetos Java es necesario contar con un conjunto de primitivas que permitan esta integración. JavaLog ofrece un lenguaje de interacción objetos-lógica-objetos que le brinda al programador de agentes la posibilidad de utilizar las características de ambos paradigmas. A.3.1 Objetos Java en programas Prolog En la programación de agentes se requiere manipular un conjunto de estados mentales que son resultado, o dan como resultado, la utilización de algunas de las habilidades del agente. Para modelar los estados mentales como cláusulas lógicas y las habilidades como métodos de objetos es necesario poseer una forma de interacción que permita: • Crear objetos Java en programas Prolog. • Adquirir una representación lógica de un objeto creado en Java. • Enviar mensajes a objetos en evaluaciones Prolog. A.3.1.1 Creación Cuando en Prolog se desea construir algún tipo de visualización, por ejemplo, por razones de claridad y eficiencia, resulta conveniente utilizar las herramientas de visualización que provee un lenguaje orientado a objetos como Java. Así, si se desea crear un botón en una ventana desde un programa Prolog, se puede utilizar el predicado predefinido newInstance( +Class, +Var) que invoca al constructor de la clase Class y coloca el objeto creado en Var de la forma: newInstance( 'Button', Button1). Esta primitiva presenta una de las formas de incorporar objetos Java en los programas Prolog. De esta manera, se pueden crear objetos que luego serán utilizados e inclusive almacenados en una base de datos Prolog. A.3.1.2 Interacción Java-Prolog Una de las características de mayor utilidad es la posibilidad de representar objetos Java en cláusulas Prolog. Es decir, es posible obtener una representación en 81 JavaLog forma de cláusula lógica de un objeto. Esto se logra utilizando un mensaje particular llamado toClause de la forma: PlClause.toClause(aPerson, new UnaryFunction[ ] { new UnaryFunction() { public Object execute(Object arg) { return ((Person)arg).firstname() } } new UnaryFunction() { public Object Execute(Object arg) { return ((Person)arg).lastname() } } } ); Este fragmento de código toma un objeto aPerson, instancia de la clase Person y lo transforma en una cláusula Prolog, instancia de la clase PlClause. El método toClause ejecuta las funciones de un arreglo (bloque) pasado como segundo argumento sobre el primer argumento. Este arreglo contiene la política de mapeo del objeto a la cláusula. Es decir, en este ejemplo se desea representar al objeto aPerson con una estructura con functor person (nombre de la clase) y argumentos nombre y apellido ( de acuerdo al estado del objeto). Supongamos que este fragmento de código se ejecuta con el objeto aPerson cuyo valor de retorno del mensaje firstname() es Francisco y el de lastname() es Sanchez, la cláusula correspondiente será person( aPerson, 'Francisco', 'Sanchez'). Donde Aperson es una variable ligada con el objeto aPerson. A.3.1.3 Envío de mensajes Una vez que se tiene una forma de acceder a un objeto Java, es necesario poder acceder al estado interno del mismo, u obtener algún comportamiento particular. En la programación orientada a objetos esto se logra con el envío de mensajes al objeto destino. Este proceso en la programación JavaLog, se llama invocación de módulos (en este caso de comportamiento). JavaLog provee un predicado predefinido que, dado un objeto (módulo que encapsula datos), invoca sus métodos (módulos de comportamiento). Por ejemplo, si con una consulta Prolog se recupera el módulo que encapsula los datos de Francisco Sánchez: ?- person( X, 'Francisco', 'Sanchez'). La variable X se ligará con la instancia de Person correspondiente. Si se desea conocer la edad de Francisco Sanchez, es posible invocar al método age(): ?- send( X, age, [ ], Y). Esta consulta enviará el mensaje age al objeto aPerson y ligará la variable Y con el valor retornado por el método correspondiente. Esto es equivalente a la sentencia Java: Y = aPerson.age(); 82 JavaLog A.3.2 Prolog Embebido La característica más importante de JavaLog es la posibilidad de manipular en forma indistinta módulos lógicos y módulos orientados a objetos. Esta característica guía la definición del lenguaje JavaLog en base al manejo de módulos lógicos. Un módulo lógico puede almacenarse en una base de datos Prolog o puede asignarse a variables Java de forma tal que pueda ser activado cuando se necesite utilizar su contenido en una evaluación determinada. De esta forma, las cláusulas lógicas embebidas en los métodos Java se traducen a módulos lógicos asociados a la clase del objeto mediante el preprocesador JavaLog. El preprocesador JavaLog toma como entrada código Java con Prolog embebido (código JavaLog) y genera un archivo con el código Java equivalente. A.3.2.1 Módulos lógicos La interacción entre módulos lógicos y módulos orientados a objetos esta definida en base a tres parámetros: referencia, comunicación y composición. Cuando se habla de referencia, se establece la locación de los módulos lógicos como variables de instancia o como parte de los métodos de las clases. De esta manera un objeto JavaLog puede contener conocimiento privado en cláusulas lógicas. Las capacidades de acción de los objetos-agentes JavaLog vienen dadas por los métodos Java que tiene la posibilidad de encapsular módulos lógicos y consultas sobre una base lógica. Por ejemplo, supongamos un agente comerciante como una instancia de la clase CommerceAgent que tiene la habilidad de seleccionar y comprar elementos de acuerdo a las preferencias de la persona que representa. Las preferencias de este agente pueden cambiar por razones contextuales, con lo cual, la habilidad de comprar cada tipo de elemento está regida por las preferencias activas. Por esta razón, los distintos conjuntos de preferencias se almacenan en módulos lógicos como el que sigue: preference(car, [ford, Model, Price]):Model > 1998, Price < 60000. preference(motorcycle, [yamaha, Model, Price]):Model >= 1999, Price < 9000. Utilizando JavaLog, la clase del agente comerciante se define de la siguiente manera: public class CommerceAgent { private Brain brain; private PlLogicModule userPreferences; public CommerceAgent( PlLogicModule userPreferences ) { brain = new Brain() this.userPreferences = userPreferences; } ... 83 JavaLog public Brain brain(){ return this.brain; } ... public boolean buyArticle( Article anArticle ) { userPreferences.enable(); type = anArticle.type; if (?-preferences( #anArticle#, [#type#, #brand#, #model#, #price#]).) buy(anArticle); userPreferences.disable(); }} En este ejemplo se puede observar que la variable userPreferences referencia un módulo lógico con las preferencias del agente. Estas preferencias son habilitadas cuando se necesitan (por ejemplo en la decisión de la compra o no del artículo) y son deshabilitadas después de utilizarse. Para verificar la aceptabilidad de la compra, se embebe una consulta Prolog que utiliza el conocimiento activado del agente acerca de sus preferencias. Esta consulta contiene variables encerradas entre #. Esta es la forma en que JavaLog utiliza las variables Java en consultas Prolog. Cuando se tiene un agente de este tipo se debe definir un método brain() que retorna una instancia del intérprete JavaLog. El intérprete JavaLog es el encargado de realizar todas las deducciones a partir de módulos lógicos. Este intérprete es asociado con lo que sería el cerebro del objeto-agente JavaLog. Ahora bien, si se necesita construir un agente que cambie de preferencias de acuerdo a ciertas condiciones dadas en su contexto, es posible definir un módulo lógico para cada una de las condiciones. Es decir, suponiendo que el agente comerciante posee las preferencias anteriores en condiciones normales, pero ante una necesidad de inversión puede cambiar sus preferencias a: preference(car, [ _, Model, Price]):Model > 1995, Price < 100000. preference(motorcycle, [ _, Model, Price]):Model >= 1995, Price < 15000. De esta manera, el agente comerciante puede contener dos o más variables de instancia con las distintas preferencias. Estas preferencias serán cambiadas cuando el usuario del agente lo desee utilizando el método switchContext. El siguiente fragmento de código muestra esta incorporación a la clase CommerceAgent. public class CommerceAgent { private Brain brain; private int actualPref; private PlLogicModule[ ] userPreferences; public CommerceAgent( PlLogicModule userPreferences ) { brain = new Brain(); 84 JavaLog this.userPreferences[0] = userPreferences; this.actualPref = 0; } ... public Brain brain(){ return this.brain; } ... public int addPreferences(PlLogicModule userPreferences ){ this.userPreferences[this.userPreferences.length + 1] = userPreferences; return this.userPreferences.length + 1; } ... public void switchContext( int newContext ) { this.actualPref =ñewContext; } ... public boolean buyArticle( Article anArticle ){ userPreferences[actualPref].enable(); type = anArticle.type; if (?-preferences( #anArticle#, [#type#, #brand#, #model#, #price#]).) buy(anArticle); userPreferences[actualPref].disable(); }} En un objeto de la clase CommerceAgent se pueden incorporar la cantidad de módulos lógicos con preferencias que se deseen. Para conocer qué preferencia tiene que utilizar en la decisión de una compra, el agente comerciante conoce cuál es el módulo lógico que debe activar en el momento de la compra por medio de una variable de instancia actualPref. Otra implementación de esta clase podría contemplar la posibilidad de realizar combinaciones de módulos lógicos de acuerdo a ciertas condiciones variables, con lo cual las posibilidades de utilización del conocimiento del agente se ven ampliamente incrementadas. El manejo de los módulos lógicos (también llamados capacidades del agente) puede ser delegado al intérprete JavaLog. Una instancia de la clase Brain puede manipular una cantidad de capacidades de un agente con la utilización de primitivas de agregado, activación y desactivación de capacidades. De esta manera, la clase CommerceAgent podría codificarse de la siguiente manera: public class CommerceAgent { private Brain brain; private int nextContext; public CommerceAgent( String userPreferences ) { brain = new Brain() brain().addCapability(“Context1”, userPreferences); nextContext=2; } 85 JavaLog ... public Brain brain(){ return this.brain; } ... public int addPreferences( String userPreferences ) { brain().addCapability(“Context” + nextContext, userPreferences); return nextContext++; } ... public void switchContext( int newContext ) { brain().deleteCapabilities(); brain().activeCapability( “Context” + newContext); } .. public boolean buyArticle( Article anArticle ) { type = anArticle.type; if (?-preferences( #anArticle#, [#type#, #brand#, #model#, #price#]).) buy(anArticle); }} En este ejemplo se puede observar la utilización de los métodos para el manejo de las capacidades de un agente. El método addCapability agrega un módulo lógico al conocimiento del agente, activeCapability activa para la evaluación un módulo lógico y deleteCapabilies desactiva todos los módulos lógicos del agente. Por otra parte, JavaLog permite embeber módulos lógicos en módulos de comportamiento (métodos). Por ejemplo podría crearse una instancia del agente comerciante anteriormente definido de la siguiente manera: CommerceAgent anAgent = new ComerceAgent( {{preference(car, [ford, Model, Price]):Model > 1998, Price < 60000. preference(motorcycle, [yamaha, Model, Price]):Model >= 1999, Price < 9000. }} ); Donde el código encerrado entre {{ y }} es traducido a un módulo lógico que es pasado como parámetro al constructor de la clase CommerceAgent. Cuando se embeben módulos lógicos en métodos, JavaLog aplica una política de activación de dichos módulos tal que, un módulo puede ser activado explícita o implícitamente y puede ser desactivado manual o automáticamente. El ejemplo anterior muestra una forma de activación/desactivación explícita. El siguiente código muestra un ejemplo de activación implícita y desactivación automática. 86 JavaLog ... public void extra() { {{ edge(4,6). }}; } ... public void test() { Integer i = new Integer( 1 ); extra(); System.out.println( "edge(X,Y) " + ?-edge(X,Y). + " X=" + brain().answer().get("X") + " Y=" + brain().answer().get("Y") ); {{ edge(#i#,2). edge(2,3). edge(3,4). edge(6,7). connected(X,Y):-edge(X,Y). connected(X,Y):-edge(X,Z),edge(Z,Y). ?-edge(1,Y). ?-connected(A,B). ?-connected(4,7). }}; System.out.println( brain().answer() ); } Este código muestra la inclusión de dos módulos lógicos dentro de métodos Java. El código Prolog encerrado entre doble llaves en los métodos extra() y test() se traduce a módulos lógicos incluidos en las capacidades del brain de un objeto de esta clase. La invocación al método extra() en test() produce la activación del módulo lógico asociado con ese método. Luego, una consulta Prolog del tipo ?-edge(X, Y) producirá una evaluación sobre el módulo lógico extra. Seguidamente se activará el módulo lógico asociado con el método test(), el cual incorporará una serie de cláusulas a su base de conocimientos y luego tratará de satisfacer las consultas correspondientes. Una vez realizadas estas tres consultas (consultas múltiples), el intérprete brain desactivará todos sus módulos lógicos (incluyendo extra). Resumiendo, la inclusión de consultas dentro de módulos lógicos embebidos en métodos Java produce la desactivación automática de todas las capacidades activas del agente, mientras que una consulta embebida en el código Java, se evalúa sin efectos colaterales. JavaLog brinda una forma de acceder al valor al cual quedaron ligadas las variables Prolog después de una consulta, así como el resultado de las últimas consultas (en el caso de consultas múltiples). Para acceder al valor de una variable puede utilizarse un diccionario de variables conteniendo pares del tipo (nombre, valor). En el ejemplo anterior, este proceso está resumido en brain.answer().get(“X”). Para recuperar el valor de la i-ésima consulta se podrá utilizar brain.result( i ). 87 JavaLog A.3.2.2 Composición de Módulo lógicos La composición de módulos lógicos puede ser tratada desde dos puntos de vista. Los módulos lógicos referenciados por variables pueden ser combinados con la utilización de métodos predefinidos. Por ejemplo enable() y disable() en el caso del agente comerciante pueden utilizarse para activar cada uno de los conocimientos en forma separada o combinada. Los módulos lógicos embebidos en métodos Java pueden ser combinados mediante la herencia. Así, por ejemplo el siguiente fragmento de código muestra un método definido con código JavaLog. El sector de código delimitado entre “{{“ y “ }}” define la forma de evaluación de un estudiante en forma de cláusulas Prolog (un módulo lógico). A continuación, el código contiene una consulta Prolog que obtiene la calificación de un estudiante. En este caso el predicado Prolog incluye una variable Java #aStudent# con un objeto estudiante. public class Profesor { private Brain brain; ... public Brain brain(){ return this.brain; } ... public String qualification() { {{ qualification(Student, 'A'):- exercise(Student, passed), finalTest(Student, passed). qualification(Student, 'B'):- exercise(Student, passed). ... ?- qualification(#aStudent#, X). }}; if( brain().result(1) ) return brain().answer().get( “X” ).toString(); else return null; }} Una subclase de Profesor puede redefinir el método qualification. La forma de realizar dicha redefinición permite obtener distintas combinaciones de módulos lógicos: redefinición o conjunción de módulos lógicos. Si el método de la superclase contiene una consulta en el módulo lógico embebido, toda subclase de esa clase redefinirá el módulo lógico correspondiente. Si, en cambio, el módulo lógico de la superclase no contiene consultas, la subclasificación producirá una agregación de módulos lógicos. En el caso de la clase Profesor, el módulo lógico contenido en el método qualification(Student aStudent) incluye una consulta, con lo cual cualquier redefinición del método concluirá en una redefinición del módulo lógico. Por ejemplo, la clase PostGradoProfesor redefine este método y utiliza la evaluación sobre el módulo lógico de su superclase. public class PostGradoProfesor extends Profesor { 88 JavaLog ... public String qualification( Student aStudent ) { String qualification=super().qualification(aStudent) {{ qualification(Student, 'A'):- #qualification# = 'A', seminary(Student, 'A'). qualification(Student, 'B'):- #qualification# = 'A', seminary(Student, 'B'). ?- qualification(#aStudent#, X). }}; return brain().answer().get( “X” ).toString(); ... } Para conseguir la agregación de módulos lógicos, una clase puede embeber módulos lógicos que sólo contengan cláusulas (sin consultas). En el caso del profesor, si la consulta: ?-qualification(#aStudent#, X) no se encontrara dentro del módulo lógico, cualquier subclase podría agregar un módulo lógico con cláusulas con la misma cabeza, o bien redefinir dichas cláusulas (sin invocar al súper). El siguiente fragmento de código muestra una nueva definición de la clase Profesor. public class Profesor { private Brain brain; ... public Brain brain(){ return this.brain; } ... public String qualification(){ {{ qualification(Student, 'A'):exercise(1, Student, passed), exercise(2, Student, passed), finalTest(Student, passed). qualification(Student, 'B'):exercise(Student, passed), exercise(2, Student, passed). }}; }... public String qualification( Student aStudent ) { qualification(); ?- qualification(#aStudent#, X). ; if( brain().result(1) ) return brain().answer().get( “X” ).toString(); else return null; }} Una instancia de esta clase, si recibe el mensaje qualification(aStudent) invoca el método qualification(). Este método agrega el módulo lógico a su base de conocimiento. Luego se realiza la consulta a partir de esta base de conocimiento. Si se quiere implementar la clase correspondiente a un profesor con otra forma de 89 JavaLog calificación, se pueden agregar niveles de calificación al Profesor (redefiniendo qualification() ), como muestra el siguiente ejemplo. public class ProfesorA extends Profesor{ ... public String qualification() { super.qualification(); {{ qualification(Student, 'C'):- exercise(1, Student, passed). }}; } ... } En esta redefinición del método qualification() la invocación a super.qualification() incorpora a la base de conocimiento el módulo lógico del método de la superclase y luego se agrega el módulo lógico definido en el método de la subclase. Por otro lado, si se omite esta invocación, la base de conocimiento contendrá sólo el módulo lógico definido en la subclase, con lo que se logra el efecto de reescritura del módulo lógico. Existe otra forma de modificar la base de conocimiento del objeto en forma dinámica. Es decir, la posibilidad de tratar los módulos lógicos y los módulos orientados a objetos sin distinción permite que un módulo lógico sea pasado como parámetro a un método y, de esta manera, ser activado en el cerebro del objeto-agente. A.3.2.3 Preprocesador JavaLog Una vez que el código JavaLog es escrito es necesario traducirlo a su equivalente en código Java. Esta tarea es realizada por el preprocesador JavaLog. El preprocesador JavaLog toma como entrada un archivo de extensión javalog y genera un archivo con extensión java que luego puede ser compilado a bytecode por cualquier compilador jdk 1.1.3 o superiores. Si, por ejemplo, el código del agente comerciante se encuentra en un archivo commerceAgent con extensión javalog, la siguiente invocación al preprocesador generará el archivo commerceAgent con extensión .java. ./JavaLog.sh -p commerceagent.javalog A.4 Interacción entre agentes Uno de los puntos de estudio fundamentales en la programación de agentes es la comunicación en sistemas multi-agentes. En un sistema de este tipo existen una cantidad de agentes ocupándose de realizar la tarea que le ha sido asignada. Para esto, es posible que necesiten tanto recursos compartidos, como conocimiento compartido. Es decir, es frecuente que un agente necesite del conocimiento (o parte del conocimiento) de otro agente para alcanzar un objetivo propio. Cuando se trata con sistemas multi-agentes, donde estos agentes comparten parte de su conocimiento o tienen objetivos comunes, es necesario contar con alguna forma de organización del sistema para obtener la mayor productividad individual y colectiva. Un primer paso 90 JavaLog hacia esta organización es la posibilidad de contar con algún medio de comunicación que permita implementar algoritmos de coordinación. JavaLog incorpora una arquitectura de referencia para la programación de sistemas multi-agentes que permite modelar un agente como un objeto Java y su estado mental como cláusulas Prolog. Además, brinda una serie de primitivas de comunicación entre agentes para compartir conocimientos y objetivos. En este aspecto, el concepto de módulo lógico toma fundamental importancia ya que cada agente encapsula parte de su conocimiento (o todo su conocimiento) en módulos lógicos. Estos módulos lógicos pueden ser privados al agente o pueden ser publicados en un repositorio Prolog para que pueda ser utilizado por el resto de la comunidad de agentes. Este repositorio se ajusta a una arquitectura Blackboard, donde se posee un medio de comunicación centralizado en el cual los distintos componentes de la arquitectura leen o escriben datos relevantes al procesamiento de las tareas colectivas. Además, estos agentes pueden comunicarse entre si (sin la utilización del Blackboard) para, por ejemplo, pedir ayuda a otros agentes. De esta manera, un agente que es incapaz de resolver una consulta puede delegar esta tarea, o parte de ella, a otro agente que con su conocimiento, puede llevar a cabo satisfactoriamente la evaluación de la misma consulta. En las próximas secciones se describirán las primitivas de comunicación que ofrece JavaLog para una arquitectura distribuida y una arquitectura Blackboard. A.4.1 Arquitectura Blackboard La arquitectura Blackboard está definida en función a su componente principal, el blackboard. Un blackboard es una estructura de datos que puede ser leída y modificada por programas llamados fuentes de conocimiento (Knowledge Source). Cada fuente de conocimiento se especializa en la resolución de una parte particular de un tarea completa. Así, todas las KS trabajan en forma conjunta en la búsqueda de una solución. Estos programas especializados son independientes entre sí. El rumbo tomado por el sistema está determinado principalmente por el estado del procesamiento, el cual es evaluado por un componente central que controla y coordina los programas especializados. De esta forma, es posible realizar un control de los datos de manera oportunista. Esto aumenta la experiencia del componente de control, a partir de lo cual, puede construir heurísticas derivadas experimentalmente para controlar el procesamiento. JavaLog ofrece una serie de primitivas de comunicación donde las fuentes de conocimiento (objetos agentes) se pueden comunicar con un componente centralizado. En un sistema multi-agente, cada componente de la comunidad de agentes posee su base de conocimiento privada y un cerebro (intérprete Prolog) que la interpreta. Además, la comunidad puede tener una base de conocimiento pública (blackboard) y un agente con un comportamiento especial (componente de control). La figura A.2 muestra una arquitectura blackboard definida por un objeto-agente centralizado (componente de control) que posee una base de conocimiento privada. Este intérprete puede hacer pública una parte de su base de conocimiento (blackboard) para que todos los agentes de la comunidad escriban y lean de ella. Además, cada agente del sistema, posee su propio cerebro (intérprete Prolog) con su respectiva base de conocimiento privada. 91 JavaLog Figura A.2: Arquitectura Blackboard En este contexto, el agente de control puede publicar un módulo lógico en el blackboard con la primitiva publishm(ModuleName), donde ModuleName es el nombre del módulo que se desea publicar. Un agente comparte su estado mental utilizando los predicados publish y publishm y pregunta por los módulos públicos de un agente con registryObjs: publish(Identificador): hace pública la base de datos del agente. La base de datos se publica con el nombre. //<NombreHost>/JavaLog/<Identificador>. publishm(NombreMódulo, Identificador): hace público un módulo lógico del agente. El módulo lógico se publica con el nombre. //<NombreHost>/JavaLog/<NombreMódulo>/<Identificador>. registryObjs(NombreHost, ListaURL): consulta con el host NombreHost qué módulos lógicos exporta. ListaURL se instancia con una lista con los identificadores de módulos remotos. Luego, otro agente puede conectarse al blackboard utilizando la primitiva connect(ModuleName: El predicado connect incorpora una referencia a un módulo lógico remoto en la base de datos local; connect recibe un argumento con un identificador de un objeto remoto con la sintaxis: //<NombreHost>/JavaLog/<Identificador> donde NombreHost es el nombre o la dirección IP (Internet Protocol) del host que contiene el módulo lógico identificado por Identificador. De esta forma, la conexión a una base de conocimiento remota puede verse como la incorporación de un módulo lógico remoto a la base local . Por ejemplo, si un agente ejecuta: connect('//javaLog.exa.unicen.edu.ar/JavaLog/publicDataBase'). se produce la incorporación de un módulo lógico remoto con el contenido de la base de datos del servidor especificado, a la base de datos del agente. Luego de que un agente se conecta con una base de datos remota, la evaluación de una consulta local se realiza de la misma forma que antes, sólo que ahora se tiene en cuenta el contenido de la base remota. Si este agente desea escribir algo en el blackboard, puede hacerlo con la utilización de assertm(ModuleName, Clause). El predicado assertm se utiliza para agregar cláusulas a un módulo lógico, y por lo tanto puede ser usado con un módulo lógico remoto de la misma forma que con un módulo lógico local. 92 JavaLog A.4.2 Delegación JavaLog provee facilidades para efectuar delegación de tareas entre agentes. El mecanismo de delegación permite a un agente solicitar a otros la realización de tareas determinadas. Dicho mecanismo resulta de utilidad, por ejemplo, cuando existen agentes con diferentes capacidades, y por consiguiente, con diferente estado mental; así, un agente puede solicitar la colaboración de los agentes aptos para cada tarea en particular. Es decir, un agente puede tener el conocimiento necesario para satisfacer una consulta pero puede carecer de la habilidad de efectuar esa consulta. Por medio del mecanismo de evaluación remota, un agente puede utilizar el cerebro y, por consiguiente, el conocimiento de otro agente para realizar un razonamiento, sin necesidad que el dueño del cerebro implemente la habilidad correspondiente JavaLog define tres predicados para efectuar comunicación directa entre distintos objetosagente: present(Identificador): se utiliza para permitir que otros intérpretes soliciten la evaluación de cláusulas en forma remota. El agente se registra con un identificador con la siguiente sintaxis: //<NombreHost>/JavaLog/<Identificador>. rcall(Service, Query): evalúa una consulta en el intérprete identificado por Service, donde Service es un identificador de la forma: //<NombreHost>/JavaLog/<Identificador>. Si la consulta que se ejecuta en el intérprete remoto es satisfactoria, la evaluación tiene éxito. Si el host no se encuentra, el intérprete remoto no acepta invocaciones remotas, o Query no es verdadero, entonces rcall falla. rsolutions(Service, Query, Result): es similar a rcall salvo que solicita al intérprete remoto que considere todas las posibles reevaluaciones de Query. Si la evaluación de Query tiene éxito, la variable Result se instancia con todas las sustituciones posibles que hacen que Query sea verdadero. La utilización de estas primitivas permite la comunicación tanto de agentes integrantes de una misma comunidad, como la comunicación entre agentes de comunidades distintas. Es decir, es posible tener un grupo de agentes compartiendo conocimiento mediante un blackboard donde uno o más de esos agentes tienen la capacidad de comunicarse con agentes externos a su comunidad (que no conocen de la existencia del blackboard). Por medio del envío de mensajes a agentes remotos, este agente externo puede, indirectamente, utilizar el conocimiento del agente con el que se comunica. Este agente, al ser parte de la comunidad del blackboard utiliza en su razonamiento el contenido del mismo. La figura A.3 muestra un sistema de múltiples comunidades de agentes compartiendo conocimiento y la comunicación intercomunidad dada a partir de la comunicación entre pares de agentes. 93 JavaLog Figura A.3: Sistema de múltiples comunidades de agentes Así, por ejemplo, la figura A.4 muestra al agente comerciante que intenta comprar algunos elementos en un repositorio de artículos. Este repositorio contiene ofertas publicadas por varios agentes vendedores en forma de módulos lógicos. Figura A.4: Interacción entre agentes La administración del repositorio está en manos de un agente intermediario. Cuando el agente comerciante se comunica con el coordinador, le realiza una consulta de la forma: rcall( //blackboardManager, article(Type, Offer)). Luego, el intermediario ejecuta la consulta en su base de conocimiento (el blackboard) e instancia la variable Offer con el resultado de su búsqueda. A partir de este resultado, el agente comerciante lo compara con sus preferencias y decide la compra. En esta consulta al coordinador, el agente podría utilizar la primitiva rsolutions: rsolutions( //blackboard, article(Type, _ ), ListOfOffers) 94 JavaLog De esta forma, el agente comerciante obtiene un conjunto de artículos que satisfacen la consulta. Luego, debe elegir de acuerdo a sus preferencias, cuál es la más apropiada. 95 Glosario de Términos Agente móvil: Entidad autónoma con capacidades comportamentales y con un conocimiento interno. Se lo puede definir como un componente de software (programa) activo que percibe, razona, se comunica y tiene la capacidad de migrar de un sitio a otro. Broker: Funciona como intermediario, permitiendo la comunicación entre diferentes componentes de software distribuidos en una red. Código en demanda: Paradigma de redes de computación. El cliente posee los recursos necesarios para la ejecución de un servicio, pero no sabe como usarlos para realizar dicho servicio. El código es obtenido de un servidor remoto. Este esquema es utilizado por los applets o por el mecanismo de pasaje de parámetros de RMI (en Java). CORBA: “Common Object Request Broker Architecture” es una arquitectura y especificación para crear, distribuir y administrar objetos distribuidos en una red. Permite que programas en diferentes lugares de la red se comuniquen en una red a través de una interfase común. DCOM (Distributed Component Object Model): Es un conjunto de interfaces en las cuales los objetos del programa cliente puede pedir servicios de programas servidores en otras computadoras dentro de una red. DCOM es generalmente equivalente a CORBA en cuanto a que provee un conjunto de servicios distribuidos. Espacio de datos (o estado): Es el conjunto de asociaciones de los recursos que están siendo compartidos con otros agentes. En la mayoría de las implementaciones de Java, esta constituido por los objetos asociados al agente. Estado de ejecución: El control y los datos ejecución. internos asociados a la unidad de Evaluación remota: Paradigma de redes de computación. El cliente tiene conoce como realizar el servicio, pero carece de los recursos necesarios, los cuales tiene el servidor. Luego de recibir el código en el servidor, la interacción procede como en el paradigma cliente-servidor, con el código accediendo a los recursos, ahora locales, y Glosario de Términos enviando los resultados de vuelta al cte.. Ejemplos: shells remotos y servidores SQL. Groupware: Se refiere a los programas que ayudan a la gente a trabajar colaborativamente mientras que pueden encontrarse físicamente apartadas entre ellas. Linkeo remoto dinámico (remote dynamic linking): Es la habilidad de resolver el nombre de una clase en tiempo de ejecución recuperando el bytecode de un nodo remoto y linkeándolo en el nodo local. Esta técnica está soportada por Java por el hecho de que el class loader es programable. Marshalling: Proceso de reunir datos de una o más aplicaciones en un mensaje y, organizar y convertirlos a un formato apropiado para el receptor del mensaje. Es usualmente requerido para el intercambio de mensajes entre aplicaciones escritas en diferentes lenguajes y/o corriendo en plataformas cuya representación interna de los datos es diferente entre sí. Migración débil: Los sistemas que soportan movilidad débil permiten la transferencia de código de aplicación de o hacia un sitio diferente. En el destino, el código puede ser corrido en una nueva unidad de ejecución o puede ser ligado a una existente. Comienza su ejecución desde el principio. Migración fuerte: Los sistemas que soportan movilidad fuerte permiten a una unidad de ejecución moverse como un todo, reteniendo su estado de ejecución. La migración es transparente, en el sentido de que la unidad de ejecución continúa en el nuevo sitio en la instrucción siguiente a la que disparó la migración. ORB (Object Request Broker): Es la lógica que actúa de intermediario entre un pedido del cliente de un servicio y la respuesta de dicho servicio. RMI (Remote Method Invocation): Se podría ver como la versión Java de RPC. RPC (Remote Procedure Call): Llamado a Procedimiento Remoto es un protocolo que un programa puede usar para pedir un servicio a un programa ubicado en otra computadora. RPC utiliza el modelo cliente / servidor; el programa que pide el servicio es el cliente y el programa que provee el servicio es el servidor. Al igual que un llamado a una función local, RPC es una operación síncrona. Sistemas Middleware: Un Sistema Middleware es software que conecta dos aplicaciones separadas. El término middleware es usado para describir productos separados que sirven como pegamento entre dos aplicaciones. 97 Glosario de Términos Stub: Es un programa pequeño que sustituye a uno más grande, para que sea posiblemente cargado más tarde o que esté ubicado en un sitio remoto. Unidad de ejecución: Las unidades de ejecución representan flujos de computación. Los ejemplos típicos son procesos de un solo thread o threads individuales de un proceso con múltiples threads. Workflow: Es un termino usado para describir las tareas, pasos, organizaciones o personas involucradas, información de entrada y de salida, y las herramientas necesarias en cada paso de un proceso de negocios. 98 Referencias Bibliográficas [AdAstra 99] AdAstra Engineering, Inc. “Jumping Beans white paper” http://www.JumpingBeans.com , 1999. [Amandi et al. 99] A. Amandi, A. Zunino, R. Iturregui. Multi-paradigm Languages Supporting Multi-Agent Development. Multi-Agent System Engineering, 9a European Workshop on Modelling Autonomous Agents in a Multi-Agent World, MAAMAW'99, pp 128-139, 1999. [Bellavista 99] P. Bellavista and A. Corradi and C Stefanelli. A secure and open mobile agent programming environment. The Fourth International Symposium on Autonomous Decentralized Systems: Integration of Heterogeneous Systems, pp 238-245, 1999. [Belloni-Campo 01] E. Belloni, M. Campo. BrainLets: Dynamic Inferential Capabilities for Agent-based Web Systems. Revista Iberoamericana de Inteligencia Artificial. No. 13, pp 108-0114, 2001. http://aepia.dsic.upv.es/revista/numeros/13/belloni.PDF [Berners-Lee et al 98] Tim Berners-Lee, Roy T. Fielding, Larry Masinter. Uniform Resource Identifiers (URI): Generic Syntax and Semantics, RFC 2396, 1998. [BNF 02] def. Bakus Nour Form [Box 00] D.Box et al.. “Simple Object Access Protocol (SOAP) 1.1”. W3C Note May 2000 http:///www.w3.org/TR/SOAP. [CAgents 99] FTP Software, “CyberAgents” http://wwwftp.com/cyberagents/ [Carriero-Gelernter 89] D.Gelernter, P.Carriero, “Transactions in Linda” Languajes Syst. 1989 [Chess 95] David Chess, Benjamin Grosof, Colin Harrison, David Levine, Colin Paris, Gene Tsudik. Itinerant Agents for Mobile Computing, IBM Research Report, RC 20010, 1995. http://www.research.ibm.com/massdist/rc20010.ps [Christensen 01] E. Christensen et al. “Web Services Description Languaje (WSDL) 1.1”. W3C Note March 2001. http:///www.w3.org/TR/wsdl . [Crocker et al 82] Crocker, Vittal, Progran y Henderson. Standard for the format of ARPA internet text mssages, RFC 822, 1982. [Darmouth 88] Darmouth College. “D’agents: mobile agents at Darmouth College”. http://www.es.darmouth/edu/~agent/. 1988 [DeSchon, Braden 88] A. DeSchon, R. Braden. Background File Transfer Protocol, RFC 1068, 1988. [FIPA 97] Foundation for Intelligent Physical Agents (FIPA), FIPA 97 Specification, Version 2.0, Part2, Agent Communication Languaje , 1998. http://wwwdrogo.cselt.stet.it/fipa/spec/fipa97/fipa97.htm. [Freeman 96] E.Freeman, “Linda group”, http://www.cd.yale.edu/HTML/YALE/CS/Linda/linda.html. 1996 en ACM Trans.Programming Referencias Bibliográficas [Fuggetta 98] Alfonso Fuggetta and Gian Pietro Picco and Giovanni Vigna. Understanding Code Mobility, IEEE Transactions on Software Engineering, Vol 24, No. 5, pp 342-361, 1998. [Fukunaga 86] K. Fukunaga, S.Hirose. ”An Experience with a Prolog-Based Object Oriented Languaje”. Proc.OOPSLA’86 Conference. 1986. [Gelernter 85] D.Gelernter, “Generative communications in Linda” ACM Trans.Programming Languajes Syst. Vol.7 nº1. 1985. [Genesereth – Ketchpel 94] M.R.Genesereth, S.P.Ketchpel, ”Software Agents”, Communications of the ACM, 37(7):48-53. 1994 [Gral.Magic 95] General Magic, Inc. Tabriz Ware, 1995 http://www.genmagic.com/Tabriz/. [Gral.Magic 97] General Magic, Inc. Odyssey Product Information, 1997 http://www.genmagic.com/agents/odyssey.html [Gray 00] Robert S. Gray, David Kotz, George Cybenko, Daniela Rus. “Mobile Agents: Motivations and State-of-the-Art Systems”. Dartmouth College, Computer Science, TR2000-365, 2000. ftp://ftp.cs.dartmouth.edu/TR/TR2000-365.ps.Z [Gray 95] R.Gray, “Agent Tcl: a transportable agent system”, en Proc. CIKM Workshop Intell Inform Agents (CIKM’95). 1995 [Hattori 99] Fumio Hattori, Takeshi Ohguro, Makoto Yokoo, Shigeo Matsubara, Sen Yoshida. “Socialware: multiagent systems for supporting network communities.” Communications of the ACM, Vol 42, No. 3, pp 55-61, 1999. http://www.acm.org:80/pubs/citations/journals/cacm/1999-42-3/p55-hattori/ [IBM 97] IBM Research, IBM Aglets software development kit, “Technical Report home page, Tokio Research Laboratory, Japan, 1997 http://www.ibm.co.jp/trl/aglets. [IKV++ 98] IKV++ GmbH, “GrassHopper, an intelligent mobile agent platform written in 100% pure Java”, 1998. [Ishikawa 86] Y.Ishikawa, M.Tokoro. “ A Concurrent Object-Oriented Knowledge Representation Languaje Orient84/K: It’s features and implementation”. SIGPLAN Notices, 21 (11): 232-241.. 1986 [Karnik - Tripathi 98] N.Karnik, A.R.Tripathi. “Design Issues in Mobile Agent Programming Systems”. IEEE Concurrency, Vol.6, nº3. 1998. [Kotz 99] Robert S. Gray, David Kotz, George Cybenko, Daniela Rus. Mobile Agents: Motivations and State-of-the-Art Systems. Dartmouth College, Computer Science, 2000. ftp://ftp.cs.dartmouth.edu/TR/TR2000-365.ps.Z [Labrou - Finn 97] Y.Labrou, T.Finn, “A Proposal for a New KQML Specification”. Technical Report CS97-03, Computer Science and Electrical Engineering Department, University of Maryland, Baltimore 1997. [LaForge et al. 98] W.LaForge, D.Milojicic y D.Chauhan. “Mobile objects and agents, design, implementation and lessons learned”. IEEE Vol.5. 1998 Danny B. Lange, Mitsuru Oshima. Programming and Deploying Mobile Agents with Java Aglets. Addison-Wesley, pp xxiv + 225. isbn 0-201-32582-9. 1998. [Lange 98] [Lange 99] Danny B. Lange, Mitsuru Oshima. Seven good reasons for mobile agents. Communications of the ACM, Vol 42, No. 3, pp 88-89, 1999. http://www.acm.org:80/pubs/citations/journals/cacm/1999-42-3/p88-lange/ [Lange-Oshima 98] D.Lange y M.Oshima. “Programming and Deploying Java Mobile Agents with Aglets.” Adisson-Wesley, 1998 100 Referencias Bibliográficas [Lingnau et al. 95] A.Ligneau, O.Drobnik y P.Domel, “An HTTP-based infraestructure for mobile agents, WWW J, (Fourth Int.WWW Conf.). Diciembre 1995 [Mello 86] P.Mello, A.Natali. “Objects as Communicating Prolog Units”. En Proceedings of ECOOP’87, European Conference on Object-Oriented Programming. 1987. [Milojicic et al. 98] D.Milojicic et al.”MASIF, the OMG mobile agent system interoperability facility” en nd Proc.2 Int. Worshop Mobile Agents, 1998. Mitsubishi Electric ITA, “Concordia” http://www.meita.com/HSL/Projects/Concordia. 1999. [Mitsubishi 99] [ObjectSpace 99] ObjectSpace, Inc. “The ObjectSpace Voyager Universal ORB” http://www.objectspace.com, 1999. [Park-Leuker 97] A.Park, S.Leuker, “A multi-agent architecture supporting services Accesses”, en Mobile Agents’97, Lecture Notes in Computer Science 1219, Springer-Verlag, 1997. [Rational 97] UML Notation Guide, Rational Software, 1997, Rational Software. [Rodrigues Silva et al. 97] A. Rodrigues Silva, M.Mira da Silva y J.Delgado. “A survey of web information systems”. Proc. World Conference WWW, internet & intranet.(WebNet’97), Toronto, Canadá, Noviembre de 1997. [Rodrigues Silva et al. 98] A.Rodrigues Silva, M. Mira da Silva y J.Delgado, ”AgentSpace: an implementation of a next-generation mobile agent system” en Proceedings of Mobile Agents ’98, Stuttgart, Germany. Lecture Notes in Computer Science 1477, springer-Verlag. 1998 [Rumbaugh et al 99] James Rumbaugh, Ivar Jacobson y Grady Booch. The Unified Modeling Language Reference Manual, Addison-Wesley, First Edition, 1999. [Shoham 97] Yoav Shoham. An Overview of Agent-Oriented Programming. Software Agents, AAAI Press / The MIT Press. pp 217-290, 1997. [Strasser 96] Strasser M., Baumann J., Hohl F., 1996. “Mole: A Java-based mobile object system”. nd Proc. 2 ECOOP Workshop Mobile Object System, Dpunkt. [Strasser et al. 96] M.Strasser, J.Baumann y F.Hohl, “Mole: A Java-based mobile object system” en nd Proc.2 ECOOP Workshop Mobile Object Syst. Dpunkt. 1996. [UDD1 00] UDD1 Consortium, “UDD1 Technical White Paper”. September 2000 http://www.udd1.org/. [WHA 03] http://whatis.com [White 94] J.White.”Telescript technology: The foundation for the electronic marketplace”. Technical report, General Magic. Inc. 1994 [White 97] J.White.”Telescript technology: An introduction to the language.” J.Bradshaw (ed). Software Agentes. AAAI MIT Press 1997. [White 98] J.White, “Personal communication, 1998” en Mobility: Process, Computers and agents. D.Milojicic, F.Douglis and R.Wheler (Eds) Addison-Wesley 1999. [WM 05] http://webmacro.org [Wong 97] Wong D., Paciorek N., Walsh T., DiCelie J., Young M., Peet B., 1997. “Concordia: An infrastructurefot collaborating mobile agents”. Proc.First Int. Workshop on Mobile Agents. [Wong 99] David Wong, Noemi Paciorek and Dana Moore. Java-based Mobile Agents. Communications of the ACM, Vol 42 No 3, pp 92-102, 1999. http://www.acm.org/pubs/articles/journals/cacm/1999-42-3/p92-wong/p92-wong.pdf [Wong et al. 97] D.Wong, N.Paciorek, T.Walsh, J.DiCelie, M.Young y B.Peet, “Concordia: An infraestructure for collaborating mobile agents”, en Proc. First Int. Workshop on Mobile Agents, 1997. 101 Referencias Bibliográficas [Wooldridge 99] M. Wooldridge. Intelligent Agents. Multiagent Systems, The MIT Press, 1999. [Woolridge – Jennings 95] M.Woolridge, N.Jennings, “Intelligent agents: Theory and practice”. Knowle. Eng.Rev. vol.10 nro.5. 1995 [XML 98] World Wide Web Consortium, “Extensible markup languaje (XML)” http://www.w3c.org/, 1998. [Zunino 01] Alejandro Zunino, Luis Berdún, Analía Amandi. JavaLog: un Lenguaje para la Programación de Agentes. Revista Iberoamericana de Inteligencia Artificial, No. 13, pp 94-99. sin 1337-3601. 2001. [Zunino 99] Zunino A., Iturregui R., Amandi A., ”Javalog: una integración de objetos y lógica para la programación de agentes”. Instituto ISISTAN, Universidad Nacional del Centro de la Pcia. de Bs. As. 1999. 102