Sie sind auf Seite 1von 25

Programacin con JADE

Creacin de agentes. Tareas de los agentes. Comunicacin entre agentes. Descubriendo agentes: las pginas amarillas. Agentes con GUI

Creacin de agentes

Agente Hello World. Identificadores de agentes: AID. Inicializacin del agente. Terminacin del agente. Pasando argumentos a un agente. El proyecto book-trading

Agente Hello World.


import jade.core.Agent; public class HelloWorldAgent extends Agents{ protected void setup() { //imprimo un mensaje de bienvenida System.out.println(Hola mundo. Soy un agente!); } }

La clase Agent
Extiende la clase Object. Esta clase es la superclase comn para los agentes definidos por el usuario.

Mtodos:

Pasaje de mensajes usando objetos ACLMessage. Soporte del ciclo de vida en la plataforma. Planificacin y ejecucin de diversos comportamientos.

Los programadores deben crear sus propios agentes como subclases, agregar comportamientos especficos y aprovechar las capacidades que brinda la clase AGENT().

Instancias de AGENT()

Ejecuta en un thread. Posee un scheduler interno de las acciones. Las acciones se planifican de manera:

Round-robin. No-preemptive.

Tareas internas al iniciar o finalizar. Cola de mensajes. Estado interno.

Identificadores para Agentes


protected void setup() { System.out.println(Hola mundo. Soy un agente!); System.out.println(Mi nombre local es +getAID().getLocalName() ); System.out.println(Mi GUID es +getAID().getlName()); System.out.println(Mis direcciones son: ); Iterator it = getIAD().getAllAddresses(); while (it.hasNext());{ System.out.println( - + it.next() ); } }

Inicializacin y terminacin de los agentes

Lanzar el agente HelloWorld como un comando.

java jade.Boot -gui hola:examples.hello.HelloWorldAgent

El mtodo setup() especifica las tareas de inicializacin. El nombre local se establece en la creacin. El nombre global se asigna por defecto. HelloWorld contina vivo despus de finalizar el setup aunque no tenga nada que hacer. No tiene ningn comportamiento. Para terminar se usa doDelete(). Las tareas de limpieza, antes de terminar se hacen en takeDown().

Pasando argumentos

Los argumentos se recuperan como un arreglo de objetos. Mtodo getArguments() de la clase agent. Los argumentos se pasan entre parntesis en la lnea de comandos. Cdigo System.out.println(Mis argumentos son: ); Object[] args = getArguments(); if (args!=null){ for(int i=0;i<args.length;++i){ System.out.println(- +args[i]); } }

Proyecto book-trading

Agente comprador de libros


Argumentos. Cdigo

Agente vendedor de libros


Argumentos. Cdigo

Mtodos que controlan el ciclo de vida Mtodo doDelete()


suspended active

Mtodo doActive()
suspended active

waiting

deleted

waiting

deleted

Mtodos que controlan el ciclo de vida Mtodo doSuspend()


suspended active

Mtodo doWait()
suspended active

waiting

deleted

waiting

deleted

Mtodos que controlan el ciclo de vida Mtodo doWake()


suspended active

Mtodo getAgentState()

Retorna un AgentState waiting deleted

Tareas de los agentes - comportamientos

Planificacin de comportamientos y ejecucin. Comportamientos one-shot, cyclic y generic. Comportamientos en detalle. Planificacin de operaciones. Comportamientos para el ejemplo book-trading.

Comportamientos del agente comprador. Comportamientos del agente vendedor.

Comportamientos (Behaviour)

Behaviour es una clase abstracta que provee el esqueleto de una tarea (o accin) a ser realizada por un agente. Los mtodos principales son:

abstract void action(): la tarea propiamente dicha. abstract boolean done(): ha finalizado la accin?

Planificacin y ejecucin de Comportamientos


Al ser not pre-emtive, el mtodo action() ejecuta hasta que retorna. Se asigna una sola hebra por agente. (Pocos recursos) Switch de comportamiento mejor que switch de hebras. No se requiere sincronizacin entre comportamientos concurrentes. Para el switch no se requiere stack, por lo que se puede hacer un snapshot del estado del agente. Se puede almacenar el agente o transferirlo.

Ejecucin de la hebra de un agente


Si no hay comportamiento disponible, la hebra va a dormir Setup() SI

El agente ha sido eliminado NO

Consigue el prximo comportamiento(b) del pool de comportamientos activos b.action() NO Hasta que no se ejecute y retorne true, el comportamiento sigue ejecutando

b.done()?

SI Elimina b del pool de comportamientos activos takeDown()

Mtodos que controlan las actividades

void addBehaviour(Behaviour b) Agrega una accin al agente.

void removeBehaviour(Behaviour b) Elimina una accin del agente.

Jerarqua de Comportamientos
Behaviour

SimpleBehaviour

CompositBehaviour

SerialBehaviour

...
OneShotBehaviour

...

ParallelBehaviour

CiclicBehaviour

Distintos tipos de comportamientos

SimpleBehaviour: acciones atmicas del trabajo del agente


OneShotBehaviour: Ejecuta una vez. done() retorna true. CyclicBehaviour: Ejecuta por siempre. done() retorna false. Generic Behaviour: Dependiendo del estado, ejecuta un comportamiento especfico.

CompositeBehaviour: acciones compuestas de sub-acciones. Sigue una poltica para determinar el hijo que ejecuta.

SerialBehaviour: Ejecuta un sub-Comportamiento despus de otro. Finaliza al terminar el ltimo. ParallelBehaviour: Inicia un sub-Comportamiento despus de otro. Finaliza por distintas condiciones.

Comportamientos Genricos
public class tresEstados extends Behaviours{ private int state = 0; public void action(){ switch(step){ case 0: // operacin X; step++; break; public boolean done(){ case 1: return step == 3; // operacin Y; } step++; } break; case 2: // operacin Z; step++; break; } }

10

Ms sobre comportamientos
Todos los comportamientos heredan los mtodos: Ejecutan slo una vez. onStart() antes de action() La implementacin default es vaca onEnd() despus que done() retorne true. Un comportamiento puede ser abortado con el mtodo removeBehaviour(). Se lo quita del pool de comportamientos disponibles. No ejecuta onEnd(). Cada comportamiento tiene myAgent que apunta al agente que est ejecutando el comportamiento. Accede a los recursos. Es necesario hacer reset() antes de volver a ejecutar un comportamiento.

Planificacin de operaciones

WakerBehaviour est preparada para ejecutar el mtodo abstracto onWake() una vez que transcurre un intervalo de tiempo. Despus termina el comportamiento.

TickerBehaviour est preparada para ejecutar onTick() repetidamente, aguardando un perodo de tiempo establecido despus de cada ejecucin.

11

Comunicacin entre agentes

Enviando mensajes. Recibiendo mensajes. Bloqueo por espera de mensaje. Seleccionando mensajes desde la cola de mensajes. Conversaciones complejas. Recepcin de mensajes en modo bloqueante.

Mensajes ACL

12

Mensajes en ACL- campos

http://www.fipa.org/specs/fipa00061/index.html http://jade.tilab.com/doc/api/jade/lang/acl/ACLMessage.html

Mtodos relacionados con mensajes

void send(ACLMessage msg) enva un mensaje a otro agente ACLMessage receive()


recibe un mensaje desde la cola de mensajes del agente

Segn patrn. Bloqueante. Durante un intervalo. Segn patrn

13

Caractersticas de los mensajes

Pasaje de mensajes asincrnico.


Envo de mensajes: mtodo del agente o comportamiento

public ACLMessage(int performative) constructor


Atributos accedidos con mtodos get/set<Atributo>( )

Las performatives indican que pretende el emisor conseguir con el mensaje

Enviando mensajes

Hay que llenar los campos e invocar al mtodo send() de la clase agent. Las performatives tienen una semntica bien definida. Esto permite que al recibir un mensaje el agente tome las decisiones correctas.
cfp Vendedor propose Acept_propose Comprador

14

// 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);

Recibiendo mensajes

Al llegar se colocan en la cola de mensajes del receptor. Se recuperan con el mtodo recive(). Retorna el primer mensaje de la cola o null si est vaca.
ACLMessage reply = myAgent.receive(mt); if (reply != null) { // Reply received } Un template de mensaje con determinadas caractersticas

15

Bloqueo de comportamiento en espera de un mensaje


Comnmente se implementan comportamientos dedicados para recibir mensajes. CallForOfferServer PurchaseOrderServer Usados por el comprador para recibir mensajes Son cclicos y conviene bloquearlos en espera de mensajes. Cada ejecucin de action() debe controlar por mensajes. Si no hay mensajes se bloquea hasta que llegue uno nuevo.
En el mtodo action() if(msg != null){ procesa el mensaje } else{ block(); }

Seleccionando mensajes desde la cola de mensajes

El mtodo recive() usa un template para recuperar el primer mensaje con determinadas caractersticas. Los templates son instancias de MessageTemplate. Esta clase cuenta con mtodos simples y flexibles que permiten crear templates. Hace posible recuperar solamente mensajes con una determinada performative, p.e. cfp

16

MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.CFP); ACLMessage msg = myAgent.receive(mt); if(msg != null){ procesa el mensaje } else{ block(); }

Conversaciones complejas

Una conversacin es una secuencia de mensajes intercambiados entre dos o ms agentes con un motivo bien definido y con ciertas restricciones de tiempo. En el caso de la compra de libros hay 4 pasos:

Enviar los mensajes cfp. Recibir todas las propuestas o rechazos. Enviar la orden de compra. Recibir confirmacin de la compra.

Siguen un protocolo de iteracin bien definido. (FIPA) Un ejemplo es ContractNet. Jade provee una clase para implementarla.

17

Recibir mensajes en modo bloqueante

Mtodo blockingRecive() de la clase Agent. bloquea al agente hasta que llega un mensaje. Se puede bloquear por un tipo especfico de mensaje. Se bloquea la hebra y ningn otro comportamiento ejecuta. Se usan normalmente en setup() y takeDown(). Una alternativa es usar Behaviour.block() para bloquear solo el comportamiento

Las pginas amarillas

El agente DF. Usando el DF.

Publicando servicios.

Buscando servicios

18

El agente DF

Facilidad que permite a los agentes publicar sus servicios, para que otros agentes los descubran y puedan usarlos. Este servicio de acuerdo con FIPA es brindado por un agente llamado DF. Se pueden desarrollar otros agentes similares al DF y combinarlos en un sistema federado.
A1 Publicar servicios provistos A2 A3
A1:-servicio X -servicio Y A2:-servicio Z A3:-servicio W -servicio K -servicio H
Servicio de pginas amarillas

A4 A5 A6 Uso del servicio Buscar servicios requeridos

Interactuando con el DF

Respeta las especificaciones de FIPA. Se comunica mediante mensajes ACL. Con un lenguaje de contenido y una ontologa establecidos. Para publicar y buscar servicios se usan los mtodos de la clase jade.domine.DFService que provee JADE.

19

Publicando servicios

El agente debe brindarle al DF una descripcin con su AID, una lista de los servicios prestados y opcionalmente una lista de lenguajes y ontologas requeridos. Cada servicio debe incluir el tipo de servicio, el nombre del servicio, los lenguajes y ontologas requeridos para usar el servicio y una coleccin de propiedades especficas del servicio en la forma de pares clave-valor. Las clases correspondientes son: DFAgentDescription, ServiceDescription y Property del paquete jade.domain.FIPAAgentManagement. Para publicar un servicio, el agente crea su descripcin y se registra con el DF con el mtodo register() de la clase DFService.

// 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(); }

20

Buscando por servicios


Se debe proveer al DF con una plantilla de descripcin. El resultado de la bsqueda es una lista de todas las descripciones que coinciden con la plantilla provista. Segn FIPA una coincidencia ocurre cuando todos los campos de la plantilla se encuentran en la descripcin con los mismos valores. Se usa el mtodo search() de DFService. Es posible tambin emplear un mecanismo de suscripcin por el cual los agentes son notificados cuando un servicio se registra o se quita del DF. Un protocolo de suscripcin.

addBehaviour(new TickerBehaviour(this, 60000) { protected void onTick() { System.out.println("Trying to buy "+targetBookTitle); // 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); System.out.println("Found the following seller agents:"); sellerAgents = new AID[result.length]; for (int i = 0; i < result.length; ++i) { sellerAgents[i] = result[i].getName(); System.out.println(sellerAgents[i].getName()); } } catch (FIPAException fe) { fe.printStackTrace(); }

21

Agentes con interfaz grfica

Deteccin de acciones del usuario en la GUI. Actualizacin de la GUI desde el agente.

Agentes y su GUI

La hebra de agente se despierta cuando recibe mensajes. La hebra de la GUI se despierta cuando recibe eventos La hebra del Event Dispatcher busca eventos en la cola de eventos del sistema. Se invoca a los que esperan por cierto tipo de evento.

22

Respuesta a eventos de la GUI

Al tener GUI el agente debe reaccionar a las acciones del usuario. Ej. Iniciar una conversacin al presionar un botn. Dentro del actionPerformed() conviene preparar un comportamiento y planificarlo para el agente. Si la tarea es simple (modificar una vble o preparar y enviar un msje) se puede hacer dentro de la hebra AWT. Nunca usar invocaciones bloqueantes.

Actualizacin de la GUI

AWT usa java.awt.EvenQueue.invocateLater() que agrega un evento a la cola de eventos. Se crea un objeto que se pasa como parmetro y se encarga de actualizar la GUI del contenedor

23

Construir agentes con GUI


La clase jade.gui.GuiAgent ayuda a crear agentes con GUI En el mtodo setup() se instancia un comportamiento especialmente destinado a manejar una cola con estos eventos. La interfaz crea un objeto de tipo evento, lo usa como parmetro del mtodo postGuiEvent(). El agente reacciona al evento despertando a sus comportamientos. El comportamiento onGuiEvent() implementa las acciones que realiza el agente segn el evento.

// get the list of available locations and show it in the GUI addBehaviour(new GetAvailableLocationsBehaviour(this)); // initialize the counter and the flag cnt = 0; cntEnabled = true; // Add agent behaviours to increment the counter and serve // incoming messages Behaviour b1 = new CounterBehaviour(this); addBehaviour(b1); Behaviour b2 = new ServeIncomingMessagesBehaviour(this); addBehaviour(b2);

24

Ejercicios

Book-Trading(1): Analizar el cdigo de los agentes involucrados y determinar:


Interfaz grfica. Caractersticas del dilogo para una transaccin exitosa.

Book-Trading(2): emplear un criterio compuesto para preferir un libro. Precio y ao de edicin. Book-Trading(3): Usar delp server para tomar decisiones sobre la eleccin de los libros.

25

Das könnte Ihnen auch gefallen