P. 1
Comportamientos de Los Agentes

Comportamientos de Los Agentes

|Views: 97|Likes:
Publicado porAngelica Pastor

More info:

Published by: Angelica Pastor on Jun 04, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

06/19/2013

pdf

text

original

Comportamientos de los Agentes

2.1 Qué es un comportamiento 2.2 Añadir y eliminar comportamientos 2.3 Métodos de un comportamiento 2.4 Ejecución de los comportamientos 2.5 Flujo de control de un agente 2.6 Tipos de comportamiento
2.6.1 Comportamiento genérico 2.6.2 Comportamientos simples 2.6.3 Comportamientos compuestos 2.6.4 Comportamientos temporales

2.7 Ejercicios

2.1 Qué es un comportamiento
Un comportamiento o behaviour hace referencia a una funcionalidad que incorpora el agente. Los comportamientos especifican tareas o servicios que realiza un agente para lograr sus objetivos. Cada comportamiento puede realizar una tarea simple como "Envia este mensaje" o "compra X " aunque también se pueden crear comportamientos compuestos. Cada tarea del agente sará una instancia de una clase que deber heredar de la clase Behaviour.

class MiComportamiento extends Behaviour{ … }

Por este motivo, e código JAVA que implementa esa funcionalidad ha de importar el paquete:

jade.core.behaviours.*

Aunque bastaría con importar simplemente la clase Behaviour que se encuentra en:

jade.core.behaviours.Behaviour

Nota: En el siguiente enlace se encuentra una descripción de todos los métodos disponibles en la Clase Behaviour Los agentes están programados en base a sus comportamientos. La programación basada en comportamientos debe realizar los siguientes pasos:

1. Determinar qué debe ser capaz de hacer el agente.
2. Asociar cada funcionalidad con un comportamiento. 3. Escoger el tipo de comportamientos 4. Dejar a JADE la tarea del scheduling (un solo comportamiento se está ejecutando en cada instante).

2.2 Añadir y eliminar comportamientos
La clase Agent provee dos métodos para añadir y borrar comportamientos a un agente: addBehaviour(Behaviour) y removeBehaviour(Behaviour). Estos métodos permiten gestionar la entrada y salida de los objetos Behaviour en la cola del planificador. El planificador va ejecutando según una política round-robin los objetos behaviour que se encuentran en una cola FIFO. Los comportamientos pueden ser añadidos o eliminados en cualquier momento de la vida del agente, desde el método setup() o desde cualquier otro comportamiento, incluso desde otros agentes. Crear un comportamiento no es más que crear una clase privada dentro de la clase del agente y asociarlo a ese agente mediante el método addBehaviour(Behaviour). Añadir un comportamiento debe ser visto como la ejecución de un nuevo thread dentro del agente. En el siguiente ejemplo se puede ver como se añade un comportamiento desde el método setup() del agente.

import jade.core.Agent; import jade.core.behaviours.*; public class MiAgente extends Agent{ protected void setup(){

//Aqui es donde se añade el comportamiento. addBehaviour(new MiComportamiento1()); } //Este es el comportamiento. private class MiComportamiento1 extends Behaviour{ public void action(){ System.out.println("Mi nombre es: "+getName() ); System.out.println("Soy el comportamiento del agente"); } public boolean done(){ return true; } } }

En el siguiente ejemplo se muestra como se puede añadir un comportamiento desde otro comportamiento. Para ello usaremos una variable de la clase Behaviour llamada myAgent que funciona como una referencia al agente que esta ejecutando el comportamiento, es decir, al agente al que pertenece el comportamiento.

import jade.core.Agent; import jade.core.behaviours.*; public class MiAgente extends Agent{ protected void setup(){ //Aqui es donde se añade el comportamiento. addBehaviour(new MiComportamiento1()); } //Este es el comportamiento. private class MiComportamiento1 extends Behaviour{ public void action(){ System.out.println("Mi nombre es: "+getName() ); System.out.println("Soy el primer comportamiento"); myAgent.addBehaviour(new MiComportamiento2()); } public boolean done(){ return true;

*.} } //Este es el otro comportamiento private class MiComportamiento2 extends Behaviour{ public void action(){ System. import jade.out. } public boolean done(){ return true. public class Ejemplo1 extends Agent{ private Behaviour comp.practica2. Así. addBehaviour(comp). } } } Además de añadir nuevos comportamientos.core.Agent.behaviours.core. // Inicialización del agente protected void setup() { //Creamos un comportamiento: un objeto de la clase MiComportamiento1 comp = new MiComportamiento1(). . } //Definición de un comportamiento private class MiComportamiento1 extends Behaviour{ // define la acción a ser ejecutada cuando se ejecute el comportamiento. también se pueden eliminar comportamientos de un agente con el método removeBehaviour(Behaviour). //Aqui es donde se añade el comportamiento.println("Soy el segundo comportamiento"). import jade. si en el ejemplo anterior quisiéramos borrar el primer comportamiento desde el segundo comportamiento bastaría con hacer una llamada a removeBehaviour() dentro del método action del segundo comportamiento: package examples.

myAgent. } // Determina si el comportamiento ha sido completado o no. myAgent.println("Soy el primer comportamiento").    Este método define la acción a ser ejecutada cuando se ejecute el comportamiento. // Si el comportamiento ha finalizado. public boolean done(){ return true. // Añade un comportamiento desde otro comportamiento. Debe incluir el código de las acciones a realizar cuando se ejecute el comportamiento.public void action(){ System. Es recomendable que los métodos action() no tengan un tiempo de ejecución alto ya que mientras que se ejecutan no pueden ser interrumpidos por otro comportamiento.out.//Borramos el primer comportamiento.println("Soy el segundo comportamiento"). } public boolean done(){ return true. Es invocado cuando se produce el evento asociado al comportamiento. .addBehaviour(new MiComportamiento2()). System.println("Mi nombre es: "+getName() ). éste se elimina de la cola de comportamientos activos.removeBehaviour(comp).el método action(). } } } 2. } } //Definición de un segundo comportamiento private class MiComportamiento2 extends Behaviour{ public void action(){ System.3 Métodos de un comportamiento Toda clase que herede de Behaviour deberá implementar: .out.out.

case 2: System.Agent. } // Finalización del agente protected void takeDown(){ System. Si el comportamiento ha finalizado.el método done(). Este método determina si el comportamiento ha sido completado o no.println("Re").out.println("Fa"). El siguiente ejemplo muestra como el funcionamiento de los método action() y done() de un comportamiento.     Es invocado cuando finaliza la ejecución del método action().println("La escala ha terminado"). // Función que realiza MiComportamiento public void action(){ switch(estado){ case 0: System. case 3: System. break. } // Definición de un comportamiento private class MiComportamiento extends Behaviour{ private int estado = 0.Devuelve un booleano (true si ha terminado o false en caso contrario).*.core..out. public class Ejemplo2 extends Agent{ // Inicialización del agente protected void setup(){ // Añade un comportamiento addBehaviour(new MiComportamiento()).core. break. import jade.practica2. package examples. éste se elimina de la cola de comportamientos activos. .out. Se puede utilizar una marca que se activa cuando se quiere que finalice el comportamiento (se evalúa su valor en el método done()). break. case 1: System.println("Do").out. import jade. break.out.println("Mi").behaviours.

break.core. 7:{ System.doDelete().case case case case 4: System.out.out. import jade. el método block() coloca el comportamiento en la cola de comportamientos bloqueados. Este no afecta a los demás comportamientos de un agente.*. Este método permite bloquear un comportamiento hasta que algún acontecimiento ocurra (típicamente. 5: System. } // Comprueba si el comportamiento ha finalizado. package examples. } } estado++. public class Ejemplo3 extends Agent{ // Inicialización del agente .println("Sol").println("Do").println("La"). Cuando el método action() termina. myAgent. Una vez finalizado. Debe tenerse en cuenta que el método block() no es como el método sleep() de los Threads.practica2.out. El método block() no para la ejecución del comportamiento sino que espera a que finalice el método action(). break. éste pasa a la lista de comportamientos bloqueados durante el tiempo que indique el método block() o hasta que se reciba un nuevo mensaje.println("Si").core. 6: System.out. expresado en milisegundos. hasta que un mensaje llegue). break. un objeto de la clase Behaviour puede bloquearse durante una cantidad limitada de tiempo que se pasa por valor al método block(). import jade.Agent.break. } } } Un comportamiento también puede ser bloqueado utilizando el método block(). Además. public boolean done(){ return (estado > 7).behaviours. si el comportamiento no termina.

} } } Un comportamiento bloqueado puede reiniciar su ejecución (desbloquearse) cuando alguna de las siguientes condiciones ocurre: .doDelete(). //lo bloqueamos durante un segundo block(1000).println("****Agente finalizado****").out. } else return false. } // Comprueba si el comportamiento ha finalizado public boolean done(){ if(numeroEjecuciones>10) { myAgent.out.protected void setup() { addBehaviour( new MiComportamiento() ).out. } // Finalización del agente protected void takeDown() { System.println("Despues de 1000 milisengundos"). // // Función que realiza MiComportamiento public void action() { System. return true. System. numeroEjecuciones++.println("Esta es la ejecucion "+numeroEjecuciones). } // Definición de un comportamiento private class MiComportamiento extends Behaviour { int numeroEjecuciones = 1.

Estos métodos pueden ser sobrescritos por el usuario para ejecutar acciones anteriores o posteriores a la ejecución del método action(). import jade. Se debe recordar que onEnd() se llama después de que el comportamiento se haya completado y haya sido eliminado de la cola de comportamientos del agente. al finalizar este tiempo. Cuando se produce la llegada de un mensaje. en el caso de que un objeto no sea el destinatario debe volver a bloquearse.*.El método onStart() se ejecuta justo antes de la ejecución del método action().behaviours.Agent.core. . llamando al método reset() dentro de onEnd() no es suficiente para que se repita cíclicamente la tarea representada por ese comportamiento y además se debe añadir dicho comportamienro de nuevo al agente como se muestra en el siguiente ejemplo: package examples. Este valor dependerá de las condiciones de ejecución implementadas en el comportamiento.practica2. } // Definición de un comportamiento private class MiComportamiento extends Behaviour{ . Por ejemplo. En este caso el comportamiento se saca de la cola de comportamientos bloqueados y se coloca al final de la cola de comportamientos activos. todos los objetos de la cola de bloqueados se planifican y deben comprobar si el mensaje es para ellos o no. el objeto se desbloqueará. El método restart() es llamado explícitamente por el comportamiento.   El agente al que pertenece ese comportamiento recibe un mensaje ACL. public class Ejemplo4 extends Agent { // Inicialización del agente protected void setup(){ // Añadir un comportamiento.El método onEnd() se ejecuta antes de finalizar el comportamiento (después de que el método done() devuelva true) y devuelve un entero que representa un valor de terminación para el comportamiento.core. Una interrupción asociada con este comportamiento por el método block() expira. así se fuerza el desbloqueo. Estos métodos se implementan solamente una vez. Sin embargo. si un objeto se ha bloqueado durante dos segundos. . import jade. addBehaviour(new MiComportamiento()). La clase Behaviour también proporciona dos métodos llamados onStart() y onEnd().

out. En contra de lo que pudiera parecer. //lo bloqueamos durante un segundo block(1000).println("Despues de 1 segundo"). reset().out. } } } 2. los comportamientos no son ejecutados concurrentemente. ejecutando un comportamiento hasta que libera el control. .println("Esto se hace cada vez que se inicia el comportamiento").println("Hola a todos.out.4 Ejecución de los comportamientos Cada agente tiene un planificador o scheduler de comportamientos.// Este método se ejecuta justo antes de la ejecución del método action() public void onStart() { System. La política de planificación se realiza de forma preemptiva para todos los comportamientos activos de la cola circular. } // Comprueba si el comportamiento ha finalizado public boolean done(){ return true. } // Funcion a realizar por el comportamiento public void action(){ System. return 0. es decir. System. } // Se ejecuta antes de finalizar el comportamiento public int onEnd(){ // Hace que el comportamiento se reinicie al finalizar. myAgent."). sin poder interrumpirla hasta que ésta acabe (esto ocurre cuando finaliza el método action()).addBehaviour(this).

Igual que las threads en Java. en un agente pueden estar activos a la vez tantos comportamientos como sea necesario. con el consiguiente ahorro de ciclos de CPU y memoria que esto implica. entonces éste se coloca en la cola de los comportamientos bloqueados. Cuando este comportamiento se desbloquea (por una de las razones vistas anteriormente) se saca de la cola de bloqueados y se coloca al final de la cola de comportamientos activos. cuando el método action() se está ejecutando. Es importante recordar que. El funcionamiento de los comportamientos está implementado a 2 niveles:   Una cola circular de los comportamientos activos Una cola con los comportamientos bloqueados Un comportamiento puede bloquearse (block()) cuando el método action() termina.ya sea para recibirlos y actuar en consecuencia . . ningún otro comportamiento (de ese mismo agente) puede continuar su ejecución hasta que termine dicho método. Esto es así para que cada agente equivalga únicamente a un único thread. La mayor parte de estos comportamientos serán utilizados para el intercambio de mensajes: . mientras que en JAVA lo decide la máquina virtual. el decidir qué comportamiento se ejecuta en cada momento es tarea del programador.o ya sea para enviarlos. a diferencia de las threads en JAVA. Sin embargo.Se puede pensar que los comportamientos son como los hilos de ejecución JAVA.

es decir. realización de la tarea y limpieza y finalización. Tras esto se comprueba que el agente sigue vivo y después se selecciona el siguiente comportamiento a ejectuar del conjunto de comportamientos que aun le quedan al agente. Es posible que no lo haya hecho ya que un comportamiento puede ser o un simple trozo de código que se ejecuta una sola vez o bien varias veces dependiendo de otros factores. el camino que atraviesa un agente desde que comienza su ejecución hasta que finaliza y se elimina. Si está ejecutado se elimina del conjunto de comportamientos del agente y no vuelve a ejecutarse.2. En otro caso. lo primero a ejecutar es el método setup(). se vuelve a comenzar.5 Flujo de control de un agente En la figura que se muestra a continuación se representa el flujo de control de un agente básico: Inicialización. Como puede verse.action() y tras esto se pregunta si ha finalizado. Se ejecuta su método b. .

¿Cómo sería la ejecución de un agente que tenga el siguiente comportamiento? a) No se ejecuta puesto falta por definir el método onStart(). b) El comportamiento se bloquea durante 1 segundo y el planificador pasa el control al siguiente .

o tratan de realizar. } cont++. haciendo que cada agente sea equivalente a un único hilo. JADE proporciona un sistema de comportamientos (behaviours) que ayudan al usuario a construir sistemas multiagente y reutilizar código.6 Tipos de comportamientos En muchas ocasiones los agentes realizan. public void action(){ while (salir) { if (cont > 0) { salir = true. lo que puede causar problemas. public class MiComportamiento extends Behaviour { private boolean salir = true. Los agentes JADE programan sus comportamientos con un solo hilo y el decidir qué comportamiento se ejecuta en cada momento es tarea del desarrollador del agente. . Por tanto. funcionalidades complejas que pueden llegar a implicar tareas simultáneas forzando a implementar agentes multihilo. } } 2. c) No finaliza nunca puesto que el método action() no finaliza. con el consiguiente ahorro de ciclos de CPU y memoria.comportamiento de la cola. pueden estar activos varios comportamientos a la vez.core. private int cont = 0. } public boolean done(){ return true. } block(1000).behaviours contiene las clases que se usan para implementar comportamientos básicos de agentes. pero sólo uno de ellos se ejecutará en un momento determinado. El paquete jade. De esta manera se eliminan los problemas de sincronización entre comportamientos concurrentes que acceden al mismo recurso. d) Finaliza siempre puesto que el método done() devuelve siempre true.

2 Comportamientos simples Este tipo de comportamientos se corresponden con la clase SimpleBehaviour que representa a comportamientos atómicos. que suelen realizar tareas simples. 2. Se utilizarán los siguientes metodos: 1.3. Un ejemplo sencillo de este tipo de comportamiento es el código escrito en el apartado 2. Finalizan cuando cierta condición se cumple. reset ():Devuelve el comportamiento a su estado inicial.6. Mantienen un estado del agente y en base a él se ejecutan diferentes operaciones.2. .1 Comportamiento Genérico Se corresponde con la clase abstracta Behaviour.6.

Agent. } protected void takeDown(){ System.println("Ejecucion finalizada"). } } }// 2.2 CyclicBehaviour Representa un comportamiento que debe ejecutarse una serie de veces.println("Ejecutamos la accion una sola vez").behaviours.*.2.out.6.core.out. } private class MyOneShotBehaviour extends OneShotBehaviour { public void action() { System.practicaTres.2. import jade.6.1 OneShotBehaviour En este tipo de comportamiento el método done() siempre devuelve "true". Se mantiene activo tanto tiempo como esté activo el agente. . myAgent. de forma que sólo se ejecuta una vez y de forma ininterrumpida.    El método done() devuelve false.doDelete(). import jade.2. package examples. public class OneShot extends Agent{ public void setup() { MyOneShotBehaviour c = new MyOneShotBehaviour().core. Hay riesgo de que se pueda quedar con toda la CPU. addBehaviour(c).

.3 Comportamientos compuestos Esta clase abstracta modela comportamientos a partir de la composición de otros comportamientos (hijos).out. ParallelBehaviour y FSMBehavior. 2. } private class MyCyclicBehaviour extends CyclicBehaviour { public void action() { System. que puede ser del tipo:SequentialBehaviour. addBehaviour(c).out.*. import jade. public class Cyclic extends Agent{ public void setup() { MyCyclicBehaviour c = new MyCyclicBehaviour(). checkTermination(): Se ejecuta después de la ejecución de cada hijo para saber cuando se debe terminar el comportamiento.core. Las diferentes políticas vienen determinadas por la subclase elegida.println("Ejecutamos la accion ciclicamente"). Está compuesta por diferentes subcomportamientos que se pueden ejecutar siguiendo diferentes políticas de planificación. getCurrent(): Devuelve el comportamiento hijo que actualmente está programado para ejecutarse.package examples. 3.Agent.6.println("Ejecucion finalizada").behaviours. } protected void takeDown(){ System. Se utilizarán los siguientes metodos: 1. scheduleNext(): Programa al siguiente hijo para ser ejecutado.practicaTres. import jade. 4.core. scheduleFirst(): Programa al primer hijo para ser ejecutado. } } }// 2.

.1 FSMBehaviour Esta clase permite definir una Máquina de Estados finita mediante subcomportamientos. Cada subcomportamiento representa un estado de la máquina y las transiciones se van produciendo según la salida de dichos estados.2.6.3.

Se utilizarán los siguientes metodos: 1. se implementa la acción que debe realizar el comportamiento. String n ): Establece cúal es el estado inicial. que será devuelto por el método onEnd() de cada comportamiento. Este tipo de transiciones no están marcadas con una etiqueta. registrando cada uno de ellos cómo primer estado. 3. registerDeafultTransition(String s1. String s2. 2. El agente finaliza cuando se termina de ejecutar algún sub-comportamiento que se haya registrado como estado final. registerTransition(String s1. y sólo se ejecutan en el caso de que el retorno del estado anterior no coincida con ninguna otra transición. 4. y definiendo transiciones entre estados. Las transiciones puede ser por defecto o teniendo en cuenta un valor de salida del comportamiento origen. último estado o estado(s) intermedio(s). registerLastState(behaviour b. Hay que identificar los estados definiendo unas constantes cómo etiquetas. registerFirstState(behaviour b. int evento ): Registra las transiciones entre estados. registerState(behaviour b. en su método onStart() o justo después de añadir el comportamiento en el nacimiento del agente. Hay que registrar los distintos comportamientos que componen FSMBehaviour a modo de estados. por lo que la implementación de estados y transiciones debe realizarse en el constructor. String n ): Registra los estados intermedios. String s2) es otro de los métodos de la clase FSMBehaviour que permite definir una transición por defectoentre dos estados. Hay que tener en cuenta una serie de cuestiones como:  FSMBehaviour carece de método action(). De manera secuencial. String n ): Registra el estado final.     . 5. valor que dependerá de las condiciones de ejecución que se implementen en cada estado/comportamiento.

registerTransition(THREE_STATE.behaviours. DOS).*.entrada). private final int TRES = 3. registerDefaultTransition(THREE_STATE.package examples.lang.practicaTres.String ent){ super(_agente). ERROR_STATE). registerDefaultTransition(TWO_STATE. ERROR_STATE= "CERO".core.ONE_STATE). TWO_STATE = "DOS". registerTransition(TWO_STATE.UNO). entrada=ent. ERROR_STATE). TWO_STATE). import jade. import java. registerTransition(ONE_STATE.ONE_STATE. private String entrada="".ERROR_STATE). private final int CERO = 0.core. public class FSM extends Agent { private static final String private static final String private static final String private static final String private final int UNO = 1.Agent. THREE_STATE = "TRES". MiFSMBehaviour b = new MiFSMBehaviour(this. addBehaviour(b). THREE_STATE. private String entrada="". registerState(new ThreeBehaviour(). public void setup() { entrada="231231231". registerDefaultTransition(ONE_STATE. public MiFSMBehaviour(Agent _agente. } private class MiFSMBehaviour extends FSMBehaviour{ private int transicion=0. private final int DOS = 2. ONE_STATE = "UNO". registerState(new TwoBehaviour(). } .TRES). registerLastState(new ErrorBehaviour(). } public void onStart(){ registerFirstState(new OneBehaviour(). import jade.*. TWO_STATE. ERROR_STATE). THREE_STATE).

out.1)).} } private class TwoBehaviour extends OneShotBehaviour { public void action(){System.println("() Estado del segundo comportamiento").println(" ** Terminado estado numero: "+currentName).out.substring(1.} } private class ErrorBehaviour extends OneShotBehaviour { public void action(){System.} public int onEnd() { return getEntrada(). } public int onEnd() { return getEntrada().currentResult).parseInt(entrada.println("() Estado del tercer comportamiento").} } private class ThreeBehaviour extends OneShotBehaviour { public void action(){System. return tipoEvento.length()<1) return tipoEvento.println("() Error de estado").entrada.checkTermination(currentDone.} } } //class MiFSMBehaviour }//class MiAgente . } public int onEnd() { return getEntrada(). entrada=entrada. } public int getEntrada(){ int tipoEvento = CERO.out.println("() Primer estado"). } private class OneBehaviour extends OneShotBehaviour { public void action(){System.int currentResult){ System.protected boolean checkTermination(boolean currentDone.out.out. else tipoEvento=Integer.length()). if (entrada.substring(0. return super.

out.6. Contador(this.println("ejecucion finalizada"). 4)). protected void takeDown(){ System. } private class Contador extends SimpleBehaviour { int c. } = new SequentialBehaviour(this). 3)). Contador(this.2 SequentialBehaviour Esta subclase de CompositeBehaviour ejecuta los subcomportamientos de manera secuencial y termina cuando todos ellos han terminado (termina la ejecución de action()). Se utiliza cuando una tarea compleja se puede descomponer en una secuencia de pasos atómicos.addSubBehaviour(new s. "C". 3)). 2)).addSubBehaviour(new s. int lim.core.addSubBehaviour(new s. 5)). "E". public class MiAgente2632 extends Agent{ public void setup() { SequentialBehaviour s s. "B".addSubBehaviour(new addBehaviour(s).Agent. . Contador(this.addSubBehaviour(new s.*.core.3.practicaTres. Contador(this. "D".behaviours. Para añadir los subcomportamientos se utiliza el método addSubBehaviour() y se ejecutarán en el orden en que sean agregados.2. Contador(this. package examples. "A". import jade. import jade.

c = 0.String nombre. Define las constantes que han de ser notificadas al constructor para que el comportamiento termine cuando:    todos los subcomportamientos lo han hecho (ParalellBehaviour. .WHEN_ANY) cuando un número especificado de subcomportamientos terminen (indicar un entero) Para añadir los subcomportamientos se utiliza el método addSubBehaviour() como en el comportamiento secuencial. int lim) { super(a). public Contador(Agent a. } } } 2. this. } public boolean done () { return c == lim.nombre = nombre.lim = lim. this.3. System.WHEN_ALL) (por defecto) un subcomportamiento cualquiera termine (ParalellBehaviour.out.6.println("contador " + nombre + ": " + c). String nombre. this.3 ParallelBehaviour Esta subclase de CompositeBehaviour ejecuta los subcomportamientos de manera concurrente y termina cuando se cumple una determinada condición sobre la terminación de los subcomportamientos. } public void action () { c++.

3). s.WHEN_ALL). s.addSubBehaviour(new Contador(this.core. //ParallelBehaviour s = new ParallelBehaviour(this.Agent. ParallelBehaviour. "A". 3)). s.package examples.addSubBehaviour(new Contador(this.addSubBehaviour(new Contador(this.WHEN_ANY). import jade.addSubBehaviour(new Contador(this. 2)). s.core. public class MiAgente2633 extends Agent{ public void setup() { ParallelBehaviour s = new ParallelBehaviour(this. "E".*. "D". } .addSubBehaviour(new Contador(this. 4)). 5)). s.practicaTres.behaviours. //ParallelBehaviour s = new ParallelBehaviour(this. 3)). "B". "C". ParallelBehaviour. import jade. addBehaviour(s).

protected void takeDown(){ System.lim = lim. this. String nombre.6. this.out. } private class Contador extends SimpleBehaviour { int c. int lim. int lim) { super(a).4 Comportamientos temporales JADE proporciona además dos comportamientos adicionales sencillos para ejecutar operaciones en determinados instantes de tiempo. String nombre. Cosas que es importante recordar: .out.nombre = nombre. public Contador(Agent a. } public void action () { c++.c = 0. } } } 2.println("ejecucion finalizada"). } public boolean done () { return c == lim.println("contador " + nombre + ": " + c). this. System.

intervalo). addBehaviour(new miTicker(this.6. import jade. minticks = 0. El método sleep() es heredado de la clase Thread y cada agente se ejecuta en un único hilo por tanto. Sus métodos action() y done() ya están implementados. Llamar más de una vez al método block() durante la ejecución del mismo comportamiento no tiene efecto.Agent. de tal manera que sólo será relevante la última de estas sentencias. sino también la ejecución de todos los comportamientos del agente. JADE sólo soporta una invocación a este método por cada comportamiento. 2.behaviours. package examples. 1000)). 2. sino que inicia un contador que evitará que se vuelva a ejecutar el mismo comportamiento hasta haber superado un tiempo establecido u ocurra un determinado acontecimiento (por ejemplo la llegada de un mensaje o una llamada al método restart()). long intervalo){ super(a. protected void setup(){ tini = System. Además contamos con el método getTickCount() que devuelve el número de ticks desde el último reseteo del comportamiento. public class MiAgente2641 extends Agent{ long tini. } . public miTicker(Agent a.practicaTres.1.currentTimeMillis().1 Comportamiento TickerBehaviour Permite definir un comportamiento cíclico que ejecutará periódicamente una tarea (el periodo se indica en el constructor) que será implementada sobrecargando el método abstracto onTick(). } private class miTicker extends TickerBehaviour{ int minticks.*. 4.core. El método stop() detiene el comportamiento desde el que se llama a dicho método sin esperar. El método block() no detiene la ejecución del comportamiento actual. su invocación detendrá no sólo la ejecución del comportamiento actual. import jade.core.4. 3.

mitick = " + minticks + " y reseteo"). Los métodos action() y done() ya están implementados y la funcionalidad del comportamiento debe ser implementada sobrecargando el método abstracto onWake().4.] tick = " + nticks + ".tini. package .println("[" + tfin + "ms.println("reseteo!").println("[" + tfin + "ms.6.. int nticks = getTickCount().core. // obtenemos el numero de ticks desde el último reset minticks++. } else { System. al mismo tiempo que comprobaremos como se comporta un agente cuando ejecutamos el método sleep() a diferencia de block()..public void reset () { super.out. if (nticks == 5) { System.. En el siguiente ejemplo veremos el funcionamiento de WakerBehaviour. reset(). } protected void onTick() { long tfin = System.out. } } } } 2.2 Comportamiento WakerBehaviour Este comportamiento implementa un comportamiento one-shot que se ejecuta una vez haya transcurrido un tiempo especificado.*. public class .reset().. después del cual el comportamiento se dará por completado.core. extends Agent { .currentTimeMillis() . mitick = " + minticks).] tick = " + nticks + ". import jade.behaviours. System.Agent.out. //minticks = 0.. import jade.

out...(. } } ).7 Ejercicios Ejemplo: Veremos un ejemplo de un agente que muestra por pantalla los días de la semana y al acabar la .sleep(5000).() { System..println("[ 1 ] Tiempo transcurrido: "+ (System...")..currentTimeMillis()-tini) + "ms.*/ } } Por último indicar que aunque TickerBehaviour y WakerBehaviour son conceptualmente subclases de las clases Cyclic y OneShot.(.. 1000) { protected void .private long tini.() { System."). /* addBehaviour( new . 10000){ protected void .currentTimeMillis()-tini) + "ms.out.. están implementadas como extensiones de Simplebehaviour y Behaviour 2. try { Thread.println("error").. addBehaviour( new .. protected void setup() { tini = System. } } } ).currentTimeMillis()..out..println("[*2*] Tiempo transcurrido: " + (System.. } catch (InterruptedException e) { System..

behaviours. Para ello debemos: a) Crear dos comportamientos C1 y C2. } // Comprueba si el comportamiento ha finalizado. } // Finalización del agente protected void takeDown(){ System. . . .out. // Inicializacion del agente protected void setup(){ . public boolean done(){ . public class ejemploComportamiento extends Agent{ private Behaviour comp.Agent. // Función que realiza MiComportamiento public void action(){ ..println("La semana ya acabo").*.core.. . import jade.core.semana finaliza: import jade. } } } Ejercicio Grupo Sil: En este ejercicio veremos un poco como es el flujo de control de un agente. . } // Definición de un comportamiento private class MiComportamiento extends Behaviour{ private int dia = 0.

println("Agente inicializado")..{ private Behaviour comp1.{ System.b) Hacer que ambos comportamientos ejecuten un println y se bloqueen durante un tiempo. ..println("Agente Finalizado"). al eliminarse el agente.out..{ int repeticiones = 0. } protected void takeDown(){ System.. } .out. import jade... . . public class .. Normas de envío: Enviar el ejercicio a la dirección de correo: Adjuntar los siguientes datos: Nombre y Apellidos Grupo Código de ayuda: package .println("Comportamiento 1 Iniciado"). Con esto veremos que aunque C1 debería seguir imprimiendo por pantalla el mensaje. import . public void . el comportamiento no sigue. protected void setup(){ System.core.Agent... extends . d) Poner el tiempo de bloqueo de C1 mayor que el de C2 (el doble por ejemplo).out. e) Hacer que cuando C2 acabe. } private class MiComportamiento1 extends .comp2.. finalice la ejecución del agente.... c) Poner que ambos comportamientos ejecuten el mismo número de veces el println..

.{ System. { System.... } public int . } } } . } public void ..{ System..{ ...out. repeticiones++. } public int .println("Comportamiento 2 Iniciado"). repeticiones++. . . public void . } } private class MiComportamiento2 extends ... } public boolean .println("C2: Me voy a bloquear")....out. . } public boolean done(){ .....println("Comportamiento 1 Finalizado")..out.out... { System.{ private int repeticiones=0.. return 0.out. return 0..println("Comportamiento 2 Finalizado").println("C1: Me voy a bloquear").public void action(){ System.

Boot container nombreAgente:examples..Boot -gui Ejecutar agente: Situarse en $JADE_HOME$\src y ejecutar: java jade.Ejercicio 2: GRUPO BUBAL Instrucciones de entrega Enviar un correo a grupobubal1011@gmail.java Ejecutar plataforma JADE: Situarse en $JADE_HOME$ y ejecutar: java jade. Para ello simularemos la siguiente figura. situarse en $JADE_HOME$\src y ejecutar: javac examples\practicaTres\*. Sil.java.. PD . . G se ejecutarán 1 vez .NombreDeClase Ejercicio propuesto En este ejercicio vamos a desarrollar los comportamientos paralelos y secuenciales. Instrucciones para compilar y ejecutar el ejemplo     Crear NombreDeClase.PE se ejecutarán 3 veces F.com:   nombre y apellidos.practicaTres. DNI y grupo (Limia.) Código fuente del ejercicio resuelto. Tendremos en cuenta que:     A y B se ejecutarán 2 veces PA. para cada ejercicio y añadirlo a $JADE_HOME$\src\examples\practicaTres Para compilar. PB se ejecutarán 1 vez PC.

.. p........ p. s = new. . import ..{ // crear comportamiento paralelo que finalice cuando se ejecuten todos los subcomportamientos . p... // crear comportamiento secuencial . public class . p.. p = new . ..{ public void .. import .practicaTres. ..Examina el código del siguiente agente y complétalo : package examples. extends . ...... .......... .. p.......

. } protected void .//llamar al comportamiento paralelo s..lim = lim. this. .println("ejecucion finalizada")..out... String nombre.{ System... } public void action () { c++. .... . } } Bibliografia: http://programacionjade. this. { int c.wikispaces..out. .nombre = nombre..c = 0... s... int lim. int lim) { super(a)...com/Comportamientos . s... //añadir comportamiento . . String nombre.println("contador " + nombre + ": " + c). } public boolean done () { . System.. public Contador(Agent a..s.. } private class Contador extends . this. s..

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->