SMA1011_BUBAL_Tipos de comportamiento
Transcript of SMA1011_BUBAL_Tipos de comportamiento
Tabla de contenidos
• Introducción• Tipos de comportamiento
▫ Comportamiento Genérico▫ Comportamiento Simple OneShotBehaviour CyclicBehaviour
▫ Comportamiento Compuesto FSMBehaviour SequentialBehaviour ParallelBehaviour
▫ Comportamientos Temporales TickerBehaviour WakerBehaviour
Introducción I
• Los agentes realizan funcionalidades complejas que pueden llegar a implicar tareas simultáneas forzando a implementar agentes multihilo.
• JADE proporciona un sistema de comportamientos (behaviours) que ayudan al usuario a construir sistemas multiagente y reutilizar código.
• El paquete jade.core.behaviours contiene las clases que se usan para implementar comportamientos básicos de agentes.
• 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.
Introducción IIBehaviour
action(), done()
onStart(), onEnd()
block(), restart()
CompositeBehaviour:checkTermination()
getCurrent()
scheduleFirst()
scheduleNext()
FSM
Behaviour
Sequential
Behaviur
Parallel
Behaviour
Simple Behaviour:
reset ()
OneShot
Behaviour
Cyclic
Behaviour
Comportamiento Genérico• 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.
private class MiComportamiento extends Behaviour{
private int estado = 0;
public void action(){
switch(estado){
case 0: System.out.println("Do");
break;
case 1: System.out.println(“Re");
break;
. . .
case 7:{
System.out.println("Do");
myAgent.doDelete();
break;
} }
estado++; }
public boolean done(){
return (estado > 7);
} }
Comportamiento Simple
• Se corresponde con la clase SimpleBehaviour.
• Representa comportamientos atómicos, (realizar tareas simples).
• Se utilizarán los siguientes métodos:reset ():Devuelve el comportamiento a su estado inicial.
OneShotBehaviour
• El método done() siempre devuelve "true", de forma que sólo se ejecuta una vez y de forma ininterrumpida.
Public class MyOneShotBehaviour extendsOneShotBehaviour{public void action(){
//perform operation X}
}
La operación X se ejecuta solo una vez
CyclicBehaviour
• Comportamiento que debe ejecutarse una serie de veces.
• El método done() devuelve false.
• Se mantiene activo tanto tiempo como esté activo el agente.
• Hay riesgo de que se pueda quedar con toda la CPU.
CyclicBehaviour
Public class MyCyclicBehaviour extendsCyclicBehaviour{
public void action(){
//perform operation Y
}
}
La operación Y se ejecuta repetitivamente hasta que termine la ejecución del agente.
Comportamiento Compuesto
• Compuesta por diferentes subcomportamientos que se pueden ejecutar siguiendo diferentes políticas de planificación.
• Pueden ser del tipo: ▫ SequentialBehaviour, ▫ ParallelBehaviour▫ FSMBehavior.
• Se utilizarán los siguientes métodos:
▫ checkTermination(): Se ejecuta después de la ejecución de cada hijo para saber cuando se debe terminar el comportamiento.
▫ getCurrent(): Devuelve el comportamiento hijo que actualmente está programado para ejecutarse.
▫ scheduleFirst(): Programa al primer hijo para ser ejecutado.▫ scheduleNext(): Programa al siguiente hijo para ser ejecutado
Comportamiento Compuesto
primera vez?
scheduleFirst() scheduleNext()
b=getCurrent()
b.action()
checkTerminat
ion()
FSMBehaviour I
• Define 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.
FSMBehaviour II
• A tener en cuenta I:
▫ carece de método action(), la implementación de estados y transiciones debe realizarse en:
el constructor en su método onStart() o después de añadir el comportamiento en el nacimiento del
agente.
▫ Identificar los estados definiendo unas constantes cómo etiquetas.
Ejemplo: private static final String ONE_STATE = "UNO";
FSMBehaviour III
• A tener en cuenta II:
▫ Registrar los distintos comportamientos que componen FSMBehavioura modo de estados.
Ejemplo: registerFirstState(new OneBehaviour(),ONE_STATE); registerState(new TwoBehaviour(), TWO_STATE); registerLastState(new ErrorBehaviour(),ERROR_STATE);
▫ El agente finaliza cuando se termina de ejecutar algún sub-comportamiento que se haya registrado como estado final.
▫ Las transiciones puede ser: por defecto
Ejemplo: registerDefaultTransition(ONE_STATE, ERROR_STATE);
teniendo en cuenta un valor de salida del comportamiento origen, que será devuelto por el método onEnd() de cada comportamiento Ejemplo: registerTransition(ONE_STATE, TWO_STATE, DOS);
FSMBehaviour IV• Práctica guiada
• http://programacionjade.wikispaces.com
ONE_STATE
TWO_STATE
THREE_STATE
ERRORERROR_STATE
DOS TRES
UNO
SequentialBehaviour
• ejecuta los subcomportamientos de manera secuencial y termina cuando todos ellos han terminado.
• Se utiliza cuando una tarea compleja se puede descomponer en una secuencia de pasos atómicos.
• Para añadir los subcomportamientos se utiliza el método addSubBehaviour() y se ejecutarán en el orden en que sean agregados.
ParallelBehaviour• Ejecuta los subcomportamientos de manera concurrente
• Define las constantes que han de ser notificadas al constructor para que el comportamiento termine cuando:▫ todos los subcomportamientos lo han hecho
(ParalellBehaviour.WHEN_ALL)▫ un subcomportamiento cualquiera termine
(ParalellBehaviour.WHEN_ANY)▫ cuando un número (entero) especificado de subcomportamientos
terminen
• Para añadir los subcomportamientosse utiliza el método addSubBehaviour()como en el comportamiento secuencial.
Comportamientos Temporales
• Jade proporciona dos comportamientos adicionales sencillos.
• Estos comportamientos son para ejecutar operaciones en determinados instantes de tiempo.
TickerBehaviour
• Define un comportamiento cíclico que ejecuta periódicamente una tarea.
• Esta tarea será implementada sobrecargando el método abstracto onTick().
• Esta tarea se realiza cada X tiempo, especificado en el constructor.
• Los métodos action() y done() ya están implementados.
TickerBehaviour
• El método getTickCount() devuelve el número de ticks desde el último reseteo del comportamiento.Ejemplo:
public class MyAgente extends Agent{Protected void setup(){
addBehaviour(new TickerBehaviour(this,5000){Protected void onTick(){//tarea a realizar cada 5 segundos}
});
}}
La tarea ser realiza cada 5 segundos
WakerBehaviour
• Implemente un comportamiento One-Shot que se ejecuta una vez haya transcurrido un tiempo especificado X especificado en el constructor.
• Esta tarea será implementada sobrecargando el método abstracto onWake().
• Una vez realizada esta tarea el comportamiento se dará por completado.
• Los métodos action() y done() ya están implementados.
WakerBehaviour
Ejemplo:public class MyAgente extends Agent{
Protected void setup(){
System.out.println(“Añadiendo nuevo behaviour”);
addBehaviour(new WakerBehaviour(this,5000){
Protected void onWaket(){
//tarea x
}
});
}
}
La operación X se ejecutara 5 segundos después que aparece el mensaje “Añadiendo nuevo behaviour”
Ejemplo Comportamientos Temporales
• Entramos en la página http://programacionjade.wikispaces.com
• Clickamos en 2.Comporamientos - > 2.4.6 Comportamientos Temporales
• Y copiamos el código del apartado:
2.6.4.2 Comportamiento WakerBehaviour
Resultado
• Este es un ejemplo mixto entre los dos tipos de comportamientos.
• El comportamiento TickerBehaviour escribe la línea precedida por el [1].
new TickerBehaviour(this, 1000) {protected void onTick() {
System.out.println("[ 1 ] Tiempo transcurrido: "+ (System.currentTimeMillis()-tini) + "ms.");
}}
Como podemos observar, esta tarea se ejecuta cada segundo, de manera cíclica durante todo el tiempo de ejecución.
Resultado
• El comportamiento WakerBehaviour escribe la línea precedida por el [*2*].
new WakerBehaviour(this, 10000){protected void onWake() {System.out.println("[*2*] Tiempo transcurrido: " + (System.currentTimeMillis()-tini) + "ms.");try {
Thread.sleep(5000); }catch (InterruptedException e) {
System.out.println("error");}
}
Como podemos observar, esta tarea se ejecuta a los 10 segundos, se ejecuta una sola vez y pone el hilo a dormir durante 5 segundos, en los cuales no se mostrara nada por pantalla, pues el comportamiento TickerBehaviour corresponde al mismo hilo que el del WakerBehaviour, el cual estara dormido durante 5 segundos.