Está en la página 1de 43

Tutorial de JADE

Programación Orientada a Agentes

Departamento de Ingeniería de la Información y las Comunicaciones


Universidad de Murcia

Curso 2014 - 2015

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 1 / 43


Índice
1 Instalando JADE
El paquete JADE
JADE desde línea de comandos
JADE desde un IDE: NetBeans
2 Manejando agentes más complejos
Sistema multiagente para compra-venta de libros
Paso de parámetros
Finalización de un agente
3 Añadiendo tareas al agente
Añadiendo comportamientos al agente comprador
Creando el agente vendedor
4 Comunicación de Agentes
5 Localizando Agentes
6 Opciones avanzadas del RMA

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 2 / 43


El paquete Jade

La version 4.3.3 de JADE (Java Agents DEvelopment Framework) puede


descargarse de la siguiente dirección:

http://jade.tilab.com

Encontramos los siguientes paquetes para descargar:


JADE-all-4.3.3.zip: un zip que, a su vez, alberga los siguientes cuatro paquetes
que aparecen a continuación:
JADE-doc-4.3.3.zip: la documentacion javadoc, el manual del
administrador, el del programador y un tutorial
JADE-src-4.3.3.zip: el código fuente sin compilar
JADE-bin-4.3.3.zip: el código ya compilado y listo para ser interpretado
JADE-examples-4.3.3.zip: ejemplos de uso de la plataforma

Recomendación: descargar el paquete all que lo lleva todo y nos puede


ser de utilidad

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 3 / 43


Instalación
Una vez descargado descomprimimos el .zip en una carpeta de
nuestro directorio.
A su vez debemos descomprimir como mínimo el fichero
JADE-bin-4.3.3.zip pues contiene las librerías para poder ejecutar el
entorno
En el laboratorio de prácticas este software está instalado en Windows
en la carpeta C:\jade
Estructura de carpetas de JADE y localización de la librería
jade.jar:

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 4 / 43


JADE desde línea de comandos
Para ejecutar JADE desde la línea de comandos necesitamos:
Añadir a la variable de entorno PATH la localización del intérprete java que
queremos utilizar (java.exe y javac.exe)

C:\> set PATH="C:\Program Files\Java\jdk1.8.0\bin";%PATH%

Añadir a la variable CLASSPATH la localización de la librería principal de


JADE jade.jar

C:\> set CLASSPATH=.;c:\jade\lib\jade.jar;%CLASSPATH%

Probar el correcto funcionamiento de la plataforma lanzando su clase


principal (jade.Boot) y opcionalmente su interfaz gráfica (RMA) por medio
de la opción -gui

C:\> java jade.Boot -gui

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 5 / 43


Testeando la plataforma

De esta manera visualizaremos la venta gráfica del RMA y una serie de


mensajes por la consola de la interfaz de comandos:

Importante: para terminar el entorno de ejecución totalmente hay que usar


File > ShutDown desde la consola RMA

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 6 / 43


Creación de un agente

Para trabajar con agentes JADE se debe crear una clase para el agente que
herede de la clase jade.core.Agent e implemente como mínimo el método
setup()
Como recordamos setup() contendrá el código necesario para la
inicialización del agente; en nuestro caso se trata de un mensaje de
bienvenida acompañado de la identificación del agente:

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 7 / 43


Ejecutando agentes con JADE

Para ejecutar el agente recién creado haremos uso de la sintaxis de JADE


(ver Guía del Administrador para más detalles):

C:\> java jade.Boot -gui -agents a1:Agente

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 8 / 43


Ejecutando agentes con JADE

La interfaz gráfica de JADE también permite ejecutar agentes a través del


menú Actions > Start New Agent
Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 9 / 43
JADE desde un IDE: NetBeans

Para integrar JADE en NetBeans hay que seguir estos pasos:


Crear un proyecto nuevo con Archivo > Proyecto Nuevo y seleccionar el tipo
de proyecto Java Class Library (y no Java Application ya que nuestro
proyecto no hará uso de una clase principal Main)

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 10 / 43


Creación de un agente

Añadir una clase nueva para el agente con Archivo > Archivo nuevo y
seleccionar el tipo Java Class. Es recomendable no colocar las clases Java en
el paquete predeterminado así que podemos elegir para el paquete de clases
el mismo nombre que para el proyecto:

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 11 / 43


Configuración del proyecto
Para configurar el proyecto NetBeans para que ejecute la clase principal
JADE jade.Boot y opcionalmente el RMA hacemos click con el botón
secundario del ratón sobre el proyecto y elegimos Propiedades:
En la categoría Bibliotecas pulsamos sobre Añadir JAR/Carpeta e
introducimos la ruta de la librería jade.jar
En la categoría Ejecutar establecemos la clase principal jade.Boot y
pasamos los Argumentos necesarios para visualizar el RMA (-gui)

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 12 / 43


Añadiendo un agente desde el RMA

Como en esta ocasión el agente no ha sido lanzado como argumento del


entorno de ejecución lo podemos agregar desde la interfaz gráfica
seleccionando Actions > Start New Agent e insertando los parámetros
necesarios:

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 13 / 43


Añadiendo un agente desde el RMA

Si todo ha ido bien veremos añadido al agente en el RMA y su mensaje de


bienvenida por la consola de NetBeans:

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 14 / 43


Creación de un Sistema Multiagente

Vamos a crear un sistema multiagente para la compra-venta de libros:


Existirá un agente comprador que recibe una orden de compra por
parte del usuario al cual representa que le indica el título del libro a
comprar
El agente requerirá ofertas del libro a todos los agentes vendedores
que conoce, efectuando la compra de aquel libro más barato de entre
todas las ofertas que recibe

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 15 / 43


Pasando parámetros al agente
Para recoger los parámetros pasados al agente debemos usar Object[]
args = getArguments();
Ejemplo de un agente Comprador que dice su nombre y qué libro
intenta comprar:

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 16 / 43


Pasando parámetros al agente

Podemos pasar parámetros al agente configurando adecuadamente el


proyecto NetBeans o desde el propio RMA:

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 17 / 43


Finalización de la ejecución de un agente

Con el fin de terminar la ejecución de un agente, tendremos que


invocar al método doDelete()
Este método doDelete() llama a su vez al método takeDown() que
podemos redefinir para incluir código relativo a limpieza de elementos
del agente
Cambiemos el código de nuestro agente comprador de libros y en el
caso de que no haya ningun parámetro de entrada, finalizaremos el
agente
Antes de que finalize el agente, imprimiremos un mensaje de
finalización
Para probarlo, modificaremos los argumentos para lanzar JADE sin
indicar ningún título de libro

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 18 / 43


Solución

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 19 / 43


La clase Behaviour y las tareas de un agente

Las tareas que un agente hace se especifican por medio de


comportamientos
Podemos gestionar dichos comportamientos mediante la clase
Behaviour que podemos encontrar en
jade.core.behaviours.Behaviour
Para ello incluiremos en el agente una nueva clase creada para tal
efecto que ha de heredar de la clase Behaviour
Una vez implementada, es suficiente con que el agente invoque en el
cuerpo de acción el método addBehaviour perteneciente a la clase
Agent
Toda clase que herede de Behaviour deberá implementar el método
action() donde se debe incluir el código de las acciones
correspondientes. El método done() también se debe implementar

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 20 / 43


La clase Behaviour y las tareas de un agente
También podemos utilizar comportamientos ya predefinidos
Aparte de los Behaviour vistos en clase (OneShot, Cyclic...) podemos
encontrar en la API de JADE C:\jade\doc\api\index.html otras
implementaciones como WakerBehaviour o TickerBehaviour

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 21 / 43


Modificando el agente comprador

Añadamos un comportamiento TickerBehaviour para que cíclicamente


el vendedor envíe un Request a los posibles agentes vendedores
De momento hagamos que imprima un mensaje indicando su intención
de enviar el Request (posteriormente lo uniremos con un tipo de
comunicación)
Pongamos un timeout de 10 segundos

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 22 / 43


Solución

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 23 / 43


Creando el agente vendedor

Vamos a crear un agente que se dedique a vender libros con el fin de


poderlo comunicar con nuestro agente comprador
Ha de tener un catálogo de libros para la venta (usaremos la clase
Hashtable de Java)
Va a utilizar la clase InterfazVendedor que podéis obtener del Aula
Virtual
Va a tener un método actualizarCatalogo, que le permitirá mediante
un comportamiento OneShotBehaviour, añadir elementos en el
catálogo por medio de la interfaz gráfica
Cada vez que se inserte un libro se imprimirá un mensaje con el título
del libro y su precio

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 24 / 43


Creando el agente vendedor

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 25 / 43


Creando el agente vendedor

La interfaz gráfica permitirá al agente vendedor introducir pares


título/precio en su catálogo

Ojo, al cerrar la ventana que captura los datos la ejecución del agente
vendedor finaliza y abandona la plataforma de agentes... ¿por qué
ocurre esto?
Trata de evitarlo modificando el código. Pista: la ejecución de un
agente finaliza cuando se invoca su método doDelete()

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 26 / 43


Tareas del agente comprador
Crearemos un comportamiento en el comprador y lo añadiremos en
TickerBehaviour, para que se ejecute cada cierto tiempo: RequestPerformer
Todos los comportamientos JADE incorporan la variable myAgent accesible
desde dentro de los comportamientos para acceder a los datos del agente

Declararemos la clase RequestPerformer como una clase interna (inner class)


a la clase Comprador en la que habrá que sobreescribir como mínimo los
métodos action() y done()

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 27 / 43


Tareas del agente vendedor
Crearemos y añadiremos dos comportamientos en el vendedor:
OfferRequestsServer y PurchaseOrdersServer, para la oferta y para la gestión
de compra de libros respectivamente
Añadimos los dos comportamientos anteriormente mencionados para el
vendedor

Declararemos las clases OfferRequestsServer y PurchaseOrdersServer como


clases internas a la clase Vendedor

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 28 / 43


Comunicación de los agentes

Queremos implementar un acto comunicativo del tipo Call for Proposal tal y
como especifica el protocolo de interacción fipa-contract-net de FIPA:
El comprador envía CFP a los posibles vendedores para preguntar por
ofertas del libro que busca
La performativa PROPOSE puede ser usada para los mensajes
portando las ofertas del vendedor
Si el vendedor no tiene el libro enviará la performativa REFUSE
La performativa ACCEPT_PROPOSAL puede ser usada para llevar los
mensajes de aceptación de compra
Cuando el vendedor ha recibido el ACCEPT_PROPOSAL, bien enviará
un INFORM si la compra se puede llevar a cabo o un FAILURE si hay
algún problema
Usaremos para ello los comportamientos RequestPerformer ,
OfferRequestsServer y PurchaseOrdersServer indicados en la sección anterior

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 29 / 43


Comunicación del agente comprador

Usamos la clase jade.lang.acl.ACLMessage para componer los mensajes


(ver documento “La Plataforma JADE”)
Componemos el mensaje que se enviará a todos los agentes vendedores
(performativa CFP) por parte del comprador dentro de su comportamiento
RequestPerformer

Como observamos podemos añadir tantos receptores como deseemos (de momento
conocemos la identidad de los receptores, posteriormente consultaremos en el DF
sus identidades)
ISLOCALNAME es un valor booleano de la clase AID para indicar si el nombre de
agente es local o no a la plataforma de agentes

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 30 / 43


Comunicación del agente vendedor
El agente vendedor debe mirar en su cola de mensajes y obtener con receive() el primero
de ellos como parte de su comportamiento OfferRequestsServer

Para asegurarnos que el mensaje que queremos recuperar de la cola de mensajes es del
tipo CFP haremos uso de las plantillas disponibles en jade.lang.acl.MessageTemplate

Además incorporamos el método block() que bloquea el comportamiento del agente si no


hubiera mensajes en su cola ya que al tratarse de un comportamiento cíclico el agente
estaría continuamente activando y desactivando el comportamiento mientras no llegara un
mensaje lo que consumiría una gran cantidad de CPU para no hacer nada útil
Cuando un mensaje llega a la cola de mensajes todos los comportamientos
bloqueados se vuelven a reactivar automáticamente por el scheduler
Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 31 / 43
Código del OfferRequestsServer
Podemos observar el código del comportamiento OfferRequestsServer
del agente vendedor una vez completado (performativas PROPOSE y
REFUSE )

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 32 / 43


Código del PurcharseOrdersServer
El código del comportamiento PurchaseOrdersServer es similar al
anterior (performativas INFORM y FAILURE )

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 33 / 43


Código del RequestPerformer
Para completar el comportamiento RequestPerformer del agente comprador
(performativas CFP y ACCEPT_PROPOSAL) vamos a manejar las distintas
etapas de la tarea (envío de peticiones de ofertas, recogida de las mismas y
aceptación de una oferta) de tal manera que la finalización del comportamiento
estará controlada por una estructura switch y el método done()

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 34 / 43


Código del RequestPerformer

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 35 / 43


Código del RequestPerformer

Vamos a probarlo todo lanzando un vendedor y dos compradores:


-agents comprador:agentes.Comprador(Mortadelo);vendedor-1:agentes.Vendedor;
vendedor-2:agentes.Vendedor

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 36 / 43


Necesidad de Facilitador de Directorio (DF)

Hasta ahora hemos asumido que conocemos los identificadores de los


vendedores, pero por lo general esto no es así
Para poder facilitar la busqueda de agentes sin conocer sus
identificadores tendremos que hacer uso del DF
Cada vendedor se tiene que registrar en el DF (recordemos que el DF
es un agente más) manejado por las clases
jade.domain.FIPAAgentManagement.DFAgentDescription y
jade.domain.FIPAAgentManagement.ServiceDescription
El agente crea un objeto (en el ejemplo, dfd) que responde a una
entrada de directorio con los datos del agente
A su vez, este objeto contiene una o más descripciones de servicios (en
el ejemplo, sd) identificados por su nombre y tipo de servicio

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 37 / 43


Necesidad de Facilitador de Directorio (DF)
Ejemplo de registro en el DF:

De la misma forma, cuando el agente finalice su ejecución deberá


desuscribirse del DF:

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 38 / 43


Buscando agentes con servicios

En nuestro ejemplo anterior el comprador manda peticiones de cfp a


varios agentes
Por tanto, el comprador debe ahora hacer la búsqueda en el DF cada
vez que lance la petición de libros

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 39 / 43


Buscando agentes con servicios

Donde declaramos un atributo privado más para gestionar la lista de


vendedores
private AID[] vendedores;

Y modificamos la manera de identificar los vendedores en nuestro


comportamiento RequestPerformer:

cambia a:

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 40 / 43


Analizando la información del Sniffer
Podemos cargar la herramienta Sniffer que encontramos en el menú
Tools del RMA
Mediante la ventana del Sniffer (recordar, un agente más) podemos añadir
cada uno de los componentes que queremos analizar seleccionándolo de la
lista de agentes del container y haciendo clic en el icono con un botón rojo
(Do sniff this agent)

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 41 / 43


Analizando la información del Sniffer

Al terminar la ejecución podremos ver el intercambio de mensajes y


así comprobar que nuestro protocolo está bien implementado

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 42 / 43


Bibliografía I

Jade Programming for Beginners

Prog. Orientada a Agentes (UMU) Tutorial de JADE Curso 2014 - 2015 43 / 43

También podría gustarte