Tipos De Comportamiento

36,206 views
35,976 views

Published on

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.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
36,206
On SlideShare
0
From Embeds
0
Number of Embeds
74
Actions
Shares
0
Downloads
71
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Tipos De Comportamiento

  1. 2. <ul><li>Tipos de comportamiento </li></ul><ul><ul><li>Comportamiento genérico </li></ul></ul><ul><ul><li>Comportamientos simples </li></ul></ul><ul><ul><ul><li>OneShotBehaviour </li></ul></ul></ul><ul><ul><ul><li>CyclicBehaviour </li></ul></ul></ul><ul><ul><li>Comportamientos compuestos </li></ul></ul><ul><ul><ul><li>FSMBehaviour </li></ul></ul></ul><ul><ul><ul><li>SequentialBehaviour </li></ul></ul></ul><ul><ul><ul><li>ParallelBehaviour </li></ul></ul></ul><ul><ul><li>Comportamientos temporales </li></ul></ul><ul><ul><ul><li>TickerBehaviour </li></ul></ul></ul><ul><ul><ul><li>WakerBehaviour </li></ul></ul></ul>
  2. 3. <ul><li>Los agentes pueden realizar funcionalidades complejas que pueden llegar a implicar tareas simultáneas forzando a implementar agentes multihilo causando problemas. </li></ul><ul><li>JADE proporciona un sistema de comportamientos (behaviours) que ayudan al usuario a construir sistemas multiagente y reutilizar código. </li></ul>
  3. 4. <ul><li>El paquete jade.core.behaviours contiene las clases que se usan para implementar comportamientos básicos de agentes. </li></ul><ul><li>Los agentes JADE programan sus comportamientos con un solo hilo. </li></ul><ul><li>Se eliminan los problemas de sincronización entre comportamientos concurrentes que acceden al mismo recurso, haciendo que cada agente sea equivalente a un único hilo. </li></ul>
  4. 5. <ul><li>Comportamientos Genéricos: </li></ul><ul><ul><li>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. </li></ul></ul><ul><li>Comportamientos Simples: </li></ul><ul><ul><li>Se corresponden con la clase SimpleBehaviour que representa a comportamientos atómicos, que suelen realizar tareas simples. </li></ul></ul><ul><ul><ul><li>reset () :Devuelve el comportamiento a su estado inicial. </li></ul></ul></ul><ul><ul><li>OneShotBehaviour: el método done() siempre devuelve &quot;true“. </li></ul></ul>
  5. 6. <ul><li>package examples.practicaTres; </li></ul><ul><li>import jade.core.Agent; </li></ul><ul><li>import jade.core.behaviours.*;   </li></ul><ul><li>public class OneShot extends Agent{   </li></ul><ul><li>public void setup() { </li></ul><ul><li>MyOneShotBehaviour c = new MyOneShotBehaviour(); </li></ul><ul><li>addBehaviour(c); </li></ul><ul><li>}   </li></ul><ul><li>protected void takeDown(){ </li></ul><ul><li>System.out.println(&quot;Ejecucion finalizada&quot;); </li></ul><ul><li>}   </li></ul><ul><li>private class MyOneShotBehaviour extends OneShotBehaviour { </li></ul><ul><li>public void action() { </li></ul><ul><li>System.out.println(&quot;Ejecutamos la accion una sola vez&quot;); </li></ul><ul><li>myAgent.doDelete(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  6. 7. <ul><li>CyclicBehaviour : representa un comportamiento que debe ejecutarse una serie de veces. </li></ul><ul><ul><li>El método done() devuelve false. </li></ul></ul><ul><ul><li>Se mantiene activo tanto tiempo como esté activo el agente. </li></ul></ul><ul><ul><li>Hay riesgo de que se pueda quedar con toda la CPU. </li></ul></ul>
  7. 8. <ul><li>package examples.practicaTres; </li></ul><ul><li>import jade.core.Agent; </li></ul><ul><li>import jade.core.behaviours.*; </li></ul><ul><li>public class Cyclic extends Agent{   </li></ul><ul><li>public void setup() { </li></ul><ul><li>MyCyclicBehaviour c = new MyCyclicBehaviour(); </li></ul><ul><li>addBehaviour(c); </li></ul><ul><li>}   </li></ul><ul><li>protected void takeDown(){ </li></ul><ul><li>System.out.println(&quot;Ejecucion finalizada&quot;); </li></ul><ul><li>}   </li></ul><ul><li>private class MyCyclicBehaviour extends CyclicBehaviour { </li></ul><ul><li>public void action() { </li></ul><ul><li> System.out.println(&quot;Ejecutamos la accion ciclicamente&quot;); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  8. 9. <ul><li>Esta clase abstracta modela comportamientos a partir de la composición de otros comportamientos (hijos). </li></ul><ul><li>Está compuesta por diferentes subcomportamientos que se pueden ejecutar siguiendo diferentes políticas de planificación. </li></ul><ul><li>Las diferentes políticas vienen determinadas por la subclase elegida, que puede ser del tipo: </li></ul><ul><ul><li>SequentialBehaviour </li></ul></ul><ul><ul><li>ParallelBehaviour </li></ul></ul><ul><ul><li>FSMBehavior </li></ul></ul>
  9. 10. <ul><li>Se utilizarán los siguientes metodos: </li></ul><ul><li>checkTermination() : Se ejecuta después de la ejecución de cada hijo para saber cuando se debe terminar el comportamiento. </li></ul><ul><li>getCurrent() : Devuelve el comportamiento hijo que actualmente está programado para ejecutarse. </li></ul><ul><li>scheduleFirst() : Programa al primer hijo para ser ejecutado. </li></ul><ul><li>scheduleNext() : Programa al siguiente hijo para ser ejecutado. </li></ul>
  10. 11. <ul><li>FSMBehavior: </li></ul><ul><ul><li>Permite definir una Máquina de Estados finita mediante subcomportamientos. </li></ul></ul><ul><ul><li>Cada subcomportamiento representa un estado de la máquina y las transiciones se van produciendo según la salida de dichos estados. </li></ul></ul>
  11. 12. <ul><li>Se utilizarán los siguientes metodos: </li></ul><ul><ul><li>registerFirstState(behaviour b, String n ): Establece cúal es el estado inicial. </li></ul></ul><ul><ul><li>registerState(behaviour b, String n ): Registra los estados intermedios. </li></ul></ul><ul><ul><li>registerLastState(behaviour b, String n ): Registra el estado final. </li></ul></ul><ul><ul><li>registerTransition(String s1, String s2, int evento ): Registra las transiciones entre estados. </li></ul></ul><ul><ul><li>registerDeafultTransition(String s1, String s2): Define una transición por defecto entre dos estados. </li></ul></ul>
  12. 13. <ul><li>De manera secuencial, y definiendo transiciones entre estados, se implementa la acción que debe realizar el comportamiento. </li></ul><ul><li>Hay que tener en cuenta una serie de cuestiones como: </li></ul><ul><ul><li>FSMBehaviour carece de método action(). </li></ul></ul><ul><ul><li>Hay que identificar los estados definiendo unas constantes cómo etiquetas. </li></ul></ul><ul><ul><li>Hay que registrar los distintos comportamientos que componen FSMBehaviour a modo de estados. </li></ul></ul><ul><ul><li>El agente finaliza cuando se termina de ejecutar algún sub-comportamiento que se haya registrado como estado final. </li></ul></ul><ul><ul><li>Las transiciones puede ser por defecto o teniendo en cuenta un valor de salida del comportamiento origen. </li></ul></ul>
  13. 14. <ul><li>package examples.practicaTres; </li></ul><ul><li>import jade.core.Agent; </li></ul><ul><li>import jade.core.behaviours.*; </li></ul><ul><li>import java.lang.*; </li></ul><ul><li>public class FSM extends Agent { </li></ul><ul><li>private static final String ONE_STATE = &quot;UNO&quot;; </li></ul><ul><li>private static final String TWO_STATE = &quot;DOS&quot;; </li></ul><ul><li>private static final String THREE_STATE = &quot;TRES&quot;; </li></ul><ul><li>private static final String ERROR_STATE= &quot;CERO&quot;; </li></ul><ul><li>private final int UNO = 1; </li></ul><ul><li>private final int DOS = 2; </li></ul><ul><li>private final int TRES = 3; </li></ul><ul><li>private final int CERO = 0; </li></ul><ul><li>private String entrada=&quot;&quot;; </li></ul><ul><li>public void setup() { </li></ul><ul><li>entrada=&quot;231231231&quot;; </li></ul><ul><li>MiFSMBehaviour b = new MiFSMBehaviour(this,entrada); </li></ul><ul><li>addBehaviour(b); </li></ul><ul><li>} </li></ul>
  14. 15. <ul><li>private class MiFSMBehaviour extends FSMBehaviour{ </li></ul><ul><li>private int transicion=0; </li></ul><ul><li>private String entrada=&quot;&quot;; </li></ul><ul><li>public MiFSMBehaviour(Agent _agente,String ent){ </li></ul><ul><li>super(_agente); </li></ul><ul><li>entrada=ent; </li></ul><ul><li>} </li></ul><ul><li>public void onStart(){ </li></ul><ul><li>registerFirstState(new OneBehaviour(),ONE_STATE); </li></ul><ul><li>registerState(new TwoBehaviour(), TWO_STATE); </li></ul><ul><li>registerState(new ThreeBehaviour(), THREE_STATE); </li></ul><ul><li>registerLastState(new ErrorBehaviour(),ERROR_STATE); </li></ul><ul><li>registerTransition(ONE_STATE, TWO_STATE, DOS); </li></ul><ul><li>registerTransition(TWO_STATE, THREE_STATE,TRES); </li></ul><ul><li>registerTransition(THREE_STATE,ONE_STATE,UNO); </li></ul><ul><li>registerDefaultTransition(ONE_STATE, ERROR_STATE); </li></ul><ul><li>registerDefaultTransition(TWO_STATE, ERROR_STATE); </li></ul><ul><li>registerDefaultTransition(THREE_STATE, ERROR_STATE); </li></ul><ul><li>} </li></ul><ul><li>protected boolean checkTermination(boolean currentDone,int currentResult){ </li></ul><ul><li>System.out.println(&quot; ** Terminado estado numero: &quot;+currentName); </li></ul><ul><li>return super.checkTermination(currentDone,currentResult); </li></ul><ul><li>} </li></ul><ul><li>  </li></ul>
  15. 16. <ul><li>public int getEntrada(){ </li></ul><ul><li>int tipoEvento = CERO; </li></ul><ul><li>if (entrada.length()<1) return tipoEvento; </li></ul><ul><li>else tipoEvento=Integer.parseInt(entrada.substring(0,1)); </li></ul><ul><li>entrada=entrada.substring(1,entrada.length()); </li></ul><ul><li>return tipoEvento; </li></ul><ul><li>} </li></ul><ul><li>private class OneBehaviour extends OneShotBehaviour { </li></ul><ul><li>public void action(){System.out.println(&quot;() Primer estado&quot;);} </li></ul><ul><li>public int onEnd() { return getEntrada();} </li></ul><ul><li>} </li></ul><ul><li>private class TwoBehaviour extends OneShotBehaviour { </li></ul><ul><li>public void action(){System.out.println(&quot;() Estado del segundo comportamiento&quot;); } </li></ul><ul><li>public int onEnd() { return getEntrada();} </li></ul><ul><li>} </li></ul><ul><li>private class ThreeBehaviour extends OneShotBehaviour { </li></ul><ul><li>public void action(){System.out.println(&quot;() Estado del tercer comportamiento&quot;); } </li></ul><ul><li>public int onEnd() { return getEntrada();} </li></ul><ul><li>} </li></ul><ul><li>private class ErrorBehaviour extends OneShotBehaviour { </li></ul><ul><li>public void action(){System.out.println(&quot;() Error de estado&quot;);} </li></ul><ul><li>} </li></ul><ul><li>} //class MiFSMBehaviour </li></ul><ul><li>}//class MiAgente </li></ul>
  16. 17. <ul><li>SequentialBehavior: </li></ul><ul><ul><li>Ejecuta los subcomportamientos de manera secuencial y termina cuando todos ellos han terminado. </li></ul></ul><ul><ul><li>Se utiliza cuando una tarea compleja se puede descomponer en una secuencia de pasos atómicos. </li></ul></ul><ul><ul><li>Para añadir los subcomportamientos se utiliza el método addSubBehaviour() y se ejecutarán en el orden en que sean agregados. </li></ul></ul>
  17. 18. <ul><li>package examples.practicaTres; import jade.core.Agent; import jade.core.behaviours.*;   </li></ul><ul><li>public class MiAgente2632 extends Agent{   </li></ul><ul><li>public void setup() { </li></ul><ul><li>SequentialBehaviour s = new SequentialBehaviour(this); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;A&quot;, 3)); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;B&quot;, 2)); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;C&quot;, 4)); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;D&quot;, 3)); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;E&quot;, 5)); </li></ul><ul><li>addBehaviour(s); }   </li></ul><ul><li>protected void takeDown(){ </li></ul><ul><li>System.out.println(&quot;ejecucion finalizada&quot;); }   </li></ul><ul><li>private class Contador extends SimpleBehaviour { </li></ul><ul><li>int c; </li></ul><ul><li>int lim; </li></ul><ul><li>String nombre;   </li></ul><ul><li>public Contador(Agent a, String nombre, int lim) { </li></ul><ul><li>super(a); </li></ul><ul><li>this.nombre = nombre; </li></ul><ul><li>this.c = 0; this.lim = lim; }   </li></ul><ul><li>public void action () { </li></ul><ul><li>c++; </li></ul><ul><li>System.out.println(&quot;contador &quot; + nombre + &quot;: &quot; + c); }   </li></ul><ul><li>public boolean done () { return c == lim; } </li></ul><ul><li> } </li></ul><ul><li>} </li></ul>
  18. 19. <ul><li>ParalellBehavior: </li></ul><ul><ul><li>Ejecuta los subcomportamientos de manera concurrente. </li></ul></ul><ul><ul><li>Define las constantes que han de ser notificadas al constructor para que el comportamiento termine cuando: </li></ul></ul><ul><ul><ul><li>todos los subcomportamientos lo han hecho (ParalellBehaviour.WHEN_ALL) </li></ul></ul></ul><ul><ul><ul><li>un subcomportamiento cualquiera termine (ParalellBehaviour.WHEN_ANY) </li></ul></ul></ul><ul><ul><ul><li>cuando un número (entero) especificado de subcomportamientos terminen </li></ul></ul></ul><ul><ul><li>Para añadir los subcomportamientos se utiliza el método addSubBehaviour() como en el comportamiento secuencial. </li></ul></ul>
  19. 20. <ul><li>package examples.practicaTres; import jade.core.Agent; import jade.core.behaviours.*;   </li></ul><ul><li>public class MiAgente2633 extends Agent{   </li></ul><ul><li>public void setup() { </li></ul><ul><li>ParallelBehaviour s = new ParallelBehaviour(this, ParallelBehaviour.WHEN_ALL); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;A&quot;, 3)); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;B&quot;, 2)); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;C&quot;, 4)); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;D&quot;, 3)); </li></ul><ul><li>s.addSubBehaviour(new Contador(this, &quot;E&quot;, 5)); </li></ul><ul><li>addBehaviour(s); </li></ul><ul><li>}   </li></ul><ul><li>protected void takeDown(){ </li></ul><ul><li>System.out.println(&quot;ejecucion finalizada&quot;); </li></ul><ul><li>}   </li></ul><ul><li>private class Contador extends SimpleBehaviour { </li></ul><ul><li>int c; int lim; String nombre;   </li></ul><ul><li> public Contador(Agent a, String nombre, int lim) { </li></ul><ul><li>super(a); this.nombre = nombre; </li></ul><ul><li>this.c = 0; this.lim = lim; </li></ul><ul><li> }   </li></ul><ul><li>public void action () { </li></ul><ul><li>c++; System.out.println(&quot;contador &quot; + nombre + &quot;: &quot; + c); </li></ul><ul><li>}   </li></ul><ul><li> public boolean done () { </li></ul><ul><li>return c == lim; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  20. 21. <ul><li>JADE proporciona además dos comportamientos adicionales sencillos para ejecutar operaciones en determinados instantes de tiempo: </li></ul><ul><ul><li>TickerBehaviour </li></ul></ul><ul><ul><li>WakerBehaviour </li></ul></ul><ul><li>Cosas que es importante recordar: </li></ul><ul><ul><li>El método block() inicia un contador que evitará que se vuelva a ejecutar el mismo comportamiento hasta haber superado un tiempo establecido u ocurra un determinado acontecimiento. </li></ul></ul><ul><ul><li>Llamar más de una vez al método block() durante la ejecución del mismo comportamiento no tiene efecto. </li></ul></ul><ul><ul><li>El método sleep() es heredado de la clase Thread y cada agente se ejecuta en un único hilo. </li></ul></ul><ul><ul><li>El método stop() detiene el comportamiento desde el que se llama a dicho método sin esperar. </li></ul></ul>
  21. 22. <ul><li>TickerBehaviour: </li></ul><ul><ul><li>Define un comportamiento cíclico que ejecutará periódicamente una tarea que será implementada sobrecargando el método abstracto onTick() . </li></ul></ul><ul><ul><li>Sus métodos action() y done() ya están implementados. </li></ul></ul><ul><ul><li>El método getTickCount() devuelve el número de ticks desde el último reseteo del comportamiento. </li></ul></ul>
  22. 23. <ul><li>package examples.practicaTres; import jade.core.Agent; import jade.core.behaviours.*;   </li></ul><ul><li>public class MiAgente2641 extends Agent{   </li></ul><ul><li>long tini;   </li></ul><ul><li>protected void setup(){ </li></ul><ul><li>tini = System.currentTimeMillis(); </li></ul><ul><li>addBehaviour(new miTicker(this, 1000)); </li></ul><ul><li>}   </li></ul><ul><li>private class miTicker extends TickerBehaviour {   </li></ul><ul><li>int minticks;   </li></ul><ul><li>public miTicker(Agent a, long intervalo){ </li></ul><ul><li>super(a, intervalo); minticks = 0; </li></ul><ul><li>}   </li></ul><ul><li>public void reset () { </li></ul><ul><li> super.reset(); System.out.println(&quot;reseteo!&quot;); </li></ul><ul><li>}   </li></ul><ul><li> protected void onTick() { </li></ul><ul><li> long tfin = System.currentTimeMillis() - tini; int nticks = getTickCount(); </li></ul><ul><li>reset minticks++; if (nticks == 5) { </li></ul><ul><li>System.out.println(&quot;[&quot; + tfin + &quot;ms.] tick = &quot; + nticks + &quot;, mitick = &quot; + minticks + &quot; y reseteo&quot;); </li></ul><ul><li> reset(); </li></ul><ul><li> } else { </li></ul><ul><li>System.out.println(&quot;[&quot; + tfin + &quot;ms.] tick = &quot; + nticks + &quot;, mitick = &quot; + minticks); } </li></ul><ul><li> } </li></ul><ul><li>} } </li></ul>
  23. 24. <ul><li>WakerBehaviour: </li></ul><ul><ul><li>Este comportamiento implementa un comportamiento one-shot que se ejecuta una vez haya transcurrido un tiempo especificado. </li></ul></ul><ul><ul><li>Los métodos action() y done() ya están implementados y la funcionalidad del comportamiento debe ser implementada sobrecargando el método abstracto onWake(). </li></ul></ul>
  24. 25. <ul><li>package examples.practicaTres; import jade.core.Agent; import jade.core.behaviours.*;   </li></ul><ul><li>public class MiAgente2642 extends Agent {   </li></ul><ul><li>private long tini;   </li></ul><ul><li>protected void setup() { </li></ul><ul><li>tini = System.currentTimeMillis();   </li></ul><ul><li>addBehaviour( </li></ul><ul><li>new TickerBehaviour(this, 1000) { </li></ul><ul><li> protected void onTick() { </li></ul><ul><li> System.out.println(&quot;[ 1 ] Tiempo transcurrido: &quot;+ (System.currentTimeMillis()-tini) + &quot;ms.&quot;); </li></ul><ul><li> } </li></ul><ul><li>} </li></ul><ul><li>);   </li></ul><ul><li>addBehaviour( </li></ul><ul><li>new WakerBehaviour(this, 10000){ </li></ul><ul><li>protected void onWake() { </li></ul><ul><li>System.out.println(&quot;[*2*] Tiempo transcurrido: &quot; + (System.currentTimeMillis()-tini) + &quot;ms.&quot;); try { </li></ul><ul><li>Thread.sleep(5000); </li></ul><ul><li> } catch (InterruptedException e) { </li></ul><ul><li> System.out.println(&quot;error&quot;); } </li></ul><ul><li> } </li></ul><ul><li>} ); </li></ul><ul><li>} } </li></ul>

×