tutorial del jade

21
 Tutorial b´ asico de JADE  * Escuela de Primavera de Agentes Patrocinado por Agentcities.es Imagin´ atica 2005, Universidad de Sevilla Jua n A. Bot´ ı a Blaya 19 de febrero de 2005 1. Inst al ac on La versi´ on 3.2 de JADE (Java Agents Development Environment ) puede bajarse de la siguiente direcci´ on http://jade.tilab.com aunque para hacerlo hay que rellenar un formulario. Si quereis instalarla en casa debere is h acerlo as´ ı. La distribu ci´on est´ a dividida en varios cheros  zip  que son los siguientes: JADE-all-3.2.zip: un zip que, a su vez, alberga los siguientes cuatro chero que aparecen a continuaci´ on. JADE-doc-3.2.zip: la do cumentaci´ on javadoc, el manual del administrador, el del programador y un tutorial. JADE-src-3.2.zip: el c´ odigo fuente sin compilar. JADE-bin-3.2.zip: el c´ odigo ya compilado y listo para ser interpretado. JADE-examples-3.2.zip: ejemplos de uso de la plataforma. Lo ´ unico que necesita JADE para funcionar es una versi´ on correcta del Java Run Time Environment, la 1.4. Una vez hemos obtenido en nuestra cuenta el chero  JADE-all-3.2.zip , creamos un directorio a parte para jade, colocamos all´ ı l a dist ribuci ´ on y hacemos: * Traducci´on al castellano del Tutorial Jade for beginners que acompa˜ na a la distribuci´ on de JADE 3.2. 1

Upload: ilusionista182

Post on 08-Jul-2015

390 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 1/21

Tutorial basico de JADE *

Escuela de Primavera de Agentes

Patrocinado por Agentcities.es

Imaginatica 2005, Universidad de Sevilla

Juan A. Botıa Blaya

19 de febrero de 2005

1. Instalacion

La version 3.2 de JADE (Java Agents Development Environment ) puedebajarse de la siguiente direccion

http://jade.tilab.com

aunque para hacerlo hay que rellenar un formulario. Si quereis instalarla en casadebereis hacerlo ası. La distribucion esta dividida en varios ficheros zip que son

los siguientes:

JADE-all-3.2.zip: un zip que, a su vez, alberga los siguientes cuatro ficheroque aparecen a continuacion.

JADE-doc-3.2.zip: la documentacion javadoc, el manual del administrador,el del programador y un tutorial.

JADE-src-3.2.zip: el codigo fuente sin compilar.

JADE-bin-3.2.zip: el codigo ya compilado y listo para ser interpretado.

JADE-examples-3.2.zip: ejemplos de uso de la plataforma.

Lo unico que necesita JADE para funcionar es una version correcta del JavaRun Time Environment, la 1.4. Una vez hemos obtenido en nuestra cuenta elfichero JADE-all-3.2.zip, creamos un directorio a parte para jade, colocamosallı la distribucion y hacemos:

*Traduccion al castellano del Tutorial Jade for beginners que acompana a la distribucion

de JADE 3.2.

1

Page 2: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 2/21

>unzip JADE-all-3.2.zip

>unzip JADE-doc-3.2.zip>unzip JADE-src-3.2.zip

>unzip JADE-bin-3.2.zip

>unzip JADE-examples-3.2.zip

y ya esta todo el software desplegado.Como podra comprobarse se ha creado un directorio jade y bajo este direc-

torio un directorio lib que es en donde estan los jars necesarios para ejecutarla plataforma.

2. Arquitectura de JADE

Como sabeis, JADE responde a los estandares FIPA de organizacion delsistemas multi-agente y de comunicacion entre agentes. Esto quiere decir quelas especificaciones que incluye la arquitectura abstracta se van a encontrartambien aquı.

Segun FIPA, los agentes son entidades software que estan localizadas en unaunica plataforma. Una plataforma de agentes es un entorno de ejecuci on endonde los agentes estan ejecutandose y a traves del cual disponen de un serviciode paginas blancas para buscar otros agentes, un servicio de paginas amarillaspara buscar servicios que otros agentes ofrecen, un modulo de gestion a traves delcual se accede a estas facilidades y por ultimo un sistema de envıo/recepcion demensajes mediante el cual el AMS puede hacer llegar a su destino los mensajesgenerados por los agentes ubicados en la misma plataforma.

A parte de todos estos detalles propios de FIPA, JADE incluye la nocion decontenedor. Un contenedor es una instancia del entorno de ejecucion de JADE.En un contenedor es posible albergar un numero indeterminado de agentes. Ex-iste un tipo especial de contenedor denominado principal  (i.e. main container).Debe existir uno y solo uno de estos contenedores por cada plataforma FIPA deagentes y el resto de contenedores de la plataforma, una vez ejecutados (i.e. unavez ejecutado el correspondiente entorno de ejecucion JADE) deben subscribirseal principal, por lo que el responsable de ejecutarlos tambien es responsable deindicar en donde se localiza el contenedor principal. Vamos a aclarar todos es-tos conceptos con la figura 1, extraida del manual del administrador de JADEVease como en la plataforma numero 1 existen tres contenedores. En el princi-pal estan los elementos imprescindibles de cualquier plataforma FIPA, el AMSy el DF (este ultimo opcional en la recomendacion correspondiente aunque enJADE esta siempre disponible). Tambien existe un agente, el A1. Dentro deesta misma plataforma hay otros dos containers normales, el de la izquierdaalbergando al agente A4 y el de la derecha a los agentes A2 y A3. La segundaplataforma esta unicamente formada por un contenedor principal y no mas, al-bergando tambien el correspondiente sistema gestor de agentes y el DF, juntocon el agente A5. Todos los agentes de la figura pueden comunicarse, siempreque cada agente que quiere hacerlo sepa el nombre del agente con quien lo quiere

2

Page 3: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 3/21

Figura 1: Ejemplo en el que aparecen varios contenedores, distribuidos en suscorrespondientes plataformas

hacer. Por ejemplo, los agentes A2 y A3, en el mismo contenedor pueden comu-nicarse. Tambien pueden hacerlo los agentes A1 y A2, en distintos contenedoresde la misma plataforma. Por ultimo, tambien pueden A4 y A5, en distintasplataformas.

3. El ejemplo del tutorial

En el tutorial “JADE Programming for Beginners” aparece un ejemplo deun entorno de compra-venta de libros. Vamos a seguir en la primera pr acticaeste tutorial. En ese entorno, existen unos agentes que venden libros y otros quelos compran, en representacion de sus correspondientes usuarios.

Los agentes compradores reciben ordenes de los usuarios a traves de la lıneade comandos. De tal forma que cuando un usuario quiere comprar un libro,introduce su tıtulo de esa manera. Tras esto, el agente requiere ofertas del librode todos los agentes vendedores que conoce, periodicamente. El algoritmo esbastante simple pues se compra el libro al agente que manda la primera oferta.Si mas de un agente manda una oferta, el comprador elige aquella con el preciomas barato. Una vez comprado el libro, el agente comprador finaliza su ejecucion.

Cada agente vendedor va a tener una interface mınima, a traves de la cualse le pueden indicar los tıtulos que puede vender y sus correspondientes precios.Este tipo de agente espera indefinidamente peticiones de compra de los corre-spondientes agentes compradores. Cuando se le pide una oferta sobre un libro,lo busca en su catalogo local y si lo tiene, responde con el precio. Si no, rechazala peticion. Una vez se ha vendido un libro, lo elimina de su catalogo.

Observese que en la distribucion de JADE existıa un fichero zip con el nombreJADE-examples-3.2.zip. Al desplegarlo podemos encontrar este ejemplo en elpaquete de codigo Java

3

Page 4: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 4/21

examples.bookTrading

4. Creando los agentes JADE

Para trabajar con agentes se debe conocer mas o menos a fondo la clase

jade.core.Agent

ya que para crear un agente JADE se debe crear una nueva clase de agente queherede de esta y que como mınimo implemente el metod setup(). Vease comose crea un agente comprador, mınimamente, con el siguiente codigo:

import jade.core.Agent;

public class BookBuyerAgent extends Agent {

protected void setup() { // Printout a welcome message

System.out.println(‘‘Hallo! Buyer-agent ‘‘ + getAID().getName()

+ ‘‘ is ready.’’);

}

}

El metodo setup() se ejecuta cuando se va a lanzar el agente para su ejecuciony unicamente debe contener codigo relativo a tareas de inicializacion. Por lotanto, de momento, el agente no va a hacer absolutamente nada m as que emitirese mensaje cuando se lance.

4.1. Identificadores de agentesComo ya sabemos de la norma FIPA, cada agente debe tener un nombre,

que forma parte de la descripcion del agente que, a su vez, contiene mas datosrelativos a como mandarse mensajes.

En JADE, la descripcion del agente, el AID (Agent Identifier ) tiene su cor-respondiente clase java, la clase

jade.core.AID

a partir de la cual se pueden manejar los nombres y las demas informaciones confacilidad. La clase Agent incorpora el metodo getAID() que permite recuperarel nombre del agente. El nombre del agente, un identificador unico globalmente,va a tener la estructura

<nickname>@nombre-plataforma>

Por lo tanto, el agente A1, localizado en la plataforma P1 va a tener el nom-bre A1@P1. Hablando de las direcciones que forman parte del AID, solamentetendremos que preocuparnos de ellas cuando el agente con el que queramos con-tactar este en otra plataforma. Una vez que conocemos el nombre de pila de unagente, su AID puede obtenerse de la siguiente manera:

4

Page 5: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 5/21

String nickname = A1;

AID id = new AID(nickname, AID.ISLOCALNAME);en donde con el argumento AID.ISLOCALNAME indicamos que el primer argu-mento es el nombre de pila y no el nombre unico globalmente.

4.2. Ejecucion de agentes en JADE

Una vez hemos creado el agente, ya estamos en condiciones de compilarlo.Ejecutamos:

javac -classpath <jars de jade> BookBuyerAgent.java

Y ya esta.Ahora ya podemos ejecutarlo. Para eso, tenemos que lanzar la plataforma

pasandole como argumentos el nombre de pila del agente y, por supuesto, laclase Java en donde se implementa tal que ası:

java -classpath <jars de jade> jade.Boot comprador:BookBuyerAgent

El resultado es el siguiente:

This is JADE snapshot - 2003/10/24

13:43:39 downloaded in Open Source, under LGPL restrictions, at

http://jade.cselt.it/

IOR:000000000000001149444C3A464950412F4D54533A312E30000000

00000000010000000000000060000102000000000A3132372E302E302E

310009A600000019AFABCB0000000002BCE5528F000000080000000000

0000000A0000000000000100000001000000200000000000010001000000020501000100010020000101090000000100010100

Agent container Main-Container@JADE-IMTP://maquina.dif.um.es is ready.

Hallo! Buyer-agent [email protected]:1099/JADE is ready.

La primera parte del mensaje impreso en pantalla es la informaci on que JADEsiempre genera sobre la licencia del software y dem as. Dado que el protocolode comunicacion por defecto entre plataformas es IIOP, como ya mencionamosen clase, lo que se genera a continuacion es la direccion IIOP en forma de IORdel correspondiente objeto distribuido de la plataforma con el que nos podemoscomunicar remotamente.

Lo que aparece seguidamente es la indicacion de que el contenedor principal

esta listo. y que esta corriendo en la maquina del departamento de informaticade la UMU. El siguiente mensaje viene de la ejecucion del metodo setup() delagente comprador lo que indica que esta todo listo. Observese que, aunque elagente no va a hacer nada mas, permanece ejecutandose hasta que se invocael metodo doDelete(). Este metodo llama a su vez a takeDown() que podeisredefinir para incluir codigo relativo a limpieza de elementos del agente.

5

Page 6: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 6/21

4.3. Pasando valores a un agente

Dado que el agente comprador debe saber el tıtulo del libro que tiene quecomprar, esto ha de indicarsele de alguna forma. Vamos a ver como podemoshacerlo de manera facil mediante el empleo de un array de objetos que llevaincorporado la clase Agent. Vamos a modificar el codigo de nuestro compradorcomo sigue:

import jade.core.Agent;

import jade.core.AID;

public class BookBuyerAgent extends Agent {

// The title of the book to buy

private String targetBookTitle;

// The list of known seller agents

private AID[] sellerAgents = {

new AID(‘‘seller1’’, AID.ISLOCALNAME),

new AID(‘‘seller2’’, AID.ISLOCALNAME)};

// Put agent initializations here

protected void setup() {

// Printout a welcome message

System.out.println(‘‘Hallo! Buyer-agent ‘‘ + getAID().getName() +

‘‘ is ready.‘‘);

// Get the title of the book to buy as a start-up argument

Object[] args = getArguments();

if (args != null && args.length > 0){

targetBookTitle = (String) args[0];

System.out.println( Trying to buy +targetBookTitle);

} else

{

// Make the agent terminate immediately

System.out.println( No book title specified );

doDelete();

}

}

// Put agent clean-up operations here protected voidtakeDown() {

// Printout a dismissal message

System.out.println(‘‘Buyer-agent ‘‘ + getAID().getName() + ‘‘

terminating.’’);

}

}

6

Page 7: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 7/21

La parte que tiene que ver con la recogida de argumentos est a en el metodo

setup(). Vease que el metodo getArguments() que devuelve un Object[] esel que proporciona los argumentos. Para que no haya ningun problema, el lectorde los argumentos debe saber el numero y el tipo de cada uno de los argumentos.

Ahora ha llegado el momento de compilar y ejecutar:

C:\jade>java jade.Boot buyer:BookBuyerAgent(The-Lord-of-the-rings)

This is JADE snapshot - 2003/10/24 13:43:39

downloaded in Open Source, under LGPL restrictions, at

http://jade.cselt.it/

IOR:000000000000001149444C3A464950412F4D54533A312E30000000000000000

1000000000000 0060000102000000000A3132372E302E302E310009A600000019A

FABCB0000000002BCE5528F0000 000800000000000000000A00000000000001000

00001000000200000000000010001000000020501 0001000100200001010900000

00100010100Agent container Main-Container@JADE-IMTP://IBM8695 is ready.

Hallo! Buyer-agent buyer@IBM8695:1099/JADE is ready.

Trying to buy The-Lord-of-the-rings

5. Especificando tareas mediante los comportamien-

tos JADE

Las tareas o servicios que un agente hace realmente se especifican en compor-tamientos. Un comportamiento (i.e. behaviour) hace referencia a una funcional-idad que incorpora el agente. El codigo JAVA que implementa esa funcionalidad

se incluye en una nueva clase creada para tal efecto, que ha de heredar de laclase

jade.core.behaviours.Behaviour

Una vez que se ha implementado, es suficiente para que el agente ejecute esecomportamiento que se invoque, en el cuerpo de accion del agente el metodoaddBehaviour perteneciente a la clase Agent. Toda clase que herede de la decomportamiento debera implementar el meotod action() en donde se debeincluir el codigo de las acciones correspondientes. Tambien el metodo done() sedebe implementar. Devuelve un booleano y sirve al agente para determinar siel comportamiento ha finalizado o no. Debera devolver true en ese caso.

Podemos pensar que los behaviours son como los hilos de ejecucion JAVA.Igual que las threads en Java, en un agente pueden ejecutarse a la vez tantoscomportamientos como sea necesario. Sin embargo, a diferencia de las threadsen JAVA, el decidir que comportamiento se ejecuta en cada momento es tareanuestra (en JAVA lo decide la maquina virtual). Esto es ası para que cada agenteequivalga unicamente a un unico thread, con el consiguiente ahorro de ciclos deCPU y memoria que esto implica. En la figura 5 puede verse el camino por elque atraviesa un agente desde que comienza su ejecucion hasta que finaliza y seelimina. Como puede verse, lo primero a ejecutar es el metodo setup(). Tras

7

Page 8: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 8/21

Figura 2: El ciclo de ejecucion de un agente

esto se comprueba que el agente sigue vivo y despues se selecciona el siguientecomportamiento a ejectuar del conjunto de comportamientos que aun le quedan

por ejecutar al agente. Se ejecuta su metodo b.action() y tras esto se preguntasi ha finalizado. Es posible que no lo haya hecho ya que un comportamientopuede ser o un simple trozo de codigo que se ejecuta una sola vez o bien variasveces dependiendo de otros factores. Si esta ejecutado se elimina del conjuntode comportamientos del agente y no vuelve a ejecutarse. En todo caso, se vuelvea comenzar. Con todo esto, tengase en cuenta que un comportamiento como elsiguiente

public class OverbearingBehaviour extends Behaviour

{

public void action() {

while (true) {

// do something

}}

public boolean done() {

return true;

}

}

8

Page 9: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 9/21

causa que el agente no ejecute ningun comportamiento mas durante toda su

ejecucion ya que el metodo action() no finaliza nunca.

5.1. Algunos comportamientos utiles

Podemos agrupar los behaviours JADE en tres grandes grupos:

1. Comportamientos one-shot : tipos de comportamiento los cuales se ejecu-tan de manera casi instantanea, y solamente una vez.

2. Comportamientos cıclicos: son aquellos que nunca son sacados del conjuntode comportamientos del agente y cuyo metodo action() siempre ejecutael mismo codigo. Por lo tanto, nunca finalizan.

3. Comportamientos genericos: algo mas complejos, el codigo que se ejcu-

ta en ellos depende del estatus del agente, y eventualmente finalizan suejecucion.

El siguiente es un ejemplo de comportamiento one-shot :

public class MyOneShotBehaviour extends OneShotBehaviour

{

public void action() {

// perform operation X

}

}

y el siguiente un comportamiento de tipo cıclico: public class MyCyclicBehaviour

extends CyclicBehaviour public void action() // perform operation Y en elque, en teorıa, habrıa que implementar el metodo done() de tal forma quedevolviera false pero ya lo implementa la clase CyclicBehaviour.

Por ultimo, un ejemplo de comportamiento generico:

public class MyThreeStepBehaviour extends Behaviour

{

private int step = 0;

public void action() {

switch (step) {

case 0:

// perform operation X

step++;break;

case 1:

// perform operation Y

step++;

break;

case 2:

9

Page 10: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 10/21

// perform operation Z

step++;break;

}

}

public boolean done() {

return step == 3;

}

}

Otro tipo de comportamientos JADE son los compuestos, que permiten com-binar comportamientos previamente definidos de manera conveniente para apli-carles un orden de ejecucion determinado como secuencial con SequentialBehaviour,

en paralelo con ParallelBehaviour y guiados mediante un automata finito de-terminista con FSMBehaviour. Vease el manual del programador de JADE parauna descripcion de estos comportamientos.

Otros tipos de comportamientos interesantes son WakerBehaviour y TickerBehaviour.Tienen en comun que su ejecucion es diferida. Se invocan y guardan hasta quese ha cumplido un determinado time-out. El primer solamente se ejecuta unavez y el segundo es un comportamiento cıclico.

El siguiente agente incorpora un comportamiento del primer tipo, el cual seejecutara despues de 10 segundos:

public class MyAgent extends Agent {

protected void setup() {

System.out.println(‘‘Adding waker behaviour’’);

addBehaviour(new WakerBehaviour(this, 10000) {protected void handleElapsedTimeout() {

// perform operation X

}}

);

}

}

Observese que ahora, en lugar de implementar el metodo action(), es el metodohandleElapsedTimeOut() el que albergara el codigo a ejecutar tras el cumplim-iento del tiempo.

Un agente con el comportamiento TickerBehaviour se programara de man-era similar:

public class MyAgent extends Agent {

protected void setup() {

addBehaviour(new TickerBehaviour(this, 10000) {

protected void onTick() {

// perform operation Y

}}

10

Page 11: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 11/21

);

}}

y el codigo a ejecutar cıclicamente se incluira en el metodo onTick().

5.2. Comportamientos del agente comprador

Recordemos que el agente comprador tiene un comportamiento cıclico, encar-gado de preguntar al agente vendedor si tiene el libro que desea comprar. Puespara esa parte de su comportamiento global anadiremos un TickerBehaviour,en el metodo setup() del agente comprador tal que ası:

protected void setup() {

// Printout a welcome message

System.out.println(‘‘Hallo! Buyer-agent ‘‘ + getAID().getName() +

‘‘ is ready.’’);

// Get the title of the book to buy as a start-up argument

Object[] args = getArguments();

if (args != null && args.length > 0)

{

targetBookTitle = (String) args[0];

System.out.println(‘‘Trying to buy ‘‘ + targetBookTitle);

// Add a TickerBehaviour that schedules a request to seller agents

//every minute

addBehaviour(new TickerBehaviour(this, 60000) {

protected void onTick() {

  myAgent.addBehaviour(new RequestPerformer());}}

);

} else

{

// Make the agent terminate

System.out.println(‘‘No target book title specified’’);

doDelete();

}

}

Observese que ahora estamos utilizando una variabe, myAgent, accesible dentrodel comportamiento. Todos los comportamientos JADE incorporan esta vari-able para acceder a los datos del agente que esta ejecutandolo en tiempo deejecucion. Este codigo se va a encargar de ejecutar cuando procede el metodoRequestPerformer() que es el que incorpora la logica encargada de contactarcon el vendedor e intentar comprar el libro que se pasa como argumento.

11

Page 12: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 12/21

5.3. Comportamientos del agente vendedor

El agente vendedor es un poco mas complicado que el comprador ya que,basicamente, debe realizar dos tareas. Una para responder a la pregunta de si sedispone o no del libro que el comprador quiere comprar. La otra encargada deejectuar la venta del libro. Para cada una de esas tareas vamos a implementarsendos comportamientos cıclicos e independientes. El como estan programadoscada uno de los comportamientos lo veremos posteriormente.

import jade.core.Agent;

import jade.core.behaviours.*;

import java.util.*;

public class BookSellerAgent extends Agent {

// The catalogue of books for sale

//(maps the title of a book to its price)private Hashtable catalogue;

// The GUI by means of which the user can add books in

//the catalogue

private BookSellerGui myGui;

// Put agent initializations here

protected void setup() {

// Create the catalogue

catalogue = new Hashtable();

// Create and show the GUI  myGui = new BookSellerGui(this);

 myGui.show();

// Add the behaviour serving requests for

//offer from buyer agents

addBehaviour(new OfferRequestsServer());

// Add the behaviour serving purchase orders from

//buyer agents

addBehaviour(new PurchaseOrdersServer());

}

// Put agent clean-up operations here

protected void takeDown() {

// Close the GUI

 myGui.dispose();

// Printout a dismissal message

System.out.println(‘‘Seller-agent ‘‘ + getAID().getName() +

‘‘ terminating.’’);

12

Page 13: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 13/21

Figura 3: Esquema de transferencia asıncrona de mensajes en JADE

}

/** This is invoked by the GUI when the user adds a new book forsale */

public void updateCatalogue(final String title, final int price) {

addBehaviour(new OneShotBehaviour() {

public void action() {

catalogue.put(title, new Integer(price));

}

}

);

}

}

Como podemos comprobar, el ejemplo se va complicando poco a poco. Observeseque se han anadido dos nuevos comportamientos que son

OfferRequestsServer() y el PurchaseOrdersServer()

que se encargan de servir las ofertas a peticion de los compradores y de servir lascompras, tambien a peticion de los compradores, respectivamente. El metodoupdateCatalogue() se encarga de anadir un comportamiento de tipo one-shot

anadiendo un nuevo tıtulo al catalogo. Este metodo se invoca desde el interface,que se implementa facilmente mediante una clase JADE, y se encarga anadir elnuevo tıtulo, introducido desde la correspondiente ventana.

5.4. Como los agentes comprador y vendedor se comuni-

can entre sıJADE sigue el estandar FIPA. Como tal es capaz de hacer que mensajes

del tipo ACL puedan intercambiarse entre los agentes implicados, a traves delAMS (Agent Management System ) y mediante un protocolo estandar como, porejemplo, IIOP.

El esquema de envıo de mensa jes en JADE responde al de la figura 3. Comopuede verse, en la figura aparece una cola de mensajes por cada agente. Cuand

13

Page 14: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 14/21

un mensaje llega al agente, solamente tiene que mirar en su cola de mensajes y

extraerlo de ahı.Para mandar mensajes en JADE, teniendo en cuenta como estan definidoslos mismos en FIPA, se debe hacer uso de la clase ACLMessage como en elejemplo siguiente:

ACLMessage msg = new ACLMessage(ACLMessage.INFORM);

  msg.addReceiver(new AID(‘‘Peter’’, AID.ISLOCALNAME));

 msg.setLanguage(‘‘English’’);

 msg.setOntology(‘‘Weather-forecast-ontology’’);

  msg.setContent(‘‘Today it s raining’’ );

send(msg);

en el que, como puede verse, el acto comunicativo es del tipo inform, se envıa

al agente Peter, en lenguaje de contenido del mensaje es ingles natural, laontologıa respectiva es Weather-forecast-ontology, y el mensaje es el queaparece en la penultima lınea de codigo. Para mandar el mensaje hacemos usodel metodo send() de la clase Agent.

Si volvemos al ejemplo de compra-venta de libros, el agente comprador nece-sita un tıtulo para el usuario. Por lo tanto, debe buscarlo entre todos los posiblesvendedores. Por ello, podemos hacer uno de un acto comunicativo del tipo cfp

que se habra de enviar a todos los agentes vendedores tal que ası:

// Message carrying a request for offer ACLMessage

cfp = new ACLMessage(ACLMessage.CFP);

for (int i = 0; i < sellerAgents.lenght; ++i) {

cfp.addReceiver(sellerAgents[i]);

}cfp.setContent(targetBookTitle);

 myAgent.send(cfp);

Observese que podemos anadir al mensaje tantos receptores como deseemosantes de enviarlo.

Ahora, para que el agente vendedor reciba las posibles ofertas, simplementedebe mirar en su cola de mensajes y coger el primero de ellos con el metodoreceive():

ACLMessage msg = receive();

if (msg != null) {

// Process the message

}

teniendo en cuenta que el metodo mencionado no es bloqueante y, por lo tanto,si no se dispone de ningun mensaje en la cola, devolvera un valor nulo.

Siguiendo este sencillo ejemplo podemos programar el comportamiento cor-respondiente a OfferRequestServer que se encarga de responder a peticiones delibros de agentes compradores con el correspondiente precio, si es que esta disponibleen el catalogo:

14

Page 15: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 15/21

/** Inner class OfferRequestsServer.

This is the behaviour used by Book-seller agents to serveincoming requests for offer from buyer agents. If the

requested book is in the local catalogue the seller agent

replies with a PROPOSE message specifying the price.

Otherwise a REFUSE message is sent back. */

private class OfferRequestsServer extends CyclicBehaviour {

public void action() {

ACLMessage msg = myAgent.receive();

if (msg != null) {

// Message received. Process it

String title = msg.getContent();

ACLMessage reply = msg.createReply();

Integer price = (Integer) catalogue.get(title);if (price != null) {

// The requested book is available for sale.

// Reply with the price

reply.setPerformative(ACLMessage.PROPOSE);

reply.setContent(String.valueOf(price.intValue()));

} else

{

// The requested book is NOT available for sale.

reply.setPerformative(ACLMessage.REFUSE);

reply.setContent( not-available );

}

 myAgent.send(reply);}

}

} // End of inner class OfferRequestsServer

Observese que al ser un comportamiento cıclico y receive() un metodo nobloqueante, el agente estarıa constantemente activando y desactivando el com-portamiento mientras que no llegara un mensaje. Este proceso puede consumiruna gran cantidad de CPU para hacer absolutamente nada util. Lo que aconse- jan los programadores de JADE para evitar esto es utilizar el metodo block()

de la clase Agent. Con este metodo bloqueamos el comportamiento desde el cualse llama, sacandolo de la lista de comportamientos aun activos. Una vez que lle-ga un mensaje a la cola del agente, todos los comportamientos bloqueados se

vuelven a introducir al pool del agente correspondiente y vuelven a ser activos.El esquema serıa

public void action() {

ACLMessage msg = myAgent.receive();

if (msg != null) {

// Message received. Process it ...

} else

15

Page 16: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 16/21

{

block();}

}

Un detalle que no hemos mencionado es el metodo ACLMessage.createReply(),que resulta muy util ya que se encarga de crear un mensaje de respuesta corre-spondiente al mensaje instancia desde el que se invoca el metodo actualizandoconvenientemente el receptor del mensaje y los parametros conversation-id,reply-with y in-reply-to cuando sea conveniente.

Un detalle que debemos tener en cuenta ahora nos va a servir para ir refinan-do la manera en la que los agentes manejan los mensajes que reciben ¿Os habeispreguntado ya como puede el agente estar seguro que el mensaje que obtienede la cola es del tipo que desea? Observese que en el comportamiento anteri-

or, se escoge el primer mensaje de la cola y no se comprueba que sea del tipocfp para ası responder convenientemente a la peticion de oferta con el preciodel libro. La situacion podrıa ser incluso mas compleja ya que podrıamos estarhablando de varios protocolos diferentes y que ambos usaran cfp por lo que nosolamente habrıa que distinguir la performativa sino el protocolo para que elcomportamiento correspondiente manejara el mensaje. Por otro lado, no bastacon sacar el mensaje de la cola y comprobar que corresponde al que esperamossino que ademas, si el mensaje no es el que buscamos, se debe conservar paraque otros comportamientos lo manejen cuando proceda. Para manejar todo estodisponemos de la clase

jade.lang.acl.MessageTemplate

Una plantilla es una especie de patron mediante la cual podemos especificar

el tipo de mensaje que queremos recivir, como en el siguiente ejemplo:

public void action() {

MessageTemplate mt =

MessageTemplate.MatchPerformative(ACLMessage.CFP);

ACLMessage msg = myAgent.receive(mt);

if (msg != null) {

// CFP Message received. Process it ...

} else {

block();

}

}

El manejo de plantillas puede ser mas complejo pudiendose construir plantil-las complejas en forma de expresiones logicas con conectivas OR y AND, yespecificandose matchings especıficos para cualquier parametro del mensaje. Elcorrespondiente javadoc es bastante ilustrativo.

Para terminar con el envıo y recepcion de mensajes, vamos a ver una con-versacion compleja, correspondiente al comportamiento que implementa el envıode peticiones de ofertas, recoge todas las posibles ofertas y acepta una ofertadeterminada cuando proceda:

16

Page 17: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 17/21

/** Inner class RequestPerformer. This is the behaviour

used by Book-buyer agents to request seller agents thetarget book. */

private class RequestPerformer extends Behaviour {

private AID bestSeller;

// The agent who provides the best offer

private int bestPrice;

// The best offered price

private int repliesCnt = 0;

// The counter of replies from seller agents

private MessageTemplate mt;

// The template to receive repliesprivate int step = 0;

public void action() {

switch (step) {

case 0: // Send the cfp to all sellers

ACLMessage cfp = new ACLMessage(ACLMessage.CFP);

for (int i = 0; i < sellerAgents.length; ++i) {

cfp.addReceiver(sellerAgents[i]);

}

cfp.setContent(targetBookTitle);

cfp.setConversationId(‘‘book-trade’’);

cfp.setReplyWith(‘‘cfp’’ + System.currentTimeMillis());

// Unique value

 myAgent.send(cfp);

// Prepare the template to get proposals

  mt =

MessageTemplate.and(MessageTemplate.MatchConversationId(‘‘book-trade’’),

MessageTemplate.MatchInReplyTo(cfp.getReplyWith()));

step = 1;

break;

case 1: // Receive all proposals/refusals from seller agents

ACLMessage reply = myAgent.receive(mt);

if (reply != null) { // Reply received

if (reply.getPerformative() == ACLMessage.PROPOSE) {

// This is an offer

int price = Integer.parseInt(reply.getContent());

if (bestSeller == null || price < bestPrice) {

// This is the best offer at present

bestPrice = price;

bestSeller = reply.getSender();

17

Page 18: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 18/21

}

}repliesCnt++;

if (repliesCnt >= sellerAgents.length) {

// We received all replies

step = 2;

}

} else

{

block();

}

break;

case 2: // Send the purchase order to the seller

// that provided the best offer

ACLMessage order = new ACLMessage(ACLMessage.ACCEPT_PROPOSAL);order.addReceiver(bestSeller);

order.setContent(targetBookTitle);

order.setConversationId(‘‘book-trade’’);

order.setReplyWith(‘‘order + System.currentTimeMillis());

 myAgent.send(order);

// Prepare the template to get the purchase order reply

  mt =

MessageTemplate.and(MessageTemplate.MatchConversationId(‘‘book-trade’’),

MessageTemplate.MatchInReplyTo(order.getReplyWith()));

step = 3;

break;

case 3: // Receive the purchase order replyreply = myAgent.receive(mt);

if (reply != null) { // Purchase order reply received

if (reply.getPerformative() == ACLMessage.INFORM) {

// Purchase successful. We can terminate

System.out.println(targetBookTitle + ‘‘ successfully purchased.’’);

System.out.println(‘‘Price = ‘‘ + bestPrice);

 myAgent.doDelete();

}

step = 4;

} else {

block();

}

break;

}

}

public boolean done() {

return ((step == 2 && bestSeller == null) || step == 4);

}

18

Page 19: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 19/21

} // End of inner class RequestPerformer

5.5. Como localizar a los agentes vendedores

Hasta ahora hemos asumido que conocemos a los agentes vendedores, de talforma que podemos acceder a sus nombres mediante un array fijo de valores.En sistemas abiertos de agentes en los que constantemente enstan entrando yde los que tambien salen constantemente, este esquema de funcionamiento no esposible. Por ello se hace necesario el mecanismo, que ya define FIPA tal y comohemos visto, para localizar determinados agentes por nombre o bien agentes queofrecen determinados servicios que necesitamos.

Si hacemos memoria, recordaremos que en la arquitectura abstracta de FI-PA hay un elemento opcional denominado facilitador de directorio (DF). Laplataforma JADE incorpora este elemento en forma de clases Java para poder

inscribir nuestros agentes en el sistema y para poder encontrar otros agentes quepreviamente se han suscrito a ellos y a sus servicios. Veamos el siguiente codigo,correspondiente a la forma de registrarse de un agente vendedor de libros en elejemplo:

protected void setup() {

...

// Register the book-selling service in the yellow pages

DFAgentDescription dfd = new DFAgentDescription();

dfd.setName(getAID());

ServiceDescription sd = new ServiceDescription();

sd.setType(‘‘book-selling’’);

sd.setName(‘‘JADE-book-trading’’);

dfd.addServices(sd);

try {

DFService.register(this, dfd);

} catch (FIPAException fe) {

fe.printStackTrace();

}

...

}

Observese que el agente crea un objeto de la clase DFAgentDescription queresponde a una entrada en el directorio que hace referencia a los datos de unagente. Un objeto de este tipo puede, a su vez, contener uno o mas descripciones

de servicios, objetos de la clase ServiceDescription. Una descripcion de unservicio va a tener una serie de parametros como el nombre y el tipo (ademasde todos los que consideremos oportuno anadir, dependiendo del dominio deaplicacion). Ası, se inscribe el agente comprador con un servicio del tipo deventa de libros. Tengase en cuenta que cuando el agente finaliza su ejecucionhay de desubscribirlo tal que ası:

protected void takeDown() { // Deregister from the yellow pages

19

Page 20: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 20/21

try {

DFService.deregister(this);} catch (FIPAException fe) {

fe.printStackTrace();

} // Close the GUI

 myGui.dispose();

// Printout a dismissal message

System.out.println(‘‘Seller-agent’’ + getAID().getName() + ‘‘ terminating.’’);

}

Si el agente vendedor debe inscribir sus servicios, el agente comprador debeser capaz de encontrar agentes con servicios de venta de libros. Para ello podemosusar el metodo DFService.search() como en el fragmento de codigo del ejemplque sigue:

public class BookBuyerAgent extends Agent {

// The title of the book to buy

private String targetBookTitle;

// The list of known seller

agents private AID[] sellerAgents;

// Put agent initializations here

protected void setup() {

// Printout a welcome message

System.out.println(‘‘Hallo! Buyer-agent ‘‘ + getAID().getName() +

‘‘ is ready.’’);

// Get the title of the book to buy as a start-up argumentObject[] args = getArguments();

if (args != null && args.length > 0) {

targetBookTitle = (String) args[0];

System.out.println(‘‘Trying to buy ‘‘ + targetBookTitle);

// Add a TickerBehaviour that schedules a request to seller

// agents every minute

addBehaviour(new TickerBehaviour(this, 60000) {

protected void onTick() {

// Update the list of seller agents

DFAgentDescription template = new DFAgentDescription();

ServiceDescription sd = new ServiceDescription();

sd.setType(‘‘book-selling’’);

template.addServices(sd);

try {

DFAgentDescription[] result = DFService.search(myAgent,template);

sellerAgents = new AID[result.length];

for (int i = 0; i < result.length; ++i) {

sellerAgents[i] = result.getName();

20

Page 21: Tutorial Del JADE

5/10/2018 Tutorial Del JADE - slidepdf.com

http://slidepdf.com/reader/full/tutorial-del-jade 21/21

}

} catch (FIPAException fe) {fe.printStackTrace();

}

// Perform the request

  myAgent.addBehaviour(new RequestPerformer());

} }

);

...

6. Agradecimientos

Algunas de las figuras usadas en esta presentacion se han obtenido directa-

mente del manual de Jade. Agradecemos a Fabio Bellifemine y a su equipo suexpresa y desinteresada colaboracion.

21