Beruflich Dokumente
Kultur Dokumente
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.
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 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.
import jade.core.Agent;
import jade.core.behaviours.*;
}
public boolean done(){
return true;
}
}
}
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.*;
myAgent.addBehaviour(new MiComportamiento2());
}
public boolean done(){
return true;
}
}
//Este es el otro comportamiento
private class MiComportamiento2 extends Behaviour{
public void action(){
System.out.println("Soy el segundo comportamiento");
}
public boolean done(){
return true;
}
}
}
package examples.practica2;
import jade.core.Agent;
import jade.core.behaviours.*;
//Definición de un comportamiento
private class MiComportamiento1 extends Behaviour{
- el método action().
Este método define la acción a ser ejecutada cuando se ejecute el comportamiento. Debe incluir el
código de las acciones a realizar cuando se ejecute el comportamiento.
Es invocado cuando se produce el evento asociado al comportamiento.
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.
- el método done().
package examples.practica2;
import jade.core.Agent;
import jade.core.behaviours.*;
// Definición de un comportamiento
private class MiComportamiento extends Behaviour{
private int estado = 0;
Un comportamiento también puede ser bloqueado utilizando el método block(). Este método
permite bloquear un comportamiento hasta que algún acontecimiento ocurra (típicamente, hasta
que un mensaje llegue). Este no afecta a los demás comportamientos de un agente.
Cuando el método action() termina, el método block() coloca el comportamiento en la cola de
comportamientos bloqueados.
Además, un objeto de la clase Behaviour puede bloquearse durante una cantidad limitada de
tiempo que se pasa por valor al método block(), expresado en milisegundos.
Debe tenerse en cuenta que el método block() no es como el método sleep() de los Threads. El
método block() no para la ejecución del comportamiento sino que espera a que finalice el
método action(). Una vez finalizado, si el comportamiento no termina, é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.
package examples.practica2;
import jade.core.Agent;
import jade.core.behaviours.*;
// Definición de un comportamiento
private class MiComportamiento extends Behaviour
{
int numeroEjecuciones = 1;
La clase Behaviour también proporciona dos métodos llamados onStart() y onEnd(). Estos
métodos pueden ser sobrescritos por el usuario para ejecutar acciones anteriores o posteriores a la
ejecución del método action(). Estos métodos se implementan solamente una vez.
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. Sin embargo, 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.practica2;
import jade.core.Agent;
import jade.core.behaviours.*;
// Definición de un comportamiento
private class MiComportamiento extends Behaviour{
// Este método se ejecuta justo antes de la ejecución del método
action()
public void onStart()
{
System.out.println("Esto se hace cada vez que se inicia el
comportamiento");
}
System.out.println("Hola a todos.");
return 0;
}
}
}
Un comportamiento puede bloquearse (block()) cuando el método action() termina, 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.
Es importante recordar que, cuando el método action() se está ejecutando, ningún otro
comportamiento (de ese mismo agente) puede continuar su ejecución hasta que termine dicho
método.
2.5 Flujo de control de un agente
while (salir) {
if (cont > 0) {
salir = true;
}
cont++;
}
block(1000);
}
En muchas ocasiones los agentes realizan, o tratan de realizar, funcionalidades complejas que
pueden llegar a implicar tareas simultáneas forzando a implementar agentes multihilo, lo que
puede causar problemas. JADE proporciona un sistema de comportamientos (behaviours) que
ayudan al usuario a construir sistemas multiagente y reutilizar código.
Se corresponde con la clase abstracta Behaviour. Mantienen un estado del agente y en base a él
se ejecutan diferentes operaciones. Finalizan cuando cierta condición se cumple.
Un ejemplo sencillo de este tipo de comportamiento es el código escrito en el apartado 2.3.
En este tipo de comportamiento el método done() siempre devuelve "true", de forma que sólo se
ejecuta una vez y de forma ininterrumpida.
package examples.practicaTres;
import jade.core.Agent;
import jade.core.behaviours.*;
2.6.2.2 CyclicBehaviour
1. checkTermination(): Se ejecuta después de la ejecución de cada hijo para saber cuando se debe
terminar el comportamiento.
2. getCurrent(): Devuelve el comportamiento hijo que actualmente está programado para ejecutarse.
3. scheduleFirst(): Programa al primer hijo para ser ejecutado.
4. scheduleNext(): Programa al siguiente hijo para ser ejecutado.
2.6.3.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.
Se utilizarán los siguientes metodos:
De manera secuencial, y definiendo transiciones entre estados, se implementa la acción que debe
realizar el comportamiento.
Hay que tener en cuenta una serie de cuestiones como:
} //class MiFSMBehaviour
}//class MiAgente
2.6.3.2 SequentialBehaviour
package examples.practicaTres;
import jade.core.Agent;
import jade.core.behaviours.*;
2.6.3.3 ParallelBehaviour
JADE proporciona además dos comportamientos adicionales sencillos para ejecutar operaciones
en determinados instantes de tiempo.
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(). Sus
métodos action() y done() ya están implementados. Además contamos con el
método getTickCount() que devuelve el número de ticks desde el último reseteo del
comportamiento.
package examples.practicaTres;
import jade.core.Agent;
import jade.core.behaviours.*;
long tini;
int minticks;
Este comportamiento implementa un comportamiento one-shot que se ejecuta una vez haya
transcurrido un tiempo especificado. Los métodos action() y done() ya están implementados y la
funcionalidad del comportamiento debe ser implementada sobrecargando el método
abstracto onWake(), después del cual el comportamiento se dará por completado. En el siguiente
ejemplo veremos el funcionamiento de WakerBehaviour, al mismo tiempo que comprobaremos
como se comporta un agente cuando ejecutamos el método sleep() a diferencia de block().
package ...;
import jade.core.Agent;
import jade.core.behaviours.*;
addBehaviour(
new ...(..., 1000) {
protected void ...() {
System.out.println("[ 1 ] Tiempo transcurrido: "+
(System.currentTimeMillis()-tini) + "ms.");
}
}
);
/*
addBehaviour(
new ...(..., 10000){
protected void ...() {
System.out.println("[*2*] Tiempo transcurrido: " +
(System.currentTimeMillis()-tini) + "ms.");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("error");
}
}
}
);*/
}
}
Por último indicar que aunque TickerBehaviour y WakerBehaviour son conceptualmente subclases
de las clases Cyclic y OneShot, están implementadas como extensiones de Simplebehaviour y
Behaviour
2.7 Ejercicios
Ejemplo:
Veremos un ejemplo de un agente que muestra por pantalla los días de la semana y al acabar la
semana finaliza:
import jade.core.Agent;
import jade.core.behaviours.*;
// Definición de un comportamiento
private class MiComportamiento extends Behaviour{
private int dia = 0;
En este ejercicio veremos un poco como es el flujo de control de un agente. Para ello debemos:
a) Crear dos comportamientos C1 y C2.
b) Hacer que ambos comportamientos ejecuten un println y se bloqueen durante un tiempo.
c) Poner que ambos comportamientos ejecuten el mismo número de veces el println.
d) Poner el tiempo de bloqueo de C1 mayor que el de C2 (el doble por ejemplo).
e) Hacer que cuando C2 acabe, finalice la ejecución del agente.
Con esto veremos que aunque C1 debería seguir imprimiendo por pantalla el mensaje, al
eliminarse el agente, el comportamiento no sigue.
Normas de envío:
Nombre y Apellidos
Grupo
Código de ayuda:
package ...;
import ...;
import jade.core.Agent;
Instrucciones de entrega
Ejercicio propuesto
En este ejercicio vamos a desarrollar los comportamientos paralelos y secuenciales. Para ello simularemos la
siguiente figura. Tendremos en cuenta que:
A y B se ejecutarán 2 veces
PA, PB se ejecutarán 1 vez
PC, PD ,PE se ejecutarán 3 veces
F, G se ejecutarán 1 vez
Examina el código del siguiente agente y complétalo :
package examples.practicaTres;
import ...;
import ...;
p. ...;
p. ...;
p. ...;
p. ...;
p. ...;
s. ...;
s. ...;
//añadir comportamiento
...;
}
protected void ...{
System.out.println("ejecucion finalizada");
}
Bibliografia:
http://programacionjade.wikispaces.com/Comportamientos