sma
TRANSCRIPT
Grupo Sil
Funcionalidad del agente. Especifican tareas o servicios. Tipos de comportamientos:
◦ Simples◦ Compuestos
jade.core.behaviours.*jade.core.behaviours.Behaviour
class MiComportamiento extends Behaviour{ …
}
La programación basada en comportamientos debe realizar los siguientes pasos:◦ Determinar qué debe ser capaz de hacer el
agente.◦ Asociar cada funcionalidad con un
comportamiento.◦ Escoger el tipo de comportamientos◦ Dejar a JADE la tarea del planificador
Métodos: ◦addBehaviour(Behaviour)◦ removeBehaviour(Behaviour)
Los comportamientos pueden ser añadidos o eliminados en cualquier momento de la vida del agente.
Se crean mediante una clase privada dentro de la clase del agente.
Toda clase que herede de Behaviour deberá implementar 2 métodos:◦ action() -> define la acción a ser ejecutada en el
comportamiento.◦ done() -> se invoca automáticamente después de
finalizar action() y comprueba si el comportamiento ha finalizado
public class Ejemplo2 extends Agent{ …// 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 1: System.out.println("Re"); break; case 2: System.out.println("Mi"); break; …
} // Comprueba si el comportamiento ha finalizado. public boolean done(){ return (estado > 7); }
} }
Un comportamiento también puede ser bloqueado utilizando block()
este método permite bloquear un comportamiento hasta que algún acontecimiento ocurra.
El método block() no para la ejecución del comportamiento sino que espera a que finalice el método action().
…// 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++; } …
Se puede desbloquear si:◦ El agente al que pertenece ese comportamiento
recibe un mensaje ACL◦ Una interrupción asociada con este
comportamiento por el método block() expira. ◦ El método restart() es llamado explícitamente por
el comportamiento, así se fuerza el desbloqueo.
La clase Behaviour también proporciona dos métodos llamados onStart() y onEnd()◦ El método onStart() se ejecuta justo antes de la
ejecución del método action().◦ 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.
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"); } public void action(){
…} public boolean done(){ .. }
// Se ejecuta antes de finalizar el comportamiento public int onEnd(){
// Hace que el comportamiento se reinicie al finalizar. reset(); myAgent.addBehaviour(this); return 0; }
}}
Cada agente tiene un planificador de comportamientos.
El funcionamiento de los comportamientos está implementado a 2 niveles:◦ Una cola circular de los comportamientos activos◦ Una cola con los comportamientos bloqueados
La política de planificación se realiza de forma no preemptiva.
Los comportamientos de un agente no se ejecutan de forma concurrente.
Cuando el método action() se está ejecutando, ningún otro comportamiento puede ejecutarse hasta que termine.
El programador debe decidir qué comportamiento se ejecuta en cada momento.
Los comportamientos bloqueados se colocan en la cola de los comportamientos bloqueados.
Cuando este comportamiento se desbloquea se saca de la cola de bloqueados y se coloca al final de la cola de comportamientos activos.
¿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 comportamiento de la cola.
c) No finaliza nunca puesto que el método action() no finaliza.
d) Finaliza siempre puesto que el método done() devuelve siempre true.
public class MiComportamiento extends Behaviour { private boolean salir = true; private int cont = 0; public void action(){ while (salir) { if (cont > 10) { salir = true; } cont++; } block(1000); } public boolean done(){ return true; }}
Crear un agente con un comportamiento que muestre un día de la semana cada vez que se invoque su método action().
El comportamiento finalizará cuando termine la semana.
En el método onEnd() debe cancelar el agente. Cada vez que se muestre un día de la semana, se
bloqueará el agente durante un segundo y mostrará un mensaje por pantalla.
Cuando se inicie el comportamiento, se mostrará un mensaje por pantalla indicando que se ha iniciado correctamente.
Mostrar por pantalla que el comportamiento ha finalizado.