Tema 2 sma
Transcript of Tema 2 sma
2.COMPORTAMIENTO
S
Agentes
Jade
2.1 ¿QUÉ ES UN
COMPORTAMIENTO?
Un comportamiento (behavior) es una funcionalidad o conducta
que tiene un agente.
Especifican tareas o servicios enfocados a un objetivo
Tareas simples
Enviar un mensaje
Comprar libro
Comportamientos compuestos
Cada tarea es una instancia de una clase que debe heredar de la
clase Behaviour
class MiComportamiento extends Behaviour{…}
El código java que implementa la funcionalidad ha de importar el
paquete, o simplemente la clase Behaviour
jade.core.behaviours.*
jade.core.behaviours.Behaviour
2.1 ¿QUÉ ES UN
COMPORTAMIENTO?
Descripción de los métodos de la clase Behaviour
Los comportamientos son la base de la programación de
agentes.
Pasos para la programación de agentes:
Determinar las capacidades del agente
Asociar funcionalidades a comportamientos
Elegir tipo de comportamientos
Jade se encarga de la planificación (scheduling)
En cada instante de tiempo sólo un comportamiento se está
ejecutando
2.1 ¿QUÉ ES UN
COMPORTAMIENTO?
2.2 AÑADIR Y
ELIMINAR
Los métodos para añadir y borrar comportamientos los provee la
clase Agent
addBehaviour(Behaviour)
removeBehaviour(Behaviour)
Gestionan la entrada y salida de los objetos Behaviour en la cola
del planificador
Cola FIFO y política Round-Robin
Los comportamientos se añaden o eliminar en cualquier
momento de la vida del agente
Se usará el método setup() o cualquier otro comportamiento u
otros agentes
Crear un comportamiento
Es crear una clase privada dentro de la clase del agente
Asociarlo al agente mediante el método
addBehaviour(Behaviour)
Debe considerarse el añadir un comportamiento como la
ejecución de un nuevo hilo dentro del agente
2.2 AÑADIR Y
ELIMINAR
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;
}
}
}
Ejemplo de cómo añadir un comportamiento desde el método setup()
2.2 AÑADIR Y ELIMINAR
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");
Ejemplo de cómo añadir un comportamiento desde otro comportamiento
Usamos la variable myAgent de la clase Behaviour. Funciona como una referencia
al agente que está ejecutando el comportamiento.
2.2 AÑADIR Y ELIMINAR
myAgent.addBehaviour(new MiComportamiento2());
}
public boolean done(){
return true;
}
}
//Este es el otro comportamiento
private class MiComportamiento2 extends Behaviour {
public void action()v{
System.out.println("Soy el segundo
comportamiento");
} public boolean done(){
return true;
}
}
}
2.2 AÑADIR Y ELIMINAREjemplo de cómo añadir un comportamiento desde otro comportamiento
(continuación)
2.2 AÑADIR Y ELIMINAR
Un comportamiento también puede ser eliminado de un agente
con el método removeBehaviour(Behaviour)
En el ejemplo anterior, se puede borrar el primer
comportamiento desde el segundo con una llamada a
removeBehaviour() dentro del método action del segundo
comportamiento (Ver código)
2.2 AÑADIR Y ELIMINARpackage examples.practica2;
import jade.core.Agent; import jade.core.behaviours.*;
public class Ejemplo1 extends Agent{
private Behaviour comp;
// Inicialización del agente
protected void setup() {
//Creamos un comportamiento: un objeto de la clase
MiComportamiento1 comp = new MiComportamiento1();
//Aqui es donde se añade el comportamiento. addBehaviour(comp);
}
//Definición de un comportamiento
private class MiComportamiento1 extends Behaviour {
// define la acción a ser ejecutada cuando se ejecute el comportamiento.
public void action(){
System.out.println("Mi nombre es: "+getName() );
System.out.println("Soy el primer comportamiento");
// Añade un comportamiento desde otro comportamiento. myAgent.addBehaviour(new
MiComportamiento2()); }
2.2 AÑADIR Y ELIMINAR
// Determina si el comportamiento ha sido completado o no.
// Si el comportamiento ha finalizado, éste se elimina de la cola de comportamientos
activos.
public boolean done(){
return true;
}
}
//Definición de un segundo comportamiento
private class MiComportamiento2 extends Behaviour{
public void action() {
System.out.println("Soy el segundo comportamiento");
myAgent.removeBehaviour(comp);//Borramos el
primer comportamiento;
}
public boolean done() {
return true;
}
}
}
2.3 MÉTODOS
Toda clase heredada de Behaviour debe implementar:
Método Action():
Define la acción que define el comportamiento. Incluye el código de las acciones a
realizar.
Se invoca con el evento asociado al comportamiento
Es recomendable que sean de rápida ejecución ya que no pueden ser interrumpidos
por otro comportamiento.
Método done()
Se invoca cuando finaliza el método action()
Determina con un boolean si se ha finalizado el comportamiento.
En caso afirmativo, el comportamiento se elimina de la cola de comportamientos
activos
Marca opcional que se activa cuando se quiere que finalice el comportamiento
Es evaluada en el método done()
Ejemplo del funcionamiento de action() y done()
import jade.core.Agent;
import jade.core.behaviours.*;
public class Ejemplo2 extends Agent {
// Inicialización del agente
protected void setup() {
// Añade un comportamiento
addBehaviour(new MiComportamiento());
}
// Finalización del agente
protected void takeDown() {
System.out.println("La escala ha terminado");
}
2.3 MÉTODOS
// Definición de un comportamiento
private class MiComportamiento extends Behaviour {
private int estado = 0;
// Función que realiza MiComportamiento
public void action() {
switch(estado) {
case 0: System.out.println("Do"); break;
{…}
case 6: System.out.println("Si"); break;
case 7:{
System.out.println("Do");
myAgent.doDelete();
break;
} }
estado++;
} // Comprueba si el comportamiento ha finalizado.
public boolean done() {
return (estado > 7); } } }
2.3 MÉTODOS
2.3 MÉTODOS Para bloquear un comportamiento usamos el método block()
Bloquea un comportamiento hasta algún evento
No afecta a los demás comportamientos del agente
Al finalizar el método action(), block() coloca el
comportameinto en la cola de comportamientos bloqueados
Un objeto de la clase Behaviour puede bloquearse
temporalmente
Se le pasa el valor al método block() en milisegundos
No es igual al método sleep() de los hilos
Block() espera a la finalización de action(), si el
comportamiento no termina, pasa a la lista de
comportamientos bloqueados durante el tiempo indicado
en el método block() o hasta que ocurra el evento que
espera dicho bloqueo.
2.3 MÉTODOSpackage examples.practica2;
import jade.core.Agent;
import jade.core.behaviours.*;
public class Ejemplo3 extends Agent{
// Inicialización del agente protected void setup()
{
addBehaviour( new MiComportamiento() );
}
// Finalización del agente protected void takeDown() { System.out.println("****Agente finalizado****"); }
2.3 MÉTODOS// Definición de un comportamiento
private class MiComportamiento extends Behaviour {
int numeroEjecuciones = 1;
// // Función que realiza MiComportamiento
public void action() {
System.out.println("Esta es la ejecucion"+numeroEjecuciones);
//lo bloqueamos durante un segundo block(1000); System.out.println("Despues de 1000
milisengundos"); numeroEjecuciones++; }
// Comprueba si el comportamiento ha finalizado
public boolean done(){
if(numeroEjecuciones>10){
myAgent.doDelete();
return true;
}
else return false; } } }
2.3 MÉTODOS Un comportamiento se desbloquea cuando:
El agente al que pertenece recibe un mensage ACL
Sale de la cola de bloqueados y se coloca al final de la cola de activos
Para cada mensaje todos los objetos de la cola de bloqueados deben comprobar si
son los destinatarios, y en cas contrario vuelven a bloquearse
Termina la interrupción asociada al comportamiento por el método block()
Termina el tiempo
Si se llama al método restart() desde el comportamiento.
Behaviour también nos proporciona los métodos onStart() y
onEnd()
onStart(): Se ejecuta justo antes del método action()
onEnd(): Se ejecuta antes de finalizar el comportamiento (cuando done() ha
devuelto true). Devuelve un un entero que representa un valor de terminación
para el comportamiento.
2.3 MÉTODOSpackage examples.practica2;
import jade.core.Agent;
import jade.core.behaviours.*;
public class Ejemplo4 extends Agent {
// Inicialización del agente
protected void setup() {
// Añadir un comportamiento.
addBehaviour(new MiComportamiento()); }
// 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"); }
2.3 MÉTODOS// Funcion a realizar por el comportamiento
public void action() {
System.out.println("Hola a todos.");
//Lo bloqueamos durante un segundo block(1000); System.out.println("Despues de 1 segundo");
}
// Comprueba si el comportamiento ha finalizado
public boolean done(){ return true;
}
// Se ejecuta antes de finalizar el comportamiento
public int onEnd()
{
// Hace que el comportamiento se reinicie al finalizar.
reset();
myAgent.addBehaviour(this);
return 0; } } }
2.4 EJECUCIÓN
Cada agente tiene un scheduler propio.
Planificación preemptiva.
No existe concurrencia real dentro de un mismo agente.
Ahorro de CPU y memoria.
Un comportamiento puede bloquearse cuando termina action().
Se coloca en la cola de comportamientos bloqueados.
Al desbloquear se quita de comportamientos bloqueados y se
pone coloca al final de la cola de comportamientos activos.
Mientras action() se ejecuta no se puede ejecutar ningún otro
método.
2.4 FLUJO DE CONTROL
Setup
()
doDele
te()
Siguiente
comportamie
nto de
activos
Action() Done()Eliminar
comportamiento
de activos
takeDown()Si
No
Si
No