laborator si nr 08 - agenti

5
 Laborator 2 Obiective 1. Com po rt ame nt e 2. Com un ic aţ i a între agenţi 3. Cr ea re a dinam ic ă a agenţilor 4. Ap li ca ţ i e pr op us ă 1.  Comportamente  Execuţia comportamentelor Fiecare agent rulează într-un fir de execuţie propriu (proces Java). Comportamentele se execută secvenţial în cadrul agentului. Acest lucru înseamnă că nici un alt comportament nu poate fi executat până când metoda action() a comportamentului curent nu se încheie. Dacă un comportament se execut ă în mai mul ţ i paşi, metoda done() internă trebuie să returneze  false. După o execuţie, comportamentul este adăugat în coada de aşteptare şi metoda lui action() va fi apelată din nou după execuţia celorlalte comportamente din coadă. Dacă metoda done() a comportamentului returnează true, comportamentul este eliminat şi se consideră finalizat. Un comportament este de fapt un handler de evenimente, care descrie cum ar trebui să reacţioneze agentul la un anume eveniment. Un eveniment este o schimbare relevantă a a stării agentului şi este reprezentat de recepţia unui mesaj sau întreruperea unui Timer.

Upload: senciuc-liviu

Post on 04-Nov-2015

214 views

Category:

Documents


0 download

DESCRIPTION

Agenti

TRANSCRIPT

  • Laborator 2Obiective

    1. Comportamente2. Comunicaia ntre ageni3. Crearea dinamic a agenilor4. Aplicaie propus

    1. ComportamenteExecuia comportamentelor

    Fiecare agent ruleaz ntr-un fir de execuie propriu (proces Java). Comportamentele se execut secvenial n cadrul agentului. Acest lucru nseamn c nici un alt comportament nu poate fi executat pn cnd metoda action() a comportamentului curent nu se ncheie. Dac un comportament se execut n mai muli pai, metoda done() intern trebuie s returneze false. Dup o execuie, comportamentul este adugat n coada de ateptare i metoda lui action() va fi apelat din nou dup execuia celorlalte comportamente din coad. Dac metoda done() a comportamentului returneaz true, comportamentul este eliminat i se consider finalizat.

    Un comportament este de fapt un handler de evenimente, care descrie cum ar trebui s reacioneze agentul la un anume eveniment. Un eveniment este o schimbare relevant a a strii agentului i este reprezentat de recepia unui mesaj sau ntreruperea unui Timer.

    8

  • Clase standard de comportamente SimpleBehaviour - clasa de baz a comportamentelor. Necesit implementarea

    ambelor metode (action() i done()) OneShotBehaviour comportament cu un singur pas. Metoda done() returneaz

    ntotdeauna true. CyclicBehaviour comportament care nu se termin niciodat; metoda done()

    returneaz ntotdeauna false TickerBehaviour execut periodic o secven de cod definit de utilizator. Metoda

    action() este deja implementat, fiind necesar doar implementarea metodei onTick() WakerBehaviour se execut doar dup trecerea unui anumit interval de timp;

    metoda action() este deja implementat, fiind necesar doar implementarea metodei onWake()

    ParallelBehaviour comportament compus din mai multe sub-comportamente care sunt executate n paralel i sunt finalizate cnd toate, oricare sau un numr specificat de sub-comportamente sunt finalizate.

    SequentialBehaviour - comportament compus din mai multe sub-comportamente care sunt executate secvenial.

    Elemente ale clasei Behaviour onStart() aceast metod poate fi implementat astfel nct s execute diferite

    aciuni de iniializare, fiind apelat nainte primei execuii a metodei action() onEnd() poate fi implementat astfel nct s execute unele aciuni de final (exp.:

    afiare mesaje, etc.) fiind apelat naintea eliminrii comportamentului. block() blocheaz comportamentul curent pn la primirea unui nou mesaj.

    Comportamentul blocat nu va fi executat dect atunci cnd va reveni n starea activ. block (long millis) - blocheaz comportamentul curent pn la primirea unui nou

    mesaj sau pn la un moment predefinit (specificat n milisecunde). isRunnable() returneaz false dac comportamentul este blocat sau true n caz

    contrar. myAgent referin la agentul care deine acest comportament. Prin aceast referin

    se permite comportamentelor s apeleze metodele publice ale clasei jade.core.Agent cum ar fi: send(), receive(), doMove(), getLocalName() .etc.

    Exemplu 1. n laboratorul anterior agentul Simple1 utilizeaz un comportament SimpleBehaviour

    care se execut de n ori (n=3). Cu o structur de tip switch se pot executa sarcini diferite n funcie de valoarea lui n.Exemplu 2.

    Aplicaia cu numrul 1 propus n laboratorul anterior se poate realiza cu un comportament de tip TickerBehaviour ca n exemplul urmtor:/***************************************************************** AgentTicker.java *****************************************************************/ import jade.core.Agent; import jade.core.behaviours.*; public class AgentTicker extends Agent { protected void setup() { addBehaviour(

  • new TickerBehaviour(this, 500) { int n=0; protected void onTick() { System.out.println( "Eu, agentul " + myAgent.getLocalName() + "am numarat pana la " + n ); n++; if (n==100) doDelete(); } } ); } } // --- AgentTicker

    Compilarea i execuia se realizeaz n mod asemntor cu aplicaiile din Laboratorul 1 (exp: agentul HelloAgent):compilare: javac -classpath lib\jade.jar -d classes grupa\ AgentTicker.javaexecuie: java -cp lib\jade.jar;classes jade.Boot -gui -agents agTick1:AgentTicker

    2. Comunicaia ntre ageni

    Clasa ACLMessage reprezint mesajele ACL (Agent Communication Language) ce pot fi transmise ntre ageni. Ea conine un set de atribute definite de specificaiile standardului FIPA (the Foundation of Intelligent Physical Agents).

    Un agent care vrea s trimit un mesaj ar trebui s creeze un nou obiect de tip ACLMessage, s dea atributelor valori corespunztoare i, n final, s apeleze metoda Agent.send(). De asemenea, un agent care vrea s primeasc un mesaj ar trebui s apeleze metodele receive() sau blockingReceive(), amndou implementate de clasa Agent.

    Trimiterea / primirea de mesaje pot fi deasemenea programate ca activiti de agent independente adugnd comportamentele ReceiverBehaviour i SenderBehaviour la coada de task-uri a agentului.

    Toate atributele obiectului ACLMessage pot fi accesate prin intermediul metodelor de acces set/get(). Atributele sunt denumite dup numele parametrilor, n conformitate cu specificaiile FIPA. Acei parametri al cror tip l reprezint un set de valori (de exemplu: receiver-ul) pot fi accesai prin intermediul metodelor add/getAll(), unde prima metod adaug setului o valoare, n timp ce a doua metod ntoarce un Iterator cu toate valorile din set. S se observe c toate metodele get() returneaz null cnd atributul nu a fost nc stabilit.

    Mai mult acest clas definete un set de constante care ar trebui folosite pentru a face referin la preformativele FIPA: REQUEST, INFORM, etc.

    La crearea unui nou obiect ACLMessage, una dintre aceste constante trebuie transferate constructorului clasei ACLMessage pentru a putea selecta preformativa mesajului. Metoda reset() reseteaz toate cmpurile mesajului.

    Trimiterea unui mesajimport jade.lang.acl.ACLMessage;import jade.core.AID;

    ACLMessage message = new ACLMessage(ACLMessage.INFORM);message.addReceiver (new AID (ping1, AID.ISLOCALNAME) );message.setContent (ping);

  • myAgent.send (message);

    Tipuri de mesaje:ACLMessage.INFORM, REQUEST, PROPOSE, QUERY_IF etc.

    Clasa AID permite lucrul cu identificatorii agenilor conform standardelor FIPA (aceste id-uri conin numele local al agentului i adresa platformei). Pentru transmiterea mesajelor n cadrul aceleiai platforme, numele local este suficient.

    Primirea unui mesajCitirea unui mesaj din coada privat de mesaje a unui agent este realizat prin metoda

    receive() a clasei Agent. ACLMessage msg = receive();if (msg != null) {

    // Procesare mesaj}

    Exemplu de procesare mesaj n care se transmite un rspuns agentului care a trimis mesajul:

    ACLMessage msg = myAgent.receive();if (msg != null) {

    // Mesaj primit.Poate fi procesatString content = msg.getContent();// se trimite un mesaj r spunsACLMessage reply = msg.createReply();reply.setPerformative(ACLMessage.INFORM);reply.setContent();...

    }else {

    block();}Clasa MessageTemplate permite filtrarea mesajelor dup tip (REQUEST, INFORM,

    etc.) coninut, id conversaie, numele agentului care a trimis mesajul etc. Exemplu:MessageTemplate mt = MessageTemplate.MatchAll();mt=MessageTemplate.and (mt,MessageTemplate.MatchPerformative(ACLMessage.REQUEST) );ACLMessage msg = myAgent.receive(mt);

    Un exemplu de preluare i procesare mesaj primit (extras din clasa PingAgent) este prezentat n continuare. Preluarea tipului de mesaj primit se realizeaz cu ajutorul metodei getPerformative() a clasei ACLMessage./***************************************************************** PingAgent.java *****************************************************************/ import jade.core.Agent; import jade.core.behaviours.*; .. .//preluare mesaj primitACLMessage msg = myAgent.receive();if(msg != null){ //la apelarea metodei creteReply campul Receiver al mesajului este

  • //completat cu id-ul agentului care a trimis mesajulACLMessage reply = msg.createReply();if(msg.getPerformative()== ACLMessage.REQUEST){

    String content = msg.getContent();if ((content != null) && (content.indexOf("ping") != -1)){myLogger.log(Logger.INFO, "Agent "+getLocalName()+" -

    Received PING Request from "+msg.getSender().getLocalName());reply.setPerformative(ACLMessage.INFORM);reply.setContent("pong");

    ... send(reply);

    3. Crearea dinamic a agenilorExemplu ThanksAgent. Acest exemplu se regsete n lista de exemple oferite de

    platforma JADE (directorrul src\examples\thanksAgent). Compilarea i lansarea n execuie se realizeaz n mod asemntor cu agentul PingAgent din Laboratorul 1.compilare: javac -classpath lib\jade.jar -d classes src\examples\thanksAgent\*.javaexecuie: java -cp lib\jade.jar;classes jade.Boot -gui -agents tkAg:examples.thanksAgent.ThanksAgent

    /***************************************************************** ThanksAgent.java *****************************************************************/ ... // create another two ThanksAgentString t1AgentName = getLocalName()+"t1";String t2AgentName = getLocalName()+"t2";

    try {// creaza agent t1 in acelasi container

    // se obtine un controler pentru containerul in care ruleaza agentul creator

    AgentContainer container = (AgentContainer)getContainerController(); //la crearea unui agent sunt necesare numele acestuia si clasa //pe baza careia va fi creat

    t1 = container.createNewAgent(t1AgentName, "examples.thanksAgent.ThanksAgent", null);

    t1.start();System.out.println(getLocalName()+" CREATED AND STARTED NEW

    THANKSAGENT:"+t1AgentName + " ON CONTAINER "+container.getContainerName());} catch (Exception any) {

    any.printStackTrace();}

    4. Aplicaie propusS se creeze un chat automat la care s participe 3 ageni: Agent_1, Agent_2, Agent_3.

    Fiecare agent va trimite periodic cte un mesaj ctre un agent ales aleator de tipul REQUEST avnd coninutul: Ce ora este ?.. Agentul ntrebat va rspunde printr-un mesaj de tipul INFORM avnd coninutul: Ora este 17:04.

    Laborator 21. Comportamente2. Comunicaia ntre ageni3. Crearea dinamic a agenilor4. Aplicaie propus