Dinamicidad en Sistemas Multiagente basados en THOMAS
Full text
Dinamicidad en Sistemas Multiagente basados en THOMAS Autor: Alfonso Antonio Machado Benito Director: Vicente J. Juli´an Inglada Titulaci´on: Ingenier´ıa Inform´atica 06, 2011
2
Agradecimientos Agradezco a toda la gente que ha estado conmigo en estos ´ultimos seis a˜nos. A todos mis amigos por todos esos buenos y malos momentos que hemos vivido. A Vicente Botti por ofrecerme la oportunidad de entrar a formar parte del GTI. La paciencia de Natalia, Elena, Juan ´ Angel, Sergio Pajares, Mario y especialmente Joan, por aguantar todas mis preguntas. A mis compa˜neros del frikilab por aguantarme como su compa˜nero de laboratorio. A mi director, Vicente Juli´an, por toda la dedicaci´on que ha tenido conmigo. A mi madre, que ha hecho que tenga que preocuparme durante toda la carrera de solamente estudiar y trabajar. Finalmente, a Leti, que ha estado conmigo en los peores y mejores momentos a lo largo de esos m´as de dos a˜nos y medio. Gracias. Alfonso Machado 3
4
´ Indice general ´ Indice general 5 1. Introducci´on y objetivos 7 2. Plataforma para Sistemas Multiagente 11 2.1. Sistemas Multiagente ....................... 12 2.2. Organizaciones Virtuales ..................... 12 2.3. THOMAS ............................. 14 2.3.1. Platform Kernel ...................... 15 2.3.2. Organization Management System ........... 15 2.3.3. Service Facilitator ..................... 20 2.4. Magentix2 ............................. 23 2.4.1. Infraestructura de comunicaci´on ............. 25 2.4.2. Servicio de traza ..................... 26 2.4.3. Seguridad ......................... 26 2.4.4. Conversaci´on entre agentes ................ 27 2.4.5. Framework THOMAS .................. 27 2.4.6. Jason y J-Moise ...................... 27 2.4.7. Desarrollo ......................... 28 2.4.8. Instalaci´on ......................... 28 3. Dinamicidad en THOMAS/Magentix2 29 3.1. Estudio de la dinamicidad .................... 30 3.2. Caso de estudio .......................... 31 3.2.1. Estructura ......................... 31 3.2.2. Agentes .......................... 35 3.2.3. Escenarios ......................... 36 3.3. Pruebas .............................. 38 3.3.1. Requisitos iniciales .................... 38 3.3.2. Ejecuci´on de los distintos escenarios ........... 39 5
6´ INDICE GENERAL 4. Conclusiones 71 Ap´endices 74 A. Prueba unitaria de Magentix2 y THOMAS 77 Bibliograf´ıa 105
Cap´ıtulo 1 Introducci´on y objetivos 7
8CAP´ ITULO 1. INTRODUCCI ´ ON Y OBJETIVOS Actualmente, hay una clara tendencia en el uso de m´etodos y herramientas que permiten desarrollar Sistemas Multiagente (MAS) capaces de ofrecer dinamicidad en las organizaciones, permiti´endoles as´ı modificar su comportamiento al detectar cambios en el entorno. Las Organizaciones Virtuales (VO) [6] son entendidas como una forma de modelar sistemas tomando un punto de vista sociol´ogico. Dichas organizaciones est´an basadas en el principio de cooperaci´on en negocios sobre redes abiertas, el cual versa sobre la ayuda entre los participantes para obtener un objetivo com´un o mayor [3] [6]. La principal ventaja que obtenemos al aplicar este principio es que nos provee de elementos que nos aportan flexibilidad y, adem´as, capacidad de respuesta r´apida. Por todo ello obtenemos un mejor servicio y logramos en consecuencia una mayor satisfacci´on del cliente al obtener un mejor servicio. Una cualidad a resaltar de las Organizaciones Virtuales cuando se usan Sistemas Multiagente (MAS) es la de que los sistemas son modelados con un nivel alto de abstracci´on. De este modo, la separaci´on entre el mundo real y los modelos de sistemas se reduce considerablemente. Adem´as, este tipo de sistemas facilita la implementaci´on de sistemas abiertos y heterog´eneos [11]. Las Organizaciones Virtuales no deben solamente permitir describir aspectos de la estructura del sistema (funciones, grupos de agentes, interacci´on y patrones de relaci´on entre roles) y aspectos del comportamiento funcional (tareas de los agentes, planes o servicios), sino tambi´en describir el comportamiento de las normas que deben seguir los agentes, la entrada y salida de los componentes din´amicos y su formaci´on, tambi´en din´amica. Dadas las caracter´ısticas de estos sistemas abiertos, y atendiendo especialmente a su faceta de dinamismo, es esencial encontrar una aproximaci´on que soporte la evoluci´on de estos sistemas y facilite el crecimiento y actualizaci´on de ellos en tiempo de ejecuci´on. De acuerdo a estas necesidades se ha desarrollado THOMAS (MeTHods, Techniques and Tools for Open Multi-Agent Systems) [5] [8] [1], una arquitectura MAS para Organizaciones Virtuales, especialmente enfocada a soportar dinamicidad en las organizaciones de agentes basada en la plataforma Magentix2 como Platform Kernel de la arquitectura THOMAS para soportar los agentes que se ejecutar´an. El objetivo de este Proyecto Final de Carrera, el cual se encuentra dentro del trabajo de investigaci´on del proyecto Consolider Ingenio (CSD200700022), Agreement Technologies y del proyecto del Ministerio de Ciencia e Innovaci´on (TIN2009-13839-C03-01) Organizaciones Virtuales Adaptativas: Arquitecturas y M´etodos de Desarrollo, consistir´a en demostrar que el binomio THOMAS/Magentix2 es una plataforma que permite ofrecer dinamicidad en los Sistemas Multiagente (MAS), constituyendo un paso, y la base, con la que se puede empezar a trabajar en Sistemas Adaptativos. Esto es, sistemas que por si solo son capaces de adaptarse a cualquier evento que ocu-
9 rra de tipo estructural (una organizaci´on desaparece, se deja de ofrecer un servicio, etc) y funcional (como, por ejemplo, nuevos servicios). Este objetivo principal se divide en los siguientes subojetivos: Estudio de la plataforma de Magentix2 como software que soporta Sistemas Multiagente. Estudio del framework THOMAS como software que ofrece Organizaciones Virtuales a los Sistemas Multiagente. Caracter´ısticas que debe cumplir el framework para ofrecer dinamicidad en las Organizaciones Virtuales de los Sistemas Multiagente. Dise˜no de un caso de estudio junto con un conjunto de escenarios que verifiquen los diferentes aspectos que permiten la dinamicidad en las Organizaciones Virtuales. Implementaci´on de los escenarios dise˜nados para verificar las propiedades din´amicas de las Organizaciones Virtuales. Ejecuci´on de los diferentes escenarios dise˜nados para comprobar la dinamicidad de la plataforma comentada anteriormente. Ejecuci´on y validaci´on de los resultados obtenidos. El caso de estudio que hemos desarrollado consiste en un mercado de turismo. Este mercado ofrece un entorno para que distintos agentes puedan crear agencias de viajes y ofrecer sus servicios (b´usqueda de hoteles, vuelos, tren, etc), que cualquier agente pueda ofrecer determinado servicio y que los clientes puedan buscar y utilizar los distintos servicios ofrecidos por las agencias. Adem´as, al usar la plataforma THOMAS/Magentix2 se pretende verificar que todos los m´etodos funcionan correctamente, que la plataforma es estable, que la comunicaci´on entre ella y otras plataformas funciona, encontrar posibles errores, mejorar aquellos aspectos que se consideren oportunos desde el punto de vista del desarrollador y tambi´en verificar la especificaci´on de THOMAS/Magentix2. En primer lugar, en el capitulo 2haremos una breve explicaci´on de que son los Sistemas Multiagente, Organizaciones Virtuales y explicaremos las tecnolog´ıas THOMAS y Magentix2. En la secci´on 3.1, explicaremos lo que es dinamicidad, c´omo conseguirla y qu´e esperamos que tengan las tecnolog´ıas anteriores para que se pueda decir que ofrecen dinamicidad en los Sistemas Multiagente. A continuaci´on, en la secci´on 3.2 haremos una descripci´on del caso de estudio, Mercado de Turismo, donde explicaremos los agentes que
16 CAP´ ITULO 2. PLATAFORMA PARA SISTEMAS MULTIAGENTE Borrar unidad. Elimina una determinada unidad de la lista de unidades activas, s´olo si el agente que la crea tiene el rol creator y es el ´unico agente dentro de la unidad. Borrar una unidad del sistema implica que ha habido un cambio en la estructura del sistema como que una entidad ha sido borrada debido a alg´un evento. Esto es un claro ejemplo de las posibilidades un sistema din´amico. Para borrar una unidad hay que usar el m´etodo DeregisterUnit al cual se le pasa por par´ametro el identificador de la unidad. La ejecuci´on de este m´etodo se har´ıa de la siguiente forma: String result = null; try { // Deregister main unit : TourismMarket result = OMSservices . DeregisterUnit (" TourismMarket "); } catch ( Exception e) { logger . error (e. getMessage ()); } Registrar rol. Registrar un rol dentro de una organizaci´on a˜nade un nuevo rol a la lista de roles que tiene una organizaci´on asociados. Esto permite que los agentes puedan adquirir un papel dentro de la organizaci´on el cual tendr´a asociado una serie de caracter´ısticas como se ha mencionado anteriormente. Para registrar un rol hay que ejecutar el m´etodo registerRol pasandole por par´ametro el nombre del rol que se desea crear, la unidad a la que pertenecer´a, el tipo de visibilidad, la posici´on del rol en la unidad, la privacidad del rol y de que rol hereda. La forma de ejecutarlo ser´ıa como a continuaci´on: String result = null; try { // Register new role : MarketManager result = OMSservices . registerRole (" MarketManager ", " TourismMarket " ," external " ," supervisor " ," private ", " member "); } catch ( Exception e) { logger . error (e. getMessage ()); } Borrar rol. Elimina el correspondiente rol de la lista de roles que tiene asociado una organizaci´on. A partir de ese momento ning´un otro agente podr´a desempe˜nar ese rol. Para poder realizar esta acci´on, no tiene que haber ning´un agente que desempe˜ne ese rol, ni ninguna norma que haga referencia a ese rol, ya que dejar´ıa el sistema inconsistente. Para borrar un rol se tiene que ejecutar el m´etodo deregisterRole al que se le pasa
2.3. THOMAS 17 por par´ametro el identificador del rol que se desea eliminar. Se ejecuta como a continuaci´on: String result = null; try { // Deregister role : MarketManager result = OMSservices . DeregisterRole (" MarketManager "); } catch ( Exception e) { logger . error (e. getMessage ()); } Registrar norma. A˜nadir un nueva norma al sistema. El m´etodo a usar es registerNorm y a˜nade una norma a la lista activa de normas del sistema. Cuando la norma se a˜nade tiene que cumplirse a partir de ese momento. Al m´etodo se le pasa un identificador de la norma a a˜nadir y la norma a a˜nadir. La forma de invocar el m´etodo es la siguiente: String result = null; try { // Register a norm : Only one Payee result = OMSservices . registerNorm (" norm1" " FORBBIDEN ... acquireRole_MESSAGE (...( ROLE_ ’Payee ’))"); } catch ( Exception e) { logger . error (e. getMessage ()); } Borrar norma. Eleminar una norma de la lista de normas activas del sistema. El m´etodo es deregisterNorm y se le pasa como par´ametro el identificador de la norma a eliminar. La forma de usarlo ser´ıa: String result = null; try { // Deregister norm : only one Payee result = OMSservices . deregisterNorm (" norm1 "); } catch ( Exception e) { logger . error (e. getMessage ()); } Servicios informativos Son servicios que dan informaci´on sobre el estado de las organizaciones. Informe de agente. Este m´etodo permite saber que roles y en que unidad desempe˜na un agente en ese momento. El m´etodo es informAgentRole y se le pasa por par´ametro el identificar del agente que se desea saber esa informaci´on. Un ejemplo de la ejecuci´on ser´ıa:
18 CAP´ ITULO 2. PLATAFORMA PARA SISTEMAS MULTIAGENTE ArrayList < String > result = null ; try{ result = informAgentRole ( godAgent . getAid (). toString ()); } catch ( Exception e) { logger . error (e. getMessage ()); } Informe de miembros. Un agente ejecuta este m´etodo cuando desea conocer las entidades que pertenecen a una unidad. Se le puede indicar un rol de la unidad y solo las entidades que desempe˜nen ese rol se le mostrar´a su informaci´on. Un agente solo podr´a usar este servicio dependiendo del tipo de unidad: si es FLAT el agente podr´a usarlo, si es TEAM solo podr´a hacerlo si pertenece a la organizaci´on y si es HIERARCHY s´olo podr´a si desempe˜na el rol supervisor. El m´etodo es informMembers y se le pasa el rol y la unidad del que se desean conocer sus entidades. Un ejemplo de su ejecuci´on es: ArrayList < String > result = null ; try{ result = informMembers (" MarketMananger ", " TourismMarket "); } catch ( Exception e) { logger . error (e. getMessage ()); } Informe de normas. Un agente invoca este m´etodo cuando desea conocer las normas que est´an asociadas a un determinado rol. El m´etodo que tiene que ejecutar el agente es informRolesNorms y recibe por par´ametro el identificador del rol que quiere conocer las normas asociadas a ´el. Una forma de usarlo ser´ıa como a continuaci´on: ArrayList < String > result = null ; try{ result = informRolesNorms (" Payee "); } catch ( Exception e) { logger . error (e. getMessage ()); } Informe sobre profile. Este m´etodo permite conocer la descripci´on de los servicios que est´an asociados a un determinado rol. El agente que quiera usarlo tiene que invocar el m´etodo informRoleProfile y le pasa como par´ametro el identificador del rol del cual desea conocer la descripci´on de los servicios asociados a ese rol.
2.3. THOMAS 19 ArrayList < String > result = null ; try{ result = informRoleProfiles (" MarketManager "); } catch ( Exception e) { logger . error (e. getMessage ()); } Informe de unidad. Un agente ejecuta este m´etodo cuando desea conocer la descripci´on de una unidad. El m´etodo es informUnit y se le pasa por par´ametro la unidad de la que se desea conocer sus detalles. Una posible implementaci´on ser´ıa: ArrayList < String > result = null ; try{ result = informUnit (" Agency1 "); } catch ( Exception e) { logger . error (e. getMessage ()); } Informe de unidades y roles. Este m´etodo es usado por un agente cuando desea conocer la lista de roles que han sido registrados dentro de una unidad. Un agente podr´a invocar este m´etodo dependiendo del tipo de unidad: si la unidad es FLAT podr´a hacerlo y si es TEAM oHIERARCHY si y s´olo si es miembro de la unidad. El m´etodo es informUnitRoles y se le pasa por par´ametro la unidad de la que se desea conocer la lista de roles que est´an asociados a ella. Una posible invocaci´on del m´etodo ser´ıa: ArrayList < String > result = null ; try{ result = informUnitRoles (" MarketManager ") } catch ( Exception e) { logger . error (e. getMessage ()); } Servicios din´amicos Estos servicios permiten la gesti´on de la entrada y salida de los agentes en el sistema. Adquirir rol. Desempe˜nar un rol dentro de una organizaci´on implica que el agente que va a realizar esta acci´on podr´a realizar ciertas tareas asociadas a ese rol, y/o que va a ocupar cierto rango dentro de la
20 CAP´ ITULO 2. PLATAFORMA PARA SISTEMAS MULTIAGENTE organizaci´on. Un agente puede tener varios roles, pudiendo desempe˜nar varias labores dentro de una organizaci´on o incluso poder tener distintos rangos en el sistema. El m´etodo que lo hace es acquireRol y se le pasa por par´ametro el rol que quiere desempe˜nar y la unidad en la cual va a adquirir ese rol. La forma de usarlo es como a continuaci´on: String result = null; try { // Acquire MarketManager role inside TourismMarket unit result = OMSservices . acquireRole (" MarketManager ", " TourismMarket "); } catch ( Exception e) { logger . error (e. getMessage ()); } Dejar rol. Dejar de desempe˜nar un papel dentro de una organizaci´on implica que un agente ha decidido dejar de jugar un rol dentro de una unidad, y todo lo que con ello implique, como cumplir ciertas normas, o poder ofrecer determinados servicios. El m´etodo que permite esto es leaveRole y se le pasa por par´ametro el rol que se quiere dejar de jugar y la unidad en la que est´a ese rol. La forma de usarlo es como a continuaci´on: String result = null; try { // Dejar result = OMSservices . leaveRole (" member ", " virtual "); } catch ( Exception e) { logger . error (e. getMessage ()); } 2.3.3. Service Facilitator Es el encargado de gestionar los servicios para facilitan su publicaci´on y descubrimiento de ´estos por los clientes potenciales. Para una mayor comprensi´on, puede ser entendido como un servidor de p´aginas amarillas. El SF es una redefinici´on del DF tradicional de FIPA, siendo ahora capaz de hacer frente a los servicios de un modo mas trabajado, siguiendo las directrices de la Arquitectura Orientada a Servicios (SOA). Hace frente a la limitaci´on del tradicional Directory Facilitator (DF) de FIPA considerando informaci´on sem´antica, composici´on de servicios, as´ı como los roles, objetivos y duraci´on de los servicios.
2.3. THOMAS 21 El SF proporciona un conjunto de servicios est´andares para la gesti´on de las funcionalidades de organizaciones y agentes. El SF est´a clasificado en dos partes: registro y descubrimiento. Registro Estos servicios permiten a˜nadir, modificar y eliminar servicios del directorio del Service Facilitator (SF). Registar profile. El a˜nadir una descripci´on de servicio ( Profile Description ) en el Service Facilitator (SF) conlleva, a˜nadir una nueva entrada en el SF de la lista de servicios que se necesitan, usan o requiere el sistema. A˜nadir la descripci´on del servicio implica que se pueda buscar el servicio y averiguar si alguien lo ofrece o no, para ejecutarlo o a˜nadirse como proveedor. Para a˜nadir un profile al SF se ejecuta el m´etodo registerProfile que se le pasa como par´ametro el profile del servicio. El m´etodo se ejecuta de la siguiente forma: String result = null; try { result = SFservices . registerProfile ( NewClientProfile ); } catch ( Exception e) { logger . error (e. getMessage ()); } Eliminar profile. Este m´etodo se usar´a cuando un agente el cual hab´ıa necesitado la implementaci´on de un servicio que ´el no pod´ıa ofrecer, decida borrarlo porque ya no lo necesita, o porque alguien en el sistema considere que ya no es necesario. Ejecutar este m´etodo elimina un Profile Description de la lista de servicios ofrecidos en el sistema. Al eliminarse no se podr´a encontrar ninguna posible descripci´on de ese servicio. Solo se podr´a eliminar el servicio si no hay ning´un proveedor. El m´etodo a usar ser´ıa deregisterProfile y se le pasa como par´ametro el profile que se desea borrar. Un posible ejemplo de su uso ser´ıa: String result = null; try { result = SFservices . deregisterProfile ( NewClientProfile ); } catch ( Exception e) { logger . error (e. getMessage ()); } A˜nadir process. A˜nade una implementaci´on del servicio, descrito en el profile asociado, que ofrece el agente que ejecuta el servicio. La eje-
22 CAP´ ITULO 2. PLATAFORMA PARA SISTEMAS MULTIAGENTE cuci´on de este m´etodo implica que cuando se quiera saber quien implementa determinado servicio, aparezca el agente que ha registrado la implementaci´on del servicio (Process Description). El m´etodo a usar es registerProcess y se le pasa como argumentos el process asociado al profile que se quiere a˜nadir. Un posible uso de este m´etodo ser´ıa: NewClientProcess . setProfileID ( serviceId ); try { result = SFservices . registerProcess ( NewClientProcess ); } catch ( Exception e) { logger . error (e. getMessage ()); } Eleminar process. Este m´etodo elimina una implementaci´on (Process Description) de un servicio que est´e registrado en el Service Facilitator (SF), que era ofrecida por un agente. Al ejecutarse el m´etodo, se elimina al agente que lo ejecuta y a la implementaci´on del servicio de la lista de proveedores del profile asociados al process. El m´etodo que se tiene que usar es removeProvider y se le pasa como par´ametro el process que se quiere eliminar. La forma de usarlo ser´ıa como se muestra a continuaci´on: try { result = SFservices . removeProvider ( NewClientProcess ); } catch ( Exception e) { logger . error (e. getMessage ()); } Descubrimiento Este conjunto de servicios buscan y componen servicios como respuesta de las necesidades del usuario. Buscar servicio. Este m´etodo es ejecutado por un agente cuando desea encontrar alg´un servicio en el sistema. El sistema de b´usqueda que se usa es una b´usqueda sint´actica, es decir, aquellos servicios que tengan relaci´on en su descripci´on de servicio con lo que uno desee buscar ser´an los que se le devuelvan al agente que ha ejecutado la b´usqueda. El m´etodo devuelve al agente una lista de Profile Description donde cada uno de los elementos de esa lista corresponde con un tipo de servicio y una descripci´on del mismo. Un ejemplo de uso se muestra a continuaci´on:
2.4. MAGENTIX2 23 ArrayList <String > outputs = new ArrayList < String >(); String serviceId = null ; String result = null; try { outputs = SFservices . searchService (" NewClient "); } catch ( Exception e) { logger . error (e. getMessage ()); } if ( outputs . size () == 0) { // Not find the service } else { // The service is found // The service id of the first element serviceId = outputs . get (0); } Obtener profile. Un agente ejecuta este m´etodo cuando desea conocer el profile de un servicio determinado. El m´etodo a ejecutar es getProfile y se le pasa por par´ametro el identificador del servicio que se quiere conocer su profile. La forma de usarlo ser´ıa como a continuaci´on: try { URLProfile = SFservices . getProfile (45); } catch ( Exception e) { logger . error (e. getMessage ()); } Obtener process. Este m´etodo se ejecuta cuando un agente desea conocer el process de un servicio determinado para seleccionar un proveedor al que solicitar el servicio. El m´etodo a ejecutar es getProcess y se le pasa por par´ametro el identificador del profile del servicio que se quiere conocer su profile. La forma de usarlo este m´etodo ser´ıa como a continuaci´on: try { providers = SFservices . getProcess (34); } catch ( Exception e) { logger . error (e. getMessage ()); } 2.4. Magentix2 Magentix2 es una plataforma de agentes para Sistemas Multiagente abiertos. Su principal objetivo es acercar esta tecnolog´ıa a dominios reales: nego-
24 CAP´ ITULO 2. PLATAFORMA PARA SISTEMAS MULTIAGENTE cio, industria, log´ıstica, e-comercio, salud, etc. La evoluci´on tecnol´ogica en el ´area de la Tecnolog´ıa de la Inform´atica y la Comunicaci´on ha planteado nuevos retos y requisitos en los sistemas software. Adem´as, la inform´atica se concibe como una parte inherente en la sociedad actual. La tecnolog´ıa de los Sistemas Multiagente tiene algunas caracter´ısticas que indican su potencial para soportar este nuevo paradigma. La dinamicidad en las organizaciones de los agentes, los cuales son capaces de adaptar autom´aticamente su comportamiento con el fin de aprovechar al m´aximo su entorno en un momento dado, se est´a convirtiendo cada vez en algo mas importante. Los factores sociales en las organizaciones de los Sistemas Multiagente son cada vez m´as importantes en la interacci´on de la estructura entre los mundos din´amicos y abiertos El proyecto Magentix2 es una continuaci´on del proyecto Magentix, cuyo objetivo final es extender las funcionalidades de Magentix, ofreciendo nuevos servicios y herramientas que permitan seguridad y optimizar la gesti´on de Sistemas Multiagente abiertos. Por tanto, el objetivo principal Magentix2 es desarrollar una tecnolog´ıa que haga frente a la alta dinamicidad en la topolog´ıa de un sistema y con interacciones flexibles, las cuales son consecuencia natural de los sistemas distribuidos y aut´onomos de sus componentes. En este sentido, la plataforma se ha ampliado con el fin de soportar la interacci´on de los protocolos y las conversaciones, y las interacciones entre las organizaciones de agentes. Finalmente, otro aspecto importante cubiertos por Magentix2 es la seguridad. As´ı hemos desarrollado un modelo de seguridad que incorpora mecanismos de seguridad a bajo nivel y medidas de confianza que complementan los m´etodos de criptograf´ıa cl´asica. Entre otras funcionalidades, Magentix2 incorpora un servicio de traza. Este servicio permite a los agentes publicar o suscribirse a eventos (cambio en alg´un atributo, recepci´on de un mensajes, etc). Por ´ultimo, Magentix2 incorpora el framework THOMAS, permitiendo a los usuarios gestionar aspectos de organizaci´on y servicio con facilidad. Magetinx2 ofrece soporte a tres niveles: organizaciones, interacciones y agentes. Organizaci´on. Tecnolog´ıa y t´ecnicas relacionadas con las sociedades de agentes. Interacci´on. Tecnolog´ıa y t´ecnicas relacionadas con la comunicaci´on entre agentes. Agente. Tecnolog´ıa y t´ecnicas relacionadas con el propio agente (como razonamiento y aprendizaje).
2.4. MAGENTIX2 25 Figura 2.1: Componentes de Magentix2. Con el fin de ofrecer estos niveles de soporte, Magentix2 est´a formado por diferentes componentes (como se puede ver en la imagen 2.1), y ofrece tecnolog´ıas para el desarrollo y ejecuci´on de Sistemas Multiagente. 2.4.1. Infraestructura de comunicaci´on Magentix2 usa AMQP5como protocolo de comunicaci´on entre agentes. Este est´andar abierto est´a dise˜nado para soportar mensajer´ıa segura y de alto rendimiento a trav´es de Internet. Facilita la interoperabilidad entre entidades heterog´eneas. Magentix2 permite que agentes heterog´eneos interact´uen entre s´ı a trav´es de mensajes FIPA-ACL, que se intercambian a trav´es del est´andar de AMQP. Concretamente, Magentix2 usa Apache Qpid6que implementa AMQP. Por tanto, los agentes Magentix2 usan la APR de clientes Qpid para conectarse al servidor Qpid y comunicarse con otros agentes a trav´es de Internet. 5M´as informaci´on en http://www.amqp.org/confluence/display/AMQP/Advanced+ Message+Queuing+Protocol 6M´as informaci´on en http://qpid.apache.org/
32 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 MarketManager member Provider AgencyManager InheritanceOf customer InheritanceOf InheritanceOf InheritanceOf Figura 3.1: Esquema de las roles que hay en el sistema. Roles y unidades En el sistema tenemos los siguientes roles: MarketManager,Provider, AgencyManager ycustomer. En la figura 3.1 se pueden apreciar todos ellos. Member: Este rol es el rol por defecto en toda las unidades. Representa ´unicamente que un agente pertenece a una unidad. No tiene ninguna caracter´ıstica o funcionalidad adicional. MarketManager: Es el rol que desempe˜na el agente GodAgent y s´olo ´el puede jugarlo. Este rol representa al director del Mercado de Turismo y solo el puede ofrecer los servicios de entrada al Mercado (NewAgency, NewClient yNewProvider). Customer: Este rol lo adquieren aquellos agentes que entran al sistema invocando el servicio NewClient. Como su nombre indica, son los clientes, por tanto, representa a aquellos agentes que quieren visitar el Mercado de Turismo para buscar y usar los servicios ofrecidos en ´el. AgencyManager: Este rol representa al director de una agencia de turismo. Est´a presente en cada una de las agencia que se creen en el Mercado, y lo adquiere un agente dentro de una agencia, cuando invoca el servicio NewAgency. Provider: Es el rol que adquiere un agente que invoca el servicio NewProvider porque quiere ofrecer alg´un servicio en el Mercado. Las unidades que se crean en el sistema son TourismMarket,Agency1 y Agency2. En la figura 3.2 se pueden ver.
3.2. CASO DE ESTUDIO 33 Tourism Market Agency1 Agency2 virtual Contains Contains Contains Figura 3.2: Esquema de las unidades que hay en el sistema. Virtual: Es la organizaci´on inicial que hay en el sistema. Y todos los agentes tiene que pertenecer a ella. TourismMarket: Es la organizaci´on principal de nuestro caso de estudio. Es el Mercado de Turismo, en ella se encuentra todas las agencias, clientes y proveedores. Agency1: Es la primera agencia que habr´a en el sistema y estar´a en la situaci´on inicial antes de ejecutar cada uno de los escenarios. En ella estar´a el agente AgencyManager1, ofrecer´a el servicio de SearchCheapHotel y posteriormente necesitar´a el servicio SearchCheapTrain que ser´a ofrecido por el agente ProviderAgent1 el cual entrar´a en la unidad para ofrecerlo. Agency2: Es otra agencia de turismo que se crear´a de forma din´amica, concretamente es uno de los escenarios propuestos. Est´a agencia la crear´a el agente AgencyManager2 y ofrecer´a el servicio SearchCheapFlight Finalmente la figura 3.3 muestra una visi´on general de qu´e unidades hay y qu´e roles hay en cada unidad.
34 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 Tourism Market Agency1 Agency2 virtual Contains Contains Contains MarketManager member AgencyManager Provider AgencyManager Contains Contains Contains Contains Contains customer Contains customer Contains Provider Contains customer Contains Figura 3.3: Esquema de la estructura del sistema. Servicios Los servicios ofrecidos por el rol MarketManager permiten la entrada al Mercado de Turismo y son los siguientes. NewAgency: Servicio que crea la infraestructura necesaria (roles y unidades) para el agente que solicita crear una agencia dentro del Mercado de Turismo. Devuelve al agente la unidad y rol creado para su nueva agencia dentro de la unidad MarketManager. NewClient: Servicio que valida la entrada de un agente cliente al Mercado de Turismo. Devuelve al agente el rol y la unidad, si se le permite entrar, que tiene que adquirir para entrar en el mercado. NewProvider: Servicio que valida la entrada de un agente que quiera ofrecer un servicio dentro del Mercado de Turismo. Devuelve la unidad y el rol que tiene que adquirir para entrar dentro del mercado. El resto de servicios son los que ofrecen las distintas agencias o el proveedor y son los siguientes. SearchCheapHotel. Servicio que es ofrecido por el rol AgencyManager de la organizaci´on Agency1. El sistema de b´usqueda de hotel que implementa es muy b´asico. Se le pasa como argumento, ciudad, pa´ıs, categor´ıa y rango de fechas y nos devuelve el nombre de un hotel.
3.2. CASO DE ESTUDIO 35 SearchCheapFlight. Es ofrecido por el rol AgencyManager de la organizaci´on Agency2. El sistema de b´uqueda de vuelos que implementa es muy b´asico. Se le pasa como par´ametros la ciudad origen, la ciudad destino y rango de fechas y el servicio devuelve la compa˜n´ıa del vuelo, el precio y el n´umero de vuelo. SearchCheapTrain. Lo ofrece el rol Provider dentro de la organizaci´on Agency1. Hace un b´usqueda de trenes muy b´asica. Tiene como par´ametros la ciudad destino y origen y el rango de fechas, el servicio devuelve el tipo de tren, la hora de salida y llegada, la duraci´on del viaje y el precio. 3.2.2. Agentes GodAgent: Es el agente principal del Mercado de Turismo. Es el encargado de ofrecer los servicios de entrada al Mercado de Turismo NewAgency,NewProvider yNewClient, los cuales explicaremos mas abajo. Al entrar al sistema crear toda la infraestructura necesaria para poner en funcionamiento el Mercado de Turismo. Desempe˜na el rol de MarketManager dentro de la unidad TourismMarket. ManagerAgency1: Es el director de la agencia de turismo Agency1 y ofrece el servicio SearchCheapHotel. Juega el rol de AgencyManager dentro de la unidad Agency1. Durante su ejecuci´on decide publicar la descripci´on de un servicio, SearchCheapTrain, el cual, posteriormente, otro agente ofrecer´a dentro de la agencia. AgencyManagerJADE: Es un agente JADE y realiza las mismas funciones que el agente Magentix2 ManagerAgency1 pero desde la plataforma JADE. ManagerAgency2: Al igual que el agente ManagerAgency1, este agente es el director de una agencia de turismo, Agency2, y ofrece el servicio SearchCheapHotel ProviderAgent1: Es un agente Magentix2 que decide entrar en el Mercado de Turismo para ofrecer el servicio SearchCheapTrain el cual necesita la unidad Agency1. Desempe˜nar´a el rol Provider dentro de la unidad Agency1. ClientAgent: Es un agente que entrar´a al Mercado de Turismo y buscar´a, invocar´a un servicio y dejar´a el sistema.
36 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 ClientAgentJADE: Es un agente JADE que realiza la misma funci´on que el agente ClientAgent. 3.2.3. Escenarios Para comprobar la dinamicidad de la plataforma, los distintos servicios y la especificaci´on de THOMAS/Magentix2 hemos dise˜nado distintos escenarios que nos permitan representar las distintas posibilidades que se nos pueden presentar en un sistema din´amico. La situaci´on de inicial del sistema ser´a la que tiene ya creada la unidad principal TourismMarket. Dentro de ella habr´a creado un rol MarketMananger el cual desempe˜nar´a el agente GodAgent. Este agente, a su vez, ofrecer´a tres servicios (NewAgency,NewClient yNewProvider) al exterior que permitan entrar a los agentes externos dentro del mercado, como comentamos anteriormente. Adem´as, en la situaci´on inicial del Mercado de Turismo ya existir´a una agencia, Agency1, en la cual habr´a un agente, AgencyManager1, que desempe˜nar´a el rol de AgencyManager dentro de Agency1 y ofrecer´a el servicio SearchCheapHotel. Una visi´on m´as clara de la situaci´on inicial es la que muestra la figura 3.4. A partir de esta situaci´on, empezaremos a ejecutar (como veremos en la siguiente secci´on) los distintos escenarios, como puede ser crear o borrar nuevas organizaciones o roles, adquirir o dejar roles, etc, y todo ello en tiempo de ejecuci´on. Crear Agencia. El agente AgencyManager2 invocando al servcio New Agency crear´a una nueva agencia, Agency2 y ofrecer´a el servicio Search CheapFlight. De esta forma comprobaremos la creaci´on de una organizaci´on de forma din´amica. Tambi´en probaremos lo mismo, pero usando un agente JADE, AgencyManagerJADE, para comprobar el acceso a la plataforma por un agente externo. Nuevo proveedor. La agencia, Agency1 necesita el servicio Search CheapHotel y lo publica. A continuaci´on, el agente ProviderAgent1 entra en el sistema invocando el servicio NewProvider y ofrece ese servicio. Comprobamos si los agentes pueden publicar la necesidad de alg´un nuevo servicios y si un nuevo agente, al llegar al sistema, es capaz de darse cuenta de esta necesidad y cubrirla. Nuevo cliente. Comprobamos si un agente puede interactuar con la organizaci´on, es decir, entrar, buscar el servicio que necesito, invocar el servicio y dejar la organizaci´on. Para ello, distintos cliente entrar´an
3.2. CASO DE ESTUDIO 37 GodAgent Tourism Market S NewProvider MarketManager S NewAgency S NewClient In Unit Offers Offers Offers Agency1Manager Agency1 In Unit In Unit S Search Cheap Hotel AgencyManager Offers Figura 3.4: Situaci´on inicial del Mercado de Turismo.
38 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 al sistema invocando el servicio NewClient y buscar´an e invocar´an los servicios ofrecidos. Ser´an agentes Magentix2, ClientAgent, y JADE, ClientAgentJADE. Deshacer Agencia. Comprobamos si un agente, de forma din´amica, puede dejar de ofrecer los servicios que ofrece y dejar el sistema debido a alg´un evento. El agente AgencyManager2 decide deshacer la agencia Agency2 y dejar el sistema. Proveedor deja de ofrecer servicio. El agente ProviderAgent1 decide dejar de ofrecer el servicio SearchCheapTrain y dejar el sistema. De esta forma comprobamos que un agente que estaba ofreciendo un servicio pueda dejar de ofrecerlo pero que siga manteniendose la necesidad de ese servicio por parte de esa organizaci´on. Deshacer Mercado de Turismo. En este escenario comprobamos que se puedan eliminar organizaciones y roles que han sido creados previamente y de forma din´amica, es decir, que el agente deshace toda la infraestructura que ha creado antes de dejar el sistema. El agente GodAgent debido a alg´un evento, decide deshacer el Mercado de Turismo. 3.3. Pruebas En esta secci´on vamos a explicar que software necesitamos tener instalado para poder ejecutar los distintos escenarios. Despu´es, explicaremos, m´as detalladamente, en que consiste cada escenario y como ejecutarlos y que resultados hemos obtenido. 3.3.1. Requisitos iniciales Para ejecutar el caso de estudio se necesita tener instalado el siguiente software: MYSQL v 5.2.29. Es el sistema de gesti´on de bases de datos del framework de THOMAS donde se guarda toda la informaci´on sobre las organizaciones, roles, agentes en el sistema, descripci´on e implementaci´on de servicios, etc. JADE v 3.7. Plataforma de Sistemas Multiagente. Se necesita para ejecutar los agentes JADE que usamos para comprobar la interacci´on entra Magentix2 y otras plataformas.
3.3. PRUEBAS 39 Apache Tomcat v 5.5.31. Es el servidor de servicios usado para desplegar los servicios que usamos, tanto los de THOMAS, como los que hemos creado nosotros. Plataforma THOMAS/Magentix2. La plataforma que queremos comprobar su dinamicidad y testear. Servicios del caso de estudio. Son los servicios implementados para el caso de estudio. Son TourismMarket,SearchCheapHotel,Search CheapFlight ySearchCheapTrain, los cuales hay que desplegar en Tomcat. Agentes del caso de estudio. Hay que tener descargado el c´odigo de los distintos agentes que se han implementado para ejecutar los escenarios propuestos. 3.3.2. Ejecuci´on de los distintos escenarios A continuaci´on vamos a detallar como ejecutar los distintos escenarios y mostrar el resultado obtenido en cada uno de ellos. Situaci´on inicial Para crear la situaci´on inicial en la que comenzar a ejecutar los distintos escenarios se necesita tener en ejecuci´on el servidor de bases de datos MYSQL y Tomcat con los servicios antes mencionados. Dado que la prueba consiste en seguir cierto orden en la ejecuci´on de comandos, no se puede automatizar. Los pasos iniciales para reproducir la situaci´on inicial son los siguientes: Reiniciar el servidor Tomcat. Con esto nos aseguramos de que los servicios web est´an limpios. Este paso previo no se hace debido a este test, se hace debido al dise˜no de los servicios de Thomas. Es el mejor modo de asegurarnos que la salida ser´a la misma a la esperada, si todo va bien. Ejecutaremos el lanzador RunMainOrganization el cual lanza los agentes GodAgent yManagerAgency1 que realizan las siguientes acciones cada uno. El agente GodAgent: 1. Entra en THOMAS, es decir, adquiere el rol ”member”dentro de la organizaci´on ”virtual”.
40 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 2. Crea la organizaci´on ”TourismMarket” 3. Crea el rol ”MarketManager”dentro de la organizaci´on ”Tourism Market”. 4. Adquiere el rol ”MarketManager”dentro de la organizaci´on ”Tourism Market”. Convirtiendose en el director de esta organizaci´on. 5. Crea el rol ”provider 2 ”customer”dentro de organizaci´on ”Tourism Market”. 6. A˜nade la descripci´on y la implementaci´on del servicio NewClient, NewAgency yNewProvider. 7. Se queda esperando que alguien invoque sus servicios. Y el agente ManagerAgency1 realiza las siguientes acciones: 1. Entra en THOMAS aquiriendo el rol ”member”dentro de la organizaci´on ”virtual”. 2. Busca el servicio NewAgency y obtiene la descripci´on del servicio. 3. Adquiere el rol que le indica la descripci´on del servicio para invocarlo. 4. Obtiene la lista de proveedores a trav´es de la implementaci´on del servicio. 5. Invoca el servicio NewAgency. 6. Adquiere el rol que le ha devuelto la invocaci´on del servicio para entrar en la agencia que se le ha creado dentro de la organizaci´on ”TourismMarket”. 7. Registra la descripci´on e implementaci´on del servicio SearchCheapHotel. 8. Se queda esperando hasta que alguien invoque su servicio. Al ejecutar el lanzador la salida que obtenemos por terminal es la que se muestra a continuaci´on. [ManagerAgency1] Entrar en THOMAS: Ok [GodAgent]Entrar en THOMAS: Ok [GodAgent]Register Unit TourismMarket result: Ok [GodAgent]Register Role member result: Ok [GodAgent]Register Role MarketManager result: Ok
3.3. PRUEBAS 41 [GodAgent]Acquire Role MarketManager result: Ok [GodAgent]Register Role Payee result: Ok [GodAgent]Register Role provider result: Ok [GodAgent]Register Role customer result: Ok [GodAgent] Register NewClientProfile result: 150 [GodAgent] Register NewClientProcess result: 150@144-qpid://GodAgent@localhost:8080 [GodAgent] Register NewAgencyProfile result: 151 [GodAgent] Register NewAgencyProcess result: 151@145-qpid://GodAgent@localhost:8080 [ManagerAgency1] A~nado mi AID y el nombre de la agencia a crear como parametro: qpid://ManagerAgency1@localhost:8080 , Agency1 [ManagerAgency1] Agente que ofrece el servicio NewAgency: GodAgent [ManagerAgency1] Ejecutamos el servicio. [GodAgent] He recibido una petici´on de mi servicio NewAgency [GodAgent] AGREE [GodAgent] Executing... [Agency1, qpid://ManagerAgency1@localhost:8080] [GodAgent] NewAgency: Registro de la nueva unidad, Agency1: Ok [GodAgent] NewAgency: Registro del nuevo rol AgencyManager: Ok [GodAgent] NewAgency: adquiere el rol el agente creador de la Agencia: {http://localhost:8080/TourismMarket/owl/owls/ NewAgencyProcess.owl#NameUnit=Agency1, http://localhost:8080/TourismMarket/owl/owls/ NewAgencyProcess.owl#AgentID= qpid://ManagerAgency1@localhost:8080}
48 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 ManagerAgency: SearchService =(REQUEST :sender ( agent-identifier :name ManagerAgency@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/ SearchServiceProcess.owl SearchServiceInputServicePurpose=SearchCheapFlight" :protocol fipa-request ) ManagerAgency: OOH! OMS Has agreed to excute the service AcquireRol! ManagerAgency: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> ManagerAgency: OOH! SF Has agreed to excute the service SearchService! (REQUEST :sender ( agent-identifier :name ManagerAgency@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/ RegisterProfileProcess.owl RegisterProfileInputServiceGoal= RegisterProfileInputServiceProfile=http://localhost:8080/ SearchCheapFlight/owl/owls/SearchCheapFlightProfile.owl#SearchCheapFlight" :protocol fipa-request ) ManagerAgency: SF SearchService IDProfile = ManagerAgency: OOH! SF Has agreed to excute the RegisterProfile! ManagerAgency:SF(INFORM :sender ( agent-identifier :name SF@bowser:8081 :addresses (sequence http://bowser.dsic.upv.es:8081 )) :receiver (set ( agent-identifier :name ManagerAgency@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778 )) ) :content "RegisterProfileProcess={http://localhost:8080/sfservices/ SFservices/owl/owls/RegisterProfileProcess.owl# RegisterProfileOutputServiceStatus=1, http://localhost:8080/sfservices/SFservices/owl/owls/ RegisterProfileProcess.owl#RegisterProfileOutputServiceID=15}" :protocol fipa-request :conversation-id C29291718_1290456334963 )
3.3. PRUEBAS 49 (REQUEST :sender ( agent-identifier :name ManagerAgency@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/ RegisterProcessProcess.owl RegisterProcessInputServiceModel= http://localhost:8080/SearchCheapFlight/owl/owls/ SearchCheapFlightProcess.owl#SearchCheapFlightProcess RegisterProcessInputServiceID=15" :protocol fipa-request ) ManagerAgency:SF RegisterProfile has returned URL = 15 ManagerAgency: OOH! SF Has agreed to excute the RegisterProcess! ManagerAgency:SF(INFORM :sender ( agent-identifier :name SF@bowser:8081 :addresses (sequence http://bowser.dsic.upv.es:8081 )) :receiver (set ( agent-identifier :name ManagerAgency@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778 )) ) :content "RegisterProcessProcess={http://localhost:8080/sfservices/ SFservices/owl/owls/RegisterProcessProcess.owl# RegisterProcessOutputServiceModelID= 5@15-ManagerAgency@bowser:1099/JADE, http://localhost:8080/sfservices/SFservices/owl/owls/ RegisterProcessProcess.owl#RegisterProcessOutputServiceStatus=1}" :protocol fipa-request :conversation-id C27253500_1290456338713 ) ManagerAgency: SF RegisterProcess has returned = 15@15-ManagerAgency@bowser:1099/JADE Nuevo proveedor Una de las principales caracter´ısticas de esta plataforma es la posibilidad de que un agente u organizaci´on pueda publicar la necesidad de alg´un servicio. De esta manera y, gracias a la dinamicidad de las entidades en THOMAS, cuando una nueva entidad llega al sistema puede darse cuenta de las necesidades que hay en el sistema. En el siguiente escenario, el agente Agency1Manager ha decidido a˜nadir un servicio de b´usqueda de trenes, SearchCheapTrain, ya que se ha dado cuenta que ese servicio ha sido solicitado muchas veces, pero nadie lo estaba ofreciendo. Para ello, ha a˜nadido la descripci´on del servicio al SF usando el servicio registerProfile.
50 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 GodAgent Tourism Market S NewProvider MarketManager S NewAgency S NewClient In Unit Offers Offers Offers Agency1Manager Agency1 In Unit In Unit S Search Cheap Hotel AgencyManager Offers ProviderAgent Provider S Search Cheap Flight In Unit Offers Agency2Manager AgencyManager S Search Cheap Flight In Unit Offers Agency2 In Unit Figura 3.7: Muestra el nuevo agente proveedor dentro del sistema. Despu´es de esto, el agente ProviderAgent llega al sistema y lo primero que hace es entrar en la unidad Virtual (organizaci´on que existe por defecto en THOMAS). A continuaci´on, invoca el servicio NewProvider y adquiere el rol y la unidad que necesita para entrar en la unidad TourismMarket. El agente busca en el SF ( invocando el servicio searchService ) todos los posibles servicio que el podr´ıa ofrecer y encuentra que alguien necesita el servicio SearchCheapTrain el cual el puede ofrecer. Con el ID del servicio que le ha devuelto el servicio searchService obtiene la descripci´on del servicio donde se especifica el rol y la unidad que tiene que adquirir para ofrecer ese servicio y la lista de proveedores que lo ofrecen. As´ı que adquiere el rol dentro la unidad correspondiente y registra el servicio en el SF. La figura 3.7 detalla los elementos a˜nadidos al sistema en este escenario y la situaci´on en la que se encontrar´ıa el sistema. Para ejecutar este escenario tendremos que ir a la interfaz gr´afica de Agency1 y hacer click en A~nadir profile como muestra la figura 3.8 Al hacer click, en la consola aparecer´a: [ManagerAgency1] Register SCT Profile result: 155
3.3. PRUEBAS 51 Figura 3.8: Interfaz gr´afica del agente ManagerAgency1 Ahora, tendremos que introducir el agente ProviderAgent, que realiza las siguientes acciones: 1. Entra en THOMAS adquiriendo el rol ”member”dentro de la organizaci´on ”virtual”. 2. Busca el servicio NewProvider y obtiene la descripci´on del servicio. 3. Adquiere el rol que le indica la descripci´on del servicio para invocarlo. 4. Obtiene la lista de proveedores a trav´es de la implementaci´on del servicio. 5. Invoca el servicio NewAgency. 6. Adquiere el rol que le ha devuelto la invocaci´on del servicio para entrar en la agencia que se le ha creado dentro de la organizaci´on ”TourismMarket”. 7. Busca el servicio SearchCheapTrain y obtiene su descripci´on. 8. Adquiere el rol que le indica la descripci´on del servicio para poder ofrecer el servicio. 9. Registra la descripci´on e implementaci´on del servicio SearchCheapTrain. 10. Se queda esperando hasta que alguien invoque su servicio. Para introducir el agente en el sistema, ejecutaremos el lanzador RunProvider y obtendremos por consola el siguiente resultado:
52 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 [ProviderAgent1] Entrar en THOMAS: Ok [ProviderAgent1] Anyado mi AID como parametro: qpid://ProviderAgent1@localhost:8080 [ProviderAgent1] Agente que ofrece el servicio NewProvider: GodAgent [ProviderAgent1] Ejecutamos el servicio. [ProviderAgent1] Valores devueltos. NewUnit = TourismMarket NewRol = provider ErrorValue = Ok! [ProviderAgent1] Entrar en TourismMarket: Ok [ProviderAgent1] Comprobamos si alguien quiere el servicio SearchCheapTrain [ProviderAgent1] Alguien quiere el servicio SearchCheapTrain y esta registrado en el SF con id: 155 [ProviderAgent1] Adquirir rol customer: Ok [ProviderAgent1] Register SearchCheapTrain Process result: 155@148-qpid://ProviderAgent1@localhost:8080 Nuevo cliente Un agente ClientAgent desea buscar y usar una serie de servicios dentro del Mercado de Turismo. Para ello, el agente invoca el servicio NewClient que ofrece GodAgent para entrar dentro del Mercado de Turismo. El servicio valida si el agente puede entrar y le devuelve el rol y unidad que tiene que adquirir para poder entrar dentro de la organizaci´on. Cuando ha adquirido el nuevo rol invoca el servicio SearchService para buscar los servicio SearchCheapHotel,SearchCheapFlight oSearchCheapTrain. Con el identificador de uno de los servicios obtiene la descripci´on ( Profile Description ) y la implementaci´on ( Process Description ) asociado al servicio. En la descripci´on del servicio obtiene el rol que tiene que tener dentro de una unidad para poder invocar el servicio y en la implementaci´on del servicio obtiene los par´ametros de entrada y de salida del servicio y que agente lo ofrece. Finalmente el agente invoca el servicio, obtiene la informaci´on deseada y deja el
3.3. PRUEBAS 53 Mercado de Turismo invocando el servicio leaveRol del OMS. Este escenario se ha ejecutado de dos formas distintas atendiendo al tipo de agente cliente, si es un agente Magentix2 o JADE. La primera es que un agente Magentix2 ejecuta un servicio ofrecido por un agente Magentix2 y luego ejecuta un servicio ofrecido por un agente JADE. La segunda forma es un agente JADE que ejecuta un servicio ofrecido por un agente Magentix2 y luego ejecuta un servicio ofrecido por un agente JADE. Ambos agentes realizan las siguientes acciones: 1. Entra en THOMAS adquiriendo el rol ”member”dentro de la organizaci´on ”virtual”. 2. Busca el servicio NewClient y obtiene la descripci´on del servicio. 3. Adquiere el rol que le indica la descripci´on del servicio para invocarlo. 4. Obtiene la lista de proveedores a trav´es de la implementaci´on del servicio. 5. Invoca el servicio NewClient. 6. Adquiere el rol que le ha devuelto la invocaci´on del servicio para entrar en la agencia que se le ha creado dentro de la organizaci´on ”TourismMarket”. 7. Busca el servicio que desea invocar, SearchCheapHotel,SearchCheapFlight oSearchCheapTrain y obtiene su descripci´on. 8. Adquiere el rol que le indica la descripci´on del servicio para poder invocarlo. 9. Obtiene la lista de proveedores a trav´es de la implementaci´on del servicio. 10. Invoca el servicio que haya buscado. 11. Deja el sistema, dejando de jugar el rol ”member”dentro de la organizaci´on ”virtual”. En primer lugar, vamos a ejecutar tres agentes Magentix2 donde cada uno ejecutar´a un servicio ofrecido por un agente Magentix2. Para ello ejecutaremos el lanzador RunClient y obtendremos el siguiente resultado:
54 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 [ClientAgent1] Entrar en THOMAS: Ok [ClientAgent2] Entrar en THOMAS: Ok [ClientAgent3] Entrar en THOMAS: Ok [ClientAgent1] A~nado mi AID como parametro: qpid://ClientAgent1@localhost:8080 [ClientAgent1] Agente que ofrece el servicio NewClient: GodAgent [ClientAgent1] Ejecutamos el servicio. [ClientAgent1] Valores devueltos. NewUnit = TourismMarket NewRol = customer ErrorValue = Ok! [ClientAgent1] Entrar en TourismMarket: Ok [ClientAgent2] A~nado mi AID como parametro: qpid://ClientAgent2@localhost:8080 [ClientAgent2] Agente que ofrece el servicio NewClient: GodAgent [ClientAgent2] Ejecutamos el servicio. [ClientAgent2] Valores devueltos. NewUnit = TourismMarket NewRol = customer ErrorValue = Ok! [ClientAgent2] Entrar en TourismMarket: Ok [ClientAgent3] A~nado mi AID como parametro: qpid://ClientAgent3@localhost:8080 [ClientAgent3] Agente que ofrece el servicio NewClient: GodAgent [ClientAgent3] Ejecutamos el servicio. [ClientAgent3] Valores devueltos. NewUnit = TourismMarket NewRol = customer ErrorValue = Ok!
3.3. PRUEBAS 55 [ClientAgent3] Entrar en TourismMarket: Ok [ClientAgent1] A~nadimos los parametros de entrada:... [ClientAgent1] Agente que ofrece el servicio SearchCheapFlight: ManagerAgency2 [ClientAgent1] Valores devueltos. SearchCheapFlightOutputFlightCompany = Oceanic SearchCheapFlightOutputFlight = 815 SearchCheapFlightOutputPrice = 750 [ClientAgent1] Vamos a salir... [ClientAgent2] A~nadimos los parametros de entrada:... [ClientAgent2] Agente que ofrece el servicio SearchCheapTrain: ProviderAgent1 [ClientAgent1] Salir de THOMAS : Ok [ClientAgent2] Valores devueltos. SearchCheapTrainOutputTrain = Alaris SearchCheapTrainOutputDeparture = 10:15 SearchCheapTrainOutputArrival = 13:15 SearchCheapTrainOutputDuration = 3:00 SearchCheapTrainOutputPrice = 47 [ClientAgent2] Vamos a salir... [ClientAgent2] Salir de THOMAS : Ok [ClientAgent3] A~nadimos los parametros de entrada: Categoria = 2 , Pais = Spain y Ciudad = Valencia [ClientAgent3] Agente que ofrece el servicio SearchCheapHotel: ManagerAgency1 [ClientAgent3] Valores devueltos. SearchCheapHotelOutputHotelCompany = NH SearchCheapHotelOutputHotel = Hotel Puerta de Valencia [ClientAgent3] Vamos a salir... [ClientAgent3] Salir de THOMAS : Ok
56 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 En segundo lugar, ejecutaremos un agente Magentix2 cliente que ejecuta un servicio ofrecido por un agente en JADE. Para ello ejecutaremos el lanzador RunClient modificado1, para que solo ejecute el servicio SearchCheapFlight, como se ha explicado anteriormente. El resultado obtenido ser´a: [ClientAgent1] Entrar en THOMAS: Ok [ClientAgent1] Anyado mi AID como parametro: qpid://ClientAgent1@localhost:8080 [ClientAgent1] Agente que ofrece el servicio NewClient: GodAgent [ClientAgent1] Ejecutamos el servicio. [ClientAgent1] Valores devueltos. NewUnit = TourismMarket NewRol = customer ErrorValue = Ok! [ClientAgent1] Entrar en TourismMarket: Ok [ClientAgent1] Anyadimos los parametros de entrada:... [ClientAgent1] Agente que ofrece el servicio SearchCheapFlight: AgencyManagerJADE@bowser:1099/JADE [ClientAgent1] Valores devueltos. SearchCheapFlightOutputFlightCompany = Oceanic SearchCheapFlightOutputFlight = 815 SearchCheapFlightOutputPrice = 750? [ClientAgent1] Vamos a salir... [ClientAgent1] Salir de THOMAS: Ok A continuaci´on, ejecutaremos un agente en JADE que invocar´a un servicio ofrecido por un agente JADE. Para ello introducimos el agente ClientAgentJADE en la plataforma JADE obteniendo el siguiente resultado: I’m the Client@bowser:1099/JADE Agent!!!! 1La modificaci´on consiste en comentar la l´ınea de la instrucci´on servicios.add(”SearchCheapTrain”) y cambiar la inicializaci´on de la variable Npor 1
3.3. PRUEBAS 57 Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/ AcquireRoleProcess.owl RoleID=member UnitID=virtual AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: SearchService =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/ SearchServiceProcess.owl SearchServiceInputServicePurpose=NewClient" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> Client: OOH! SF Has agreed to excute the service SearchService! Client: GetProfile =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/ GetProfileProcess.owl GetProfileInputServiceID=11" :protocol fipa-request ) Client: SF SearchService IDProfile = 11 Client: OOH! SF Has agreed to excute the service GerProfile! Client: SF GetProfile URL = http://localhost:8080/TourismMarket/owl/owls/NewClientProfile.owl Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) )
64 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 Client: SF GetProcess Provider = GodAgent Client: Ejecutando servicio... [Client]Sms to send: (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name GodAgent@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) [Client]Sending... Client: OOH! GodAgent Has agreed to excute the service GenericService! Client:GodAgent has informed me of the status of my request. They said : NewClientProcess=http://localhost:8080/TourismMarket/owl/owls/ NewClientProcess.owl#NewRol=customer, http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl #NewUnit=TourismMarket, http://localhost:8080/TourismMarket/owl/owls/ NewClientProcess.owl#ErrorValue=Ok! Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/ AcquireRoleProcess.owl RoleID=customer UnitID=TourismMarket AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: SearchService =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/ SearchServiceProcess.owl SearchServiceInputServicePurpose=SearchCheapHotel" :protocol fipa-request )
3.3. PRUEBAS 65 Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> Client: OOH! SF Has agreed to excute the service SearchService! Client: GetProfile =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/ GetProfileProcess.owl GetProfileInputServiceID=29" :protocol fipa-request ) Client: SF SearchService IDProfile = 29 Client: OOH! SF Has agreed to excute the service GerProfile! Client: SF GetProfile URL = http://localhost:8080/SearchCheapHotel/ owl/owls/SearchCheapHotelProfile.owl Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/ AcquireRoleProcess.owl RoleID=customer UnitID=tourismmarket AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: GetProcess =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/ GetProcessProcess.owl GetProcessInputServiceID=29" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Error ErrorValue = Duplicate Client: OOH! SF Has agreed to excute the service GetProcess! Client:SF has informed me of the status of my request. They said : GetProcessProcess=http://localhost:8080/sfservices/SFservices/ owl/owls/GetProcessProcess.owl #GetProcessOutputProcessList=29@28-ManagerAgency1 http://localhost:8080/SearchCheapHotel/owl/owls/ SearchCheapHotelProcess.owl, http://localhost:8080/sfservices/SFservices/owl/owls/ GetProcessProcess.owl#GetProcessOutputServiceStatus=1
66 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 Client: SF GetProcess Provider = ManagerAgency1 Client: Ejecutando servicio... [Client]Sms to send: (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name ManagerAgency1@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/SearchCheapHotel/owl/owls/ SearchCheapHotelProcess.owl SearchCheapHotelInputCategory=categoria SearchCheapHotelInputCountry=Espa~na SearchCheapHotelInputCity=Valencia" :protocol fipa-request ) [Client]Sending... Client: OOH! ManagerAgency1 Has agreed to excute the service GenericService! Client:ManagerAgency1 has informed me of the status of my request. They said : SearchCheapHotelProcess= http://localhost:8080/SearchCheapHotel/owl/owls/ SearchCheapHotelProcess.owl #SearchCheapHotelOutputHotel=Hotel Puerta de Valencia, http://localhost:8080/SearchCheapHotel/owl/owls/ SearchCheapHotelProcess.owl #SearchCheapHotelOutputHotelCompany=NH [Client] Valores devueltos. SearchCheapHotelOutputHotelCompany = NH SearchCheapHotelOutputHotel = Hotel Puerta de Valencia Client: Salir de THOMAS Client: LeaveRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/ LeaveRoleProcess.owl RoleID=member UnitID=virtual AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service LeaveRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/>
3.3. PRUEBAS 67 Deshacer Agencia La unidad Agency2 ha decidido disolverse debido a un evento como que la agencia no funcione como se esperaba, que el agente ha infringido una norma, que el agente no quiere continuar ofreciendo sus servicio, etc. El primer paso que el agente Agency2Manager debe hacer es borrar el servicio y despu´es salir de THOMAS. Para borrar su servicio, SearchCheapFlight,Agency2Manager invoca el servicio deregisterProcess yderegisterProfile del Service Facilitator (SF). Como consecuencia de esto, ning´un otro agente podr´a encontrar este servicio ya que ha sido borrada la descripci´on y la implementaci´on del mismo. Despu´es, el agente saldr´a de la unidad virtual invocando el servicio leaveRol del OMS y finalmente habr´a sido disuelta la unidad Agency2 del Mercado de Turismo. Las acciones que realiza el agente ser´an las siguientes: 1. Elimina la implementaci´on y la descripci´on del servicio que ofrece. 2. Sale de THOMAS, dejando el rol ”member”de la organizaci´on ”virtual” 3. Deja el sistema, dejando de jugar el rol ”member”dentro de la organizaci´on ”virtual”. Para ejecutar este escenario hay que hacer click en la interfaz gr´afica de Funciones de Agency2 en el bot´on Deshacer y obtendremos el siguiente resultado: [ManagerAgency2] Eliminarme como provedor del servicio SearchCheapFlight: 154@147-qpid://ManagerAgency2@localhost:8080 [ManagerAgency2] Eliminar el profile del servicio SearchCheapFlight: 1 [ManagerAgency2] Salir de THOMAS: Ok Proveedor deja de ofrecer servicio De la misma forma que en la secci´on anterior, el agente Agency2Manager decide disolver la agencia debido a un evento, en este caso, el agente ProviderAgent decide dejar de ofrecer su servicio debido a un evento cualquiera. Para ello necesita invocar el servicio deregisterProcess del SF y el servicio leaveRol del OMS y habr´a dejado el Mercado de Turismo. En este caso, no borra la descripci´on del servicio ya que no ha sido el quien la ha publicado, sino
68 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 que solo ha ofrecido ese servicio. Para ejecutar este escenario hay que pulsar en el bot´on Deshacer de la interfaz gr´afica de Funciones del Proveedor realizandose las siguientes acciones: 1. Elimina la implementaci´on del servicio que ofrece. 2. Deja el sistema, dejando de jugar el rol ”member”dentro de la organizaci´on ”virtual”. Y obteniendo el siguiente resultado por consola: [ProviderAgent1] Vamos a salir... [ProviderAgent1] Eliminarme como provedor del servicio SearchCheapTrain: 155@148-qpid://ProviderAgent1@localhost:8080 [ProviderAgent1] Salir de THOMAS: Ok Deshacer Mercado de Turismo En este escenario el agente GodAgent decide, debido a alg´un evento en el sistema (concretamente no hay ninguna agencia ni clientes en el sistema), deshacer el Mercado de Turismo. Primero elimina la descripci´on y la implementaci´on de los servicios que ofrece NewAgency,NewClient yNewProvider del SF. A continuaci´on, va comprobando organizaci´on por organizaci´on si hay alg´un agentes que a´un desempe˜nar alg´un rol dentro de alguna agencia, y si no hay ninguno, elimina los roles que hay asociados a esa organizaci´on y luego la organizaci´on. Despu´es elimina los roles que quedan en la organizaci´on TourismMarket como son provider ycustomer. Por ´ultimo, deja el rol MarketManager de la organizaci´on TourismMarket y as´ı puede eliminar la organizaci´on TourismMarket. Finalmente, dejar´a THOMAS y el sistema, habi´endose disuelto por completo el Mercado de Turismo. La lista de acciones que realiza el agente GodAgent son las siguientes: 1. Por cada organizaci´on Oque haya la organizaci´on TourismMarket: Por cada rol Rque haya en la organizaci´on O. •Eliminar rol Rde la organizaci´on O. 2. Deja el rol MarketManager de la organizaci´on TourismMarket y lo elimina.
3.3. PRUEBAS 69 3. Elimina los roles provider ycustomer de la organizaci´on TourismMarket. 4. Borra la organizaci´on TourismMarket del sistema. 5. Sale de THOMAS, dejando el rol ”member”de la organizaci´on ”virtual”. Para ello, hay que pulsar en el bot´on Deshacer de la interfaz gr´afica de Funciones de TourismMarket obteniendose el siguiente resultado por consola. [GodAgent] Eliminarme como provedor del servicio NewClient: 150 [GodAgent] Eliminar el profile del servicio NewClient : 0 [GodAgent] Eliminarme como provedor del servicio NewAgeny: 151 [GodAgent] Eliminar el profile del servicio NewAgency : 0 [GodAgent] Eliminarme como provedor del servicio NewProvider: 152 [GodAgent] Eliminar el profile del servicio NewProvider : 0 [GodAgent] Borrar rol AgencyManager de Agency2: Ok [GodAgent] Borrar rol Provider de Agency2: Ok [GodAgent] Borrar Agency2: Ok [GodAgent] Borrar rol AgencyManager de Agency1: Ok [GodAgent] Borrar rol Provider de Agency1: Ok [GodAgent] Borrar Agency1: Ok [GodAgent] Salir del rolo MarketManager de TourismMarket: Ok [GodAgent] Borrar rol member de TourismMarket: Ok [GodAgent] Borrar rol MarketManager de TourismMarket: Ok [GodAgent] Borrar rol Payee de TourismMarket: Ok
70 CAP´ ITULO 3. DINAMICIDAD EN THOMAS/MAGENTIX2 [GodAgent] Borrar rol provider de TourismMarket: Ok [GodAgent] Borrar rol customer de TourismMarket: Ok [GodAgent] Borrar TourismMarket unit: Ok [GodAgent] Salir de THOMAS: Ok
Cap´ıtulo 4 Conclusiones 71
72 CAP´ ITULO 4. CONCLUSIONES En esta memoria se ha realizado un estudio de la integraci´on de THOMAS y Magentix2 como plataforma especialmente orientada a soportar dinamicidad en Organizaciones Virtuales. En el cap´ıtulo 2hemos explicado qu´e son los Sistemas Multiagente, las Organizaciones Virtuales y las tecnolog´ıas THOMAS y Magentix2 las cuales hemos usado en nuestro proyecto. En el cap´ıtulo 3hemos expuesto los requisitos que tendr´ıa que tener un Sistema Multiagente para que sea din´amico y hemos presentado un caso de estudio con el que hemos verificado la plataforma presentada anteriormente. Al introducir la dinamicidad como propiedad en el sistema se ha permitido la evoluci´on de los Sistemas Multiagente y facilitado su evoluci´on en tiempo de ejecuci´on. Esta arquitectura o plataforma representa un paso s´olido para obtener verdaderamente Organizaciones Virtuales din´amicas. Adem´as, sirve de base para comenzar a pensar en mecanismos que permitan adaptabilidad, es decir, sistemas que a partir de un evento sean capaces de adaptarse a ese cambio. Con la ayuda del caso de estudio dise˜nado, implementado y testeado, hemos comprobado que THOMAS/Magentix2 ofrece dinamicidad y que es una clara opci´on, como plataforma, para desarrollar Sistemas Multiagente basados en Organizaciones Virtuales. Hemos verificado la especificaci´on de THOMAS/Magentix2 y mejorado tanto las posibilidades como la API que ofrece la plataforma. A lo largo del trabajo hemos detectado y corregido diversos errores de la plataforma. Gracias a esta depuraci´on disponemos de un producto m´as fiable y robusto. Los resultados de este trabajo han sido satisfactoriamente publicados y expuestos en el congreso internacional 9th International Conference on Practical Applications of Agents and Multi-Agent Systems [10] Adem´as, el trabajo realizado forma parte del trabajo que se ha desarrollado dentro del proyecto Consolider Ingenio ( CSD2007-00022 ) Agreement Technologies cuyo responsable es Carlos Sierra y dentro del proyecto del Ministerio de Ciencia e Innovaci´on ( TIN2009-13839-C03-01 ) Organizaciones Virtuales Adaptativas: Arquitecturas y M´etodos de Desarrollo cuyo responsable es Vicente J. Julian Inglada. Tambi´en ha servido de apoyo para el proyecto MAGENTIX II: Una plataforma para sistemas multiagente abiertos del Ministerio de Ciencia e Innovaci´on ( TIN2008-04446/TIN ) cuyo responsable es Ana Mar´ıa Garc´ıa Fornes. Por ´ultimo ha servido para crear una prueba unitaria para la plataforma que ser´a usada para comprobar si despu´es de una nueva versi´on sigue ofreciendo las mismas funcionalidades con respecto al framework de THOMAS. Por ´ultimo ha servido de gu´ıa y apoyo para el trabajo realizado con agentes m´oviles en Android por Jorge Luis Ag¨uero Medina.
73 Como trabajo futuro consideramos la realizaci´on de la prueba de alg´un mecanismo de composici´on de servicios. Un agente detecta que hay una serie de servicios que son muy solicitados y crea un servicio compuesto por esos servicios. Tambi´en podemos incluir aspectos de seguridad en la plataforma as´ı como mejorar la interoperabilidad del caso de estudio con el usuario, es decir, mostrar de una forma gr´afica todo la informaci´on y crear m´as y mejores servicios.
1. Introducci´on Es un ejemplo de desarrollo de organizaciones virtuales abiertas, hecho sobre Magentix 2, THOMAS y JADE, en el que se explotan las funcionalidades de Magentix 2 y de THOMAS. Sirve como prueba para comprobar que las funcionalidades de Mag2THM siguen funcionando. Su ejecuci´on es un poco compleja, aunque se explica en un art´ıculo que se publicar´a en poco tiempo. En este ejemplo se comprueban casi todos los m´etodos de THOMAS y se intenta exprimir al m´aximo la potencia de Magentix2. 1.1. Estructura de directorios Dentro del proyecto TestTourismMarket encontraremos un conjunto de paquetes src/agentesJ C´odigo de los agentes en JADE •ClientAgentJADE.java Agente en JADE que ejecuta el servicio dado en el ¨parametro¨que est´a en el m´etodo ClientAgentJADE •ManagerAgencyJADE.java Agente en JADE que crea una organizaci´on dentro de TourismMarket y ofrece un servicio nuevo. src/agentesM C´odigo de los agentes Magentix2 •ClientAgent.java Agente que ejecuta el servicio que se le pase en el parametro del constructor. •GodAgent.java Este agente es el que crea toda la infraestructura necesaria para la creaci´on del Mercado de Turismo (Roles, unidades y servicios). Ademas es quien ofertara los servicios de NewClient, NewProvider y NewAgency. •ManagerAgency1.java Agente que crear´a una Agencia (Agency1) dentro de MarketManager y ofrecer´a el servicio SearchCheapHotel, adem´as tiene un evento que permite registrar un profile del servicio SearchCheapTrain, para que venga otro agente y lo ofrezca dentro de la agencia creada por ´el. •ManagerAgency2.java Agente que crear´a una Agencia (Agency2) dentro de MarketManager y ofrecer´a el servicio SearchCheapFlight •Provider1Agent.java Agente que ofrece el servicio SearchCheapTrain. Necesita que este publicado el profile del servicio por Agency1Manager. src/comportamientos Comportamientos para los agentes de JADE. El nombre indica a que m´etodo del OMS o del SF atienden. El Responder.java corresponde con el comportamiento para atender las peticiones del servicio que registra el agente: ManagerAgencyJADE.java src/extras •Agency1UI.java Interfaz gr´afica para el agente Agency1Manager.java que tiene el boton de deshacer la organizaci´on y de a˜nadir el profile del servicio SearchCheapTrain •GeneraAgentes.java Una funci´on que genere el texto que se necesita poner en el lanzador de JADE para que genere n agentes y poder hacer pruebas de carga. •OMSAgentInform.java Clase que usan los Agentes de JADE para guardar la informaci´on de la ubicaci´on del OMS •SFAgentInform.java Clase que usan los Agentes de JADE para guardar la informaci´on de la ubicaci´on del SF •Salir.java Interfaz gr´afica para el resto de agentes de Magentix2 que tiene un bot´on que representa el concepto de que se produce un evento y la organizaci´on se deshace. src/lanzadores •RunAgency1.java Lanza el agente Agency1Manager. •RunAgency2.java Lanza el agente Agency2Manager. 2
•RunClient.java Lanza el agente ClientAgent. •RunMainOrganization.java Lanza la plataforma Magentix2, limpia la base de datos, lanza los agentes pasarelas y el OMS y el SF. Ademas lanza el agente GodAgent y Agency1Manager. •RunMarketManager.java Lanza el agente GodAgent. •RunProvider.java Lanza el agente ProviderAgent. configuration Dentro de este directorio encontraremos dos ficheros de configuraci´on. •loggin.xml: para poder configurar el log de las ejecuciones, aqui podremos decirle donde guardar el log. •Settings.xml: fichero de configuraci´on donde podremos establecer los valores de conexi´on al broker (host, port ...). 1.2. Requisitos iniciales Si no est´an marcados los proyectos como Maven, bot´on derecho→Maven →Enable Dependency Management. Hay que asegurarse de que el proyecto est´a preparado para la versi´on de java 1.6 y no otra (ver en las propiedades del proyecto) porque a veces Maven cambia estas preferencias. MYSQL JADE Tomcat Servicios web de Thomas ejecut´andose bajo Tomcat. Los servicios necesarios para el ejemplo TourismMarket,SearchCheapHotel,SearchCheapFlight y SearchCheapTrain ejecut´andose bajo Tomcat. Estos servicios fueron desarrollados concretamente para este ejemplo, los cuales se pueden encontrar en Internet1. Plataforma Magentix compilada y en el repositorio local de Maven. Para esto necesitamos hacer un mvn install en el proyecto magentix2. Si estamos en eclipse y tenemos el proyecto magentix2 abierto, podemos hacer directamente bot´on derecho→Run As→Maven Install. Con esto se compilar´a el proyecto magentix2, se empaquetara en dos jar (uno solo con Magentix y otro con Magentix y todas sus dependencias) y se insertar´a el jar en el repositorio local. Para los requisitos de MYSQL, Tomcat y los servicios web se puede ver la gu´ıa de pruebas unitarias de Magentix2, donde se explica con detalle como configurar estos puntos. Si no tenemos disponible el paquete de Magentix, podemos encontrar los war correspondientes en subversion, bajo las siguientes subramas del repositorio https://gti-ia.dsic.upv.es/svn/thomas/ sfservices/ Servicio SF de THOMAS. omsservices/ Servicio OMS de THOMAS. magentix2/ Plataforma Magentix2. TestTourismMarket/ •TourismMarket/ C´odigo del ejemplo a probar •WebServices/ Servicios necesarios para ejecutar el ejemplo Bajo estos directorios est´an los fuentes para construir los respectivos war y el c´odigo de todo lo necesario. Para construirlos los war’s, en el directorio del OMS o del SF ejecutar´ıamos mvn package, que dejar´ıa el war correspondiente en un directorio target dentro del subdirectorio donde ejecutemos el comando. En el caso de sfservices, por ejemplo, tendr´ıamos: 1https://gti-ia.dsic.upv.es/svn/thomas/TestTourismMarket/WebServices 2En la gu´ıa de Magentix se explican tambi´en como configurar correctamente Magentix para poder crear sin problemas el jar asociado e instalarlo en el repositorio local de Maven 3
usuario@maquina:~/workspace/sfservices/target$ ls classes sfservices sfservices.war war Si se desea tener una interfaz gr´afica para visualizar la informaci´on del OMS y el SF ser´a necesario tener y usar ThomasGUI 3. 2. Pruebas sobre Magentix2 Se necesita tener en ejecuci´on el servidor de bases de datos MYSQL y Tomcat con los servicios antes mencionados. La prueba consistir´ıa en hacer uso de las funciones de organizaciones de Thomas (unidades organizativas, roles, . . . ) desde agentes funcionando en Mag2THM o en JADE. Dado que la prueba consiste en seguir cierto orden en la ejecuci´on de comandos, no se puede automatizar. Los pasos iniciales para reproducir la prueba son los siguientes: Reiniciar el servidor Tomcat. Con esto nos aseguramos de que los servicios web est´an limpios. Este paso previo no se hace debido a este test, se hace debido al dise˜no de los servicios de Thomas. Es el mejor modo de asegurarnos que la salida ser´a la misma a la esperada si todo va bien. Si usamos ThomasGUI como visualizador tendremos que hacer lo siguiente antes de ejecutar la prueba: •Ejecutar ThomasGUI. Debemos ver una ventana similar a la de la imagen 3. Figura 1: Captura de pantalla del arranque de ThomasGUI En orden, apretar: 1. Clean Data 2. Platform 3. SF 4. OMS 3En la gu´ıa Pruebas unitarias Demo Thomas (usada en el AAMAS’10) se explican como configurarlo correctamente 4
Debemos ver en la consola de eclipse: [Thread-5] core.BridgeAgentOutIn (BridgeAgentOutIn.java:71) - BridgeAgentOutIn waiting ... [Thread-6] organization.SF (SF.java:602) - Agent SF active [Thread-8] organization.OMS (OMS.java:794) - Agent OMS active •Ejecutar el lanzador RunMarketManager. [GodAgent]Entrar en THOMAS: Ok [GodAgent]Register Unit TourismMarket result: Ok [GodAgent]Register Role member result: Ok [GodAgent]Register Role MarketManager result: Ok [GodAgent]Acquire Role MarketManager result: Ok [GodAgent]Register Role Payee result: Ok [GodAgent]Register Role provider result: Ok [GodAgent]Register Role customer result: Ok [GodAgent] Register NewClientProfile result: 150 [GodAgent] Register NewClientProcess result: 150@144-qpid://GodAgent@localhost:8080 [GodAgent] Register NewAgencyProfile result: 151 [GodAgent] Register NewAgencyProcess result: 151@145-qpid://GodAgent@localhost:8080 [GodAgent] Register NewProviderProfile result: 152 [GodAgent] Register NewProviderProcess result: 152@146-qpid://GodAgent@localhost:8080 •Ejecutar el lanzador RunAgency1. [ManagerAgency1] Entrar en THOMAS: Ok [ManagerAgency1] A~nado mi AID y el nombre de la agencia a crear como parametro: qpid://ManagerAgency1@localhost:8080 , Agency1 [ManagerAgency1] Agente que ofrece el servicio NewAgency: GodAgent [ManagerAgency1] Ejecutamos el servicio. [ManagerAgency1] Valores devueltos. NewRol = AgencyManager ErrorValue = Ok! [ManagerAgency1] Entrar en la Agencia Agency1 con el rol AgencyManager: Ok [ManagerAgency1]Register SearchCheapHotel Profile result: 153 [ManagerAgency1] Register SearchCheapHotel Process result: 153@147-qpid://ManagerAgency1@localhost:8080 5
Si no usamos ThomasGUI ejecutaremos el lanzador RunMainOrganization [ManagerAgency1] Entrar en THOMAS: Ok [GodAgent]Entrar en THOMAS: Ok [GodAgent]Register Unit TourismMarket result: Ok [GodAgent]Register Role member result: Ok [GodAgent]Register Role MarketManager result: Ok [GodAgent]Acquire Role MarketManager result: Ok [GodAgent]Register Role Payee result: Ok [GodAgent]Register Role provider result: Ok [GodAgent]Register Role customer result: Ok [GodAgent] Register NewClientProfile result: 150 [GodAgent] Register NewClientProcess result: 150@144-qpid://GodAgent@localhost:8080 [GodAgent] Register NewAgencyProfile result: 151 [GodAgent] Register NewAgencyProcess result: 151@145-qpid://GodAgent@localhost:8080 [ManagerAgency1] A~nado mi AID y el nombre de la agencia a crear como parametro: qpid://ManagerAgency1@localhost:8080 , Agency1 [ManagerAgency1] Agente que ofrece el servicio NewAgency: GodAgent [ManagerAgency1] Ejecutamos el servicio. [GodAgent] He recibido una petici´on de mi servicio NewAgency [GodAgent] AGREE [GodAgent] Executing... [Agency1, qpid://ManagerAgency1@localhost:8080] [GodAgent] NewAgency: Registro de la nueva unidad, Agency1: Ok [GodAgent] NewAgency: Registro del nuevo rol AgencyManager: Ok [GodAgent] NewAgency: adquiere el rol el agente creador de la Agencia: {http://localhost:8080/TourismMarket/owl/owls/NewAgencyProcess.owl#NameUnit=Agency1, http://localhost:8080/TourismMarket/owl/owls/NewAgencyProcess.owl #AgentID=qpid://ManagerAgency1@localhost:8080} [GodAgent] NewAgency: Registro del nuevo rol Provider: Ok [GodAgent]Creating Inform Message... [ManagerAgency1] Valores devueltos. NewRol = AgencyManager ErrorValue = Ok! [ManagerAgency1] Entrar en la Agencia Agency1 con el rol AgencyManager: Ok 6
[GodAgent] Register NewProviderProfile result: 152 [GodAgent] Register NewProviderProcess result: 152@146-qpid://GodAgent@localhost:8080 [ManagerAgency1]Register SearchCheapHotel Profile result: 153 [ManagerAgency1] Register SearchCheapHotel Process result: 153@147-qpid://ManagerAgency1@localhost:8080 Al acabar de ejecutarse una cosa o la otra conceptualmente tendremos lo que muestra la figura 2 GodAgent Tourism Market S NewProvider MarketManager S NewAgency S NewClient In Unit Offers Offers Offers Agency1Manager Agency1 In Unit In Unit S Search Cheap Hotel AgencyManager Offers Figura 2: Estructura principal del Mercado de Turismo 2.1. A˜nadir una segunda Agencia Probaremos la creaci´on de una segunda agencia dentro de la organizaci´on desde Mag2THM. Para ellos introducimos en la plataforma el agente Agency2Manager que crear´a la agencia Agency2 ofreciendo el servicio SearchCheapFlight Ejecutar el lanzador RunAgency2 7
[ManagerAgency2] Entrar en THOMAS: Ok [ManagerAgency2] A~nado mi AID y el nombre de la agencia a crear como parametro: qpid://ManagerAgency2@localhost:8080 , Agency2 [ManagerAgency2] Agente que ofrece el servicio NewAgency: GodAgent [ManagerAgency2] Ejecutamos el servicio. [ManagerAgency2] Valores devueltos. NewRol = AgencyManager ErrorValue = Ok! [ManagerAgency2] Entrar en la Agencia Agency2 con el rol AgencyManager: Ok [ManagerAgency2]Register SearchCheapFlight Profile result: 154 [ManagerAgency2] Register SearchCheapFlgiht Process result: 154@147-qpid://ManagerAgency2@localhost:8080 2.2. Ejecutar el Proveedor Probaremos lanzar un agente que buscara si alguien quiere el servicio que el puede ofrecer, si es as´ı se unir´a a esa agencia y lo ofrecer´a. Para ello primero tendremos que hacer click en a˜nadir profile de la interfaz gr´afica de Agency1 como la que muestra la figura 3. Figura 3: Interfaz gr´afica del agente ManagerAgency1 Al hacer click en la consola aparecer´a: [ManagerAgency1] Register SCT Profile result: 155 Ahora tenemos que introducir el agente ProviderAgent. Ejecutar el lanzador RunProvider [ProviderAgent1] Entrar en THOMAS: Ok [ProviderAgent1] Anyado mi AID como parametro: qpid://ProviderAgent1@localhost:8080 [ProviderAgent1] Agente que ofrece el servicio NewProvider: GodAgent [ProviderAgent1] Ejecutamos el servicio. [ProviderAgent1] Valores devueltos. NewUnit = TourismMarket NewRol = provider ErrorValue = Ok! 8
[ProviderAgent1] Entrar en TourismMarket: Ok [ProviderAgent1] Comprobamos si alguien quiere el servicio SearchCheapTrain [ProviderAgent1] Alguien quiere el servicio SearchCheapTrain y esta registrado en el SF con id: 155 [ProviderAgent1] Adquirir rol customer: Ok [ProviderAgent1] Register SearchCheapTrain Process result: 155@148-qpid://ProviderAgent1@localhost:8080 2.3. Ejecutar un cliente En este punto de la ejecuci´on tendremos la organizaci´on TourismMarket como muestra la figura ?? (espero que sirva para tener una visi´on m´as clara de lo que se ha conseguido). Ahora probaremos lanzar un cliente en Mag2THM que ejecute los tres servicio que hay ofrecidos. Para ello introducimos en la plataforma el agente ClientAgent que ejecutar´a el servicio que le digamos en el par´ametro de creaci´on del agente. GodAgent Tourism Market S NewProvider MarketManager S NewAgency S NewClient In Unit Offers Offers Offers Agency1Manager Agency1 In Unit In Unit S Search Cheap Hotel AgencyManager Offers ProviderAgent Provider S Search Cheap Flight In Unit Offers Agency2Manager AgencyManager S Search Cheap Flight In Unit Offers Agency2 In Unit Figura 4: Estructura de TourismMarket Ejecutar el lanzador RunClient [ClientAgent1] Entrar en THOMAS: Ok [ClientAgent2] Entrar en THOMAS: Ok [ClientAgent3] Entrar en THOMAS: Ok [ClientAgent1] A~nado mi AID como parametro: qpid://ClientAgent1@localhost:8080 9
[ClientAgent1] Agente que ofrece el servicio NewClient: GodAgent [ClientAgent1] Ejecutamos el servicio. [ClientAgent1] Valores devueltos. NewUnit = TourismMarket NewRol = customer ErrorValue = Ok! [ClientAgent1] Entrar en TourismMarket: Ok [ClientAgent2] A~nado mi AID como parametro: qpid://ClientAgent2@localhost:8080 [ClientAgent2] Agente que ofrece el servicio NewClient: GodAgent [ClientAgent2] Ejecutamos el servicio. [ClientAgent2] Valores devueltos. NewUnit = TourismMarket NewRol = customer ErrorValue = Ok! [ClientAgent2] Entrar en TourismMarket: Ok [ClientAgent3] A~nado mi AID como parametro: qpid://ClientAgent3@localhost:8080 [ClientAgent3] Agente que ofrece el servicio NewClient: GodAgent [ClientAgent3] Ejecutamos el servicio. [ClientAgent3] Valores devueltos. NewUnit = TourismMarket NewRol = customer ErrorValue = Ok! [ClientAgent3] Entrar en TourismMarket: Ok [ClientAgent1] A~nadimos los parametros de entrada:... [ClientAgent1] Agente que ofrece el servicio SearchCheapFlight: ManagerAgency2 [ClientAgent1] Valores devueltos. SearchCheapFlightOutputFlightCompany = Oceanic SearchCheapFlightOutputFlight = 815 SearchCheapFlightOutputPrice = 750 [ClientAgent1] Vamos a salir... [ClientAgent2] A~nadimos los parametros de entrada:... [ClientAgent2] Agente que ofrece el servicio SearchCheapTrain: ProviderAgent1 [ClientAgent1] Salir de THOMAS : Ok [ClientAgent2] Valores devueltos. SearchCheapTrainOutputTrain = Alaris SearchCheapTrainOutputDeparture = 10:15 SearchCheapTrainOutputArrival = 13:15 SearchCheapTrainOutputDuration = 3:00 SearchCheapTrainOutputPrice = 47 10
[ClientAgent2] Vamos a salir... [ClientAgent2] Salir de THOMAS : Ok [ClientAgent3] A~nadimos los parametros de entrada: Categoria = 2 , Pais = Spain y Ciudad = Valencia [ClientAgent3] Agente que ofrece el servicio SearchCheapHotel: ManagerAgency1 [ClientAgent3] Valores devueltos. SearchCheapHotelOutputHotelCompany = NH SearchCheapHotelOutputHotel = Hotel Puerta de Valencia [ClientAgent3] Vamos a salir... [ClientAgent3] Salir de THOMAS : Ok 2.4. Deshacer toda la organizaci´on TourismMarket Probaremos todos los m´etodos para borrar roles, unidades y servicios. Hay que seguir el orden que explico a continuaci´on. 1. Salir de la organizaci´on Agency2 haciendo click en la interfaz gr´afica de Funciones de Agency2 en el bot´on Deshacer. [ManagerAgency2] Eliminarme como provedor del servicio SearchCheapFlight: 154@147-qpid://ManagerAgency2@localhost:8080 [ManagerAgency2] Eliminar el profile del servicio SearchCheapFlight: 1 [ManagerAgency2] Salir de THOMAS: Ok 2. Que el Agente ProviderAgent deje de ofrecer el servicio y deje la organizaci´on. Para ello hacer click en el bot´on Deshacer de la interfaz gr´afica de Funciones del Proveedor. [ProviderAgent1] Vamos a salir... [ProviderAgent1] Eliminarme como provedor del servicio SearchCheapTrain: 155@148-qpid://ProviderAgent1@localhost:8080 [ProviderAgent1] Dejar el rol customer de la organizacion tourismmarket: Ok 3. Deshacer la Agency1. Para ello hacer click en el bot´on Deshacer de la interfaz gr´afica de Funciones de Agency1. [[ManagerAgency1] Eliminarme como provedor del servicio SearchCheapHotel: 153 [ManagerAgency1] Eliminar el profile del servicio SearchCheapHotel: 1 [ManagerAgency1] Eliminar el profile del servicio nuevo: 0 [ManagerAgency1] Salir de THOMAS: Ok 4. Deshacer MarketManager. Para ello hacer click en el bot´on Deshacer de la interfaz gr´afica de Funciones de TourismMarket. 11
(REQUEST :sender ( agent-identifier :name ManagerAgency@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/RegisterProcessProcess.owl RegisterProcessInputServiceModel=http://localhost:8080/SearchCheapFlight/owl/owls/ SearchCheapFlightProcess.owl#SearchCheapFlightProcess RegisterProcessInputServiceID=15" :protocol fipa-request ) ManagerAgency:SF RegisterProfile has returned URL = 15 ManagerAgency: OOH! SF Has agreed to excute the RegisterProcess! ManagerAgency:SF(INFORM :sender ( agent-identifier :name SF@bowser:8081 :addresses (sequence http://bowser.dsic.upv.es:8081 )) :receiver (set ( agent-identifier :name ManagerAgency@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778 )) ) :content "RegisterProcessProcess={http://localhost:8080/sfservices/SFservices/owl/owls/ RegisterProcessProcess.owl#RegisterProcessOutputServiceModelID= 15@15-ManagerAgency@bowser:1099/JADE, http://localhost:8080/sfservices/SFservices/owl/owls/RegisterProcessProcess.owl #RegisterProcessOutputServiceStatus=1}" :protocol fipa-request :conversation-id C27253500_1290456338713 ) ManagerAgency:SF RegisterProcess has returned = 15@15-ManagerAgency@bowser:1099/JADE 3.2.2. Ejecutar un cliente en Magentix2 Ejecutaremos el lanzador RunClient modificado5, para que solo ejecute el servicio SearchCheapFlight, como se ha explicado en la secci´on 2.3. [ClientAgent1] Entrar en THOMAS: Ok [ClientAgent2] Entrar en THOMAS: Ok [ClientAgent2] Anyado mi AID como parametro: qpid://ClientAgent2@localhost:8080 [ClientAgent2] Agente que ofrece el servicio NewClient: GodAgent [ClientAgent2] Ejecutamos el servicio. [ClientAgent2] Valores devueltos. NewUnit = TourismMarket NewRol = customer ErrorValue = Ok! [ClientAgent2] Entrar en TourismMarket: Ok [ClientAgent1] Anyado mi AID como parametro: qpid://ClientAgent1@localhost:8080 [ClientAgent1] Agente que ofrece el servicio NewClient: GodAgent [ClientAgent1] Ejecutamos el servicio. 5La modificaci´on consiste en comentar la l´ınea de la instrucci´on servicios.add(”SearchCheapTrain”) y cambiar la inicializaci´on de la variable Npor 2 18
[ClientAgent1] Valores devueltos. NewUnit = TourismMarket NewRol = customer ErrorValue = Ok! [ClientAgent1] Entrar en TourismMarket: Ok [ClientAgent2] Anyadimos los parametros de entrada: Categoria = 2 , Pais = Spain y Ciudad = Valencia [ClientAgent2] Agente que ofrece el servicio SearchCheapHotel: ManagerAgency1 [ClientAgent2] Valores devueltos. SearchCheapHotelOutputHotelCompany = NH SearchCheapHotelOutputHotel = Hotel Puerta de Valencia [ClientAgent2] Vamos a salir... [ClientAgent2] Salir de THOMAS: Ok [ClientAgent1] Anyadimos los parametros de entrada:... [ClientAgent1] Agente que ofrece el servicio SearchCheapFlight: AgencyManagerJADE@bowser:1099/JADE [ClientAgent1] Valores devueltos. SearchCheapFlightOutputFlightCompany = Oceanic SearchCheapFlightOutputFlight = 815 SearchCheapFlightOutputPrice = 750? [ClientAgent1] Vamos a salir... [ClientAgent1] Salir de THOMAS: Ok 3.2.3. Ejecutar un cliente en JADE Introducimos el agente ClientAgentJADE como se ha explicado en el secci´on 3.1. Este agente ejecutar´a el servicio que le digas en el ”parametro” que tiene en el constructor (ClientAgentJADE). Ejecutar el servicio SearchCheapFlight para ver el funcionamiento de la ejecuci´on de un agente JADE ejecutando un servicio en JADE I’m the Client@bowser:1099/JADE Agent!!!! Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/AcquireRoleProcess.owl RoleID=member UnitID=virtual AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: SearchService =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/SearchServiceProcess.owl SearchServiceInputServicePurpose=NewClient" :protocol fipa-request ) 19
Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> Client: OOH! SF Has agreed to excute the service SearchService! Client: GetProfile =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/GetProfileProcess.owl GetProfileInputServiceID=11" :protocol fipa-request ) Client: SF SearchService IDProfile = 11 Client: OOH! SF Has agreed to excute the service GerProfile! Client: SF GetProfile URL = http://localhost:8080/TourismMarket/owl/owls/NewClientProfile.owl Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/AcquireRoleProcess.owl RoleID=member UnitID=tourismmarket AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: GetProcess =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl GetProcessInputServiceID=11" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> Client: OOH! SF Has agreed to excute the service GetProcess! Client:SF has informed me of the status of my request. They said : GetProcessProcess={http://localhost:8080/sfservices/SFservices/owl/owls/ GetProcessProcess.owl#GetProcessOutputProcessList=11@11-GodAgent http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl, http://localhost:8080/sfservices/SFservices/owl/owls/ GetProcessProcess.owl#GetProcessOutputServiceStatus=1} Client: SF GetProcess Provider = GodAgent Client: Ejecutando servicio... [Client]Sms to send: (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name GodAgent@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) [Client]Sending... Client: OOH! GodAgent Has agreed to excute the service GenericService! Client:GodAgent has informed me of the status of my request. They said : NewClientProcess={http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl #NewRol=customer, http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl #NewUnit=TourismMarket, http://localhost:8080/TourismMarket/owl/owls/ NewClientProcess.owl#ErrorValue=Ok!} 20
Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/AcquireRoleProcess.owl RoleID=customer UnitID=TourismMarket AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: SearchService =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/SearchServiceProcess.owl SearchServiceInputServicePurpose=SearchCheapFlight" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> Client: OOH! SF Has agreed to excute the service SearchService! Client: GetProfile =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/GetProfileProcess.owl GetProfileInputServiceID=15" :protocol fipa-request ) Client: SF SearchService IDProfile = 15 Client: OOH! SF Has agreed to excute the service GerProfile! Client: SF GetProfile URL = http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProfile.owl Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/AcquireRoleProcess.owl RoleID=customer UnitID=tourismmarket AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: GetProcess =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl GetProcessInputServiceID=15" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Error ErrorValue = Duplicate Client: OOH! SF Has agreed to excute the service GetProcess! Client:SF has informed me of the status of my request. They said : GetProcessProcess={http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl 21
#GetProcessOutputProcessList=15@15-ManagerAgency@bowser:1099/JADE http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl, http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl #GetProcessOutputServiceStatus=1} Client: SF GetProcess Provider = ManagerAgency@bowser:1099/JADE Client: Ejecutando servicio... [Client]Sms to send: (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name ManagerAgency@bowser:1099/JADE ) ) :content "http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl SearchCheapFlightInputDepartingFrom=Sydney SearchCheapFlightInputGoingTo=Nueva York SearchCheapFlightInputDepartDate=22/10/00 SearchCheapFlightInputReturnDate=10/11/00 SearchCheapFlightInputNumberOfPassanger=2" :protocol fipa-request ) [Client]Sending... ManagerAgency: Doc OWL-S: http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl ManagerAgency: AGREE ManagerAgency: Sending First message:(AGREE :receiver (set ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) ) :content "SearchCheapFlightProcess=Agree" :reply-with Client@bowser:1099/JADE1290456368635 :protocol fipa-request :conversation-id C1142607_1290456368635 ) Client: OOH! ManagerAgency Has agreed to excute the service GenericService! ManagerAgency: Doc OWL-S: http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl ManagerAgency: Executing... [Sydney, 10/11/00, 22/10/00, 2, Nueva] ManagerAgency: Values obtained... : http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl #SearchCheapFlightOutputPrice=750, http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl #SearchCheapFlightOutputFlightCompany=Oceanic, http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl #SearchCheapFlightOutputFlight=815 ManagerAgency: Creating inform message to send... ManagerAgency: Before set message content... Client:ManagerAgency has informed me of the status of my request. They said : SearchCheapFlightProcess=http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl #SearchCheapFlightOutputPrice=750, http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl #SearchCheapFlightOutputFlightCompany=Oceanic, http://localhost:8080/SearchCheapFlight/owl/owls/SearchCheapFlightProcess.owl #SearchCheapFlightOutputFlight=815 [Client] Valores devueltos. SearchCheapFlightOutputFlightCompany = Oceanic SearchCheapFlightOutputFlight = 815 SearchCheapFlightOutputPrice = 750 Client: Salir de THOMAS Client: LeaveRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/LeaveRoleProcess.owl RoleID=member UnitID=virtual AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) 22
Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> Ejecutar el servicio SearchCheapHotel para ver el funcionamiento de la ejecuci´on de un agente JADE ejecutando un servicio en Magentix2 I’m the Client@bowser:1099/JADE Agent!!!! Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/AcquireRoleProcess.owl RoleID=member UnitID=virtual AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: SearchService =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/SearchServiceProcess.owl SearchServiceInputServicePurpose=NewClient" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> Client: OOH! SF Has agreed to excute the service SearchService! Client: GetProfile =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/GetProfileProcess.owl GetProfileInputServiceID=26" :protocol fipa-request ) Client: SF SearchService IDProfile = 26 Client: OOH! SF Has agreed to excute the service GerProfile! Client: SF GetProfile URL = http://localhost:8080/TourismMarket/owl/owls/NewClientProfile.owl Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/AcquireRoleProcess.owl RoleID=member UnitID=tourismmarket AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) 23
Client: GetProcess =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl GetProcessInputServiceID=26" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> Client: OOH! SF Has agreed to excute the service GetProcess! Client:SF has informed me of the status of my request. They said : GetProcessProcess=http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl #GetProcessOutputProcessList=26@25-GodAgent http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl, http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl #GetProcessOutputServiceStatus=1 Client: SF GetProcess Provider = GodAgent Client: Ejecutando servicio... [Client]Sms to send: (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name GodAgent@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) [Client]Sending... Client: OOH! GodAgent Has agreed to excute the service GenericService! Client:GodAgent has informed me of the status of my request. They said : NewClientProcess=http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl #NewRol=customer, http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl #NewUnit=TourismMarket, http://localhost:8080/TourismMarket/owl/owls/NewClientProcess.owl#ErrorValue=Ok! Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/AcquireRoleProcess.owl RoleID=customer UnitID=TourismMarket AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: SearchService =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/SearchServiceProcess.owl SearchServiceInputServicePurpose=SearchCheapHotel" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> Client: OOH! SF Has agreed to excute the service SearchService! 24
Client: GetProfile =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/GetProfileProcess.owl GetProfileInputServiceID=29" :protocol fipa-request ) Client: SF SearchService IDProfile = 29 Client: OOH! SF Has agreed to excute the service GerProfile! Client: SF GetProfile URL = http://localhost:8080/SearchCheapHotel/owl/owls/SearchCheapHotelProfile.owl Client: AcquierRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/AcquireRoleProcess.owl RoleID=customer UnitID=tourismmarket AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: GetProcess =(REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name SF@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl GetProcessInputServiceID=29" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service AcquireRol! Client: OMS AcquiereRol Status = Error ErrorValue = Duplicate Client: OOH! SF Has agreed to excute the service GetProcess! Client:SF has informed me of the status of my request. They said : GetProcessProcess=http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl #GetProcessOutputProcessList=29@28-ManagerAgency1 http://localhost:8080/SearchCheapHotel/owl/owls/SearchCheapHotelProcess.owl, http://localhost:8080/sfservices/SFservices/owl/owls/GetProcessProcess.owl #GetProcessOutputServiceStatus=1 Client: SF GetProcess Provider = ManagerAgency1 Client: Ejecutando servicio... [Client]Sms to send: (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name ManagerAgency1@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/SearchCheapHotel/owl/owls/SearchCheapHotelProcess.owl SearchCheapHotelInputCategory=categoria SearchCheapHotelInputCountry=Espa~na SearchCheapHotelInputCity=Valencia" :protocol fipa-request ) [Client]Sending... Client: OOH! ManagerAgency1 Has agreed to excute the service GenericService! Client:ManagerAgency1 has informed me of the status of my request. They said : SearchCheapHotelProcess= http://localhost:8080/SearchCheapHotel/owl/owls/SearchCheapHotelProcess.owl #SearchCheapHotelOutputHotel=Hotel Puerta de Valencia, http://localhost:8080/SearchCheapHotel/owl/owls/SearchCheapHotelProcess.owl #SearchCheapHotelOutputHotelCompany=NH 25
[Client] Valores devueltos. SearchCheapHotelOutputHotelCompany = NH SearchCheapHotelOutputHotel = Hotel Puerta de Valencia Client: Salir de THOMAS Client: LeaveRol = (REQUEST :sender ( agent-identifier :name Client@bowser:1099/JADE :addresses (sequence http://bowser.dsic.upv.es:7778/acc )) :receiver (set ( agent-identifier :name OMS@localhost :addresses (sequence http://localhost:8081 )) ) :content "http://localhost:8080/omsservices/OMSservices/owl/owls/LeaveRoleProcess.owl RoleID=member UnitID=virtual AgentID=Client@bowser:1099/JADE" :protocol fipa-request ) Client: OOH! OMS Has agreed to excute the service LeaveRol! Client: OMS AcquiereRol Status = Ok ErrorValue = <ErrorValue/> 26
Bibliograf´ıa [1] E. Argente, V. Botti, C. Carrascosa, A. Giret, V. Julian, and M. Rebollo. An Abstract Architecture for Virtual Organizations: The THOMAS approach. Knowledge and Information Systems, pages 1–35, 2011. [2] E. Argente, J. Palanca, G. Aranda, V. Julian, V. Botti, A. Garc´ıaFornes, and A. Espinosa. Supporting Agent Organizations. In 5th International Central and Eastern European Conference on Multi-Agent Systems (CEEMAS’07), volume 4696 of LNAI, pages 236–245. Springer, 2007. [3] Kaponis D. Artikis A. and Pitt J. Dynamic Specifications of NormGoverned Systems, chapter Multi-Agent Systems: Semantics and Dynamics of Organisational Models. V. Dignum, 2009. [4] Guido Boella, Joris Hulstijn, and Leendert W. N. Van Der Torre. Virtual organizations as normative multiagent systems. In Hawaii International Conference on System Sciences, 2005. [5] C. Carrascosa, A. Giret, V. Julian, M. Rebollo, E. Argente, and V. Botti. Service Oriented Multi-agent Systems: An open architecture. In Autonomous Agents and Multiagent Systems (AAMAS), pages 1291–1292, 2009. [6] Jacques Ferber, Olivier Gutknecht, and Fabien Michel. From agents to organizations: An organizational view of multi-agent systems. In AgentOriented Software Engineering, pages 214–230, 2003. [7] Ian T Foster. The anatomy of the grid: Enabling scalable virtual organizations. In Cluster Computing and the Grid, volume cs.AR/0103, pages 6–7, 2001. [8] A. Giret, V. Julian, M. Rebollo, E. Argente, C. Carrascosa, and V. Botti. An Open Architecture for Service-Oriented Virtual Organizations. In PROMAS 2009 Post-Proceedings, pages 1–15. Springer, 2010. 105