2. 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
3. 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?
4. 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?
5. 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
6. 2.2 Añadir y eliminar 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
7. 2.2 Añadir y eliminar Ejemplo de cómo añadir un comportamiento desde el método setup() importjade.core.Agent; importjade.core.behaviours.*; publicclass MiAgente extends Agent { protectedvoidsetup() { //Aqui es donde se añade el comportamiento. addBehaviour(new MiComportamiento1()); } //Este es el comportamiento. privateclass MiComportamiento1 extends Behaviour { publicvoidaction(){ System.out.println("Mi nombre es: "+getName() ); System.out.println("Soy el comportamiento del agente"); } publicboolean done(){ returntrue; } } }
8. 2.2 Añadir y eliminar 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. importjade.core.Agent; importjade.core.behaviours.*; publicclass MiAgente extends Agent { protectedvoidsetup() { //Aqui es donde se añade el comportamiento. addBehaviour(new MiComportamiento1()); } //Este es el comportamiento. privateclass MiComportamiento1 extends Behaviour { publicvoidaction(){ System.out.println("Mi nombre es: "+getName() ); System.out.println("Soy el primer comportamiento");
9. 2.2 Añadir y eliminar Ejemplo de cómo añadir un comportamiento desde otro comportamiento (continuación) myAgent.addBehaviour(new MiComportamiento2()); } publicboolean done(){ return true; } } //Este es el otro comportamiento private class MiComportamiento2 extends Behaviour { publicvoidaction()v{ System.out.println("Soy el segundo comportamiento"); } publicboolean done(){ return true; } } }
10. 2.2 Añadir y eliminar Un comportamiento también puede ser eliminado de un agentecon 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)
11. 2.2 Añadir y eliminar package examples.practica2; importjade.core.Agent; importjade.core.behaviours.*; publicclass Ejemplo1 extends Agent{ privateBehaviour comp; // Inicialización del agente protectedvoidsetup() { //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 privateclass MiComportamiento1 extends Behaviour { // define la acción a ser ejecutada cuando se ejecute el comportamiento. publicvoidaction(){ 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()); }
12. 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. publicboolean done(){ returntrue; } } //Definición de un segundo comportamiento privateclass MiComportamiento2 extends Behaviour{ publicvoidaction() { System.out.println("Soy el segundo comportamiento"); myAgent.removeBehaviour(comp);//Borramos el primer comportamiento; } publicboolean done() { returntrue; } } }
13. 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()
14. 2.3 Métodos Ejemplo del funcionamiento de action() y done() importjade.core.Agent; importjade.core.behaviours.*; publicclass Ejemplo2 extends Agent { // Inicialización del agente protectedvoidsetup() { // Añade un comportamiento addBehaviour(new MiComportamiento()); } // Finalización del agente protectedvoidtakeDown() { System.out.println("La escala ha terminado"); }
15. 2.3 Métodos // Definición de un comportamiento privateclass MiComportamiento extends Behaviour { privateint estado = 0; // Función que realiza MiComportamiento publicvoidaction() { 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. publicboolean done() { return (estado > 7); } } }
16. 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.
18. 2.3 Métodos // Definición de un comportamiento privateclass MiComportamiento extends Behaviour { intnumeroEjecuciones = 1; // // Función que realiza MiComportamiento publicvoidaction() { 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 publicboolean done(){ if(numeroEjecuciones>10){ myAgent.doDelete(); returntrue; } elsereturn false; } } }
19. 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.
20. 2.3 Métodos packageexamples.practica2; importjade.core.Agent; importjade.core.behaviours.*; publicclass Ejemplo4 extends Agent{ // Inicialización del agente protectedvoidsetup() { // Añadir un comportamiento. addBehaviour(new MiComportamiento()); } // Definición de un comportamiento privateclass MiComportamiento extends Behaviour { // Este método se ejecuta justo antes de la ejecución del método action() publicvoidonStart() { System.out.println("Esto se hace cada vez que se inicia el comportamiento"); }
21. 2.3 Métodos // Funcion a realizar por el comportamiento publicvoidaction() { 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 publicboolean done(){ return true; } // Se ejecuta antes de finalizar el comportamiento publicintonEnd() { // Hace que el comportamiento se reinicie al finalizar. reset(); myAgent.addBehaviour(this); return0; } } }
22. 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.
23. 2.4 Flujo de control doDelete() Si takeDown() Setup() No No Eliminar comportamiento de activos Done() Siguiente comportamiento de activos Si Action()