19 novembro 2015

Exemplo de integracao com interface Java: Thank you sponsor!

O programa do robô que traz a cerveja ao dono parecia perfeito, o owner solicitava uma cerveja, o robô obedientemente ia até o refrigerador, pegava a cerveja e levava a seu mestre. Porém, o estoque de cerveja vai reduzindo até que o robô responde que não poderia mais levar cerveja, o que fazia com que não houvessem novas operações após isto.
Esta situação precisava ser resolvida, o dono então ganhou uma interface onde seu patrocinador pode doar cervejas a ele, preenchendo o estoque no refrigerador e fazendo a alegria do malandro.
Obrigado pela cerveja! http://pt.slideshare.net/Bryagh/old-beer-trucks-6834062

Neste programa foi criado um novo agente, o "sponsor" que está ligado a uma aplicação java que tem uma interface gráfica bem simples. O agente recebe da interface o comando que notifica que novas cervejas foram entregues, envia esta informação por broadcast para os demais agentes. Ambos, O robô e o dono, realizam atividades ao receber esta notificação.

Projeto "beersponsor.mas2j"

No projeto há a adição do agente sponsor que está ligado a classe java SponsorGUI.
MAS beersponsor {

infrastructure: Centralised
    agents:
                robot;
                owner;
        sponsor agentArchClass SponsorGUI;
aslSourcePath:
"src/asl";
}

O agente "owner.asl"

O agente owner é quem inicia o processo, através da chama !ask(beer). Em relação ao código original apenas foi adicionada a tratativa da adição de uma crença que ocorre ao receber a mensagem broadcast de que chegou mais cerveja. Sua ação é educadamente agradecer a doação e sem perder tempo, solicitar ao robô que o abasteça.

// Agent owner in project beer.mas2j
/* Initial beliefs and rules */

/* Initial goals */
!ask(beer).

/* Plans */
@a1
+!ask(beer) : true 
<- .send(robot, achieve, bringbeer(owner,beer));
.print("Go robot, bring a beer!").

@h1
+has(owner,beer)[source(robot)] : true
<- !drink(beer);
.print("I want more!");
!ask(beer).

@d1
+!drink(beer) : has(owner,beer)
<- .send(robot, achieve, masterdrunkabeer(owner));
.print("Yeah, I have drunk a cold beer!").

@s1
+addstock(beer,N) : true
<- .print("Since there is beer, bring it!");
.send(sponsor, tell, thanks(sponsor));
!ask(beer).

O agente "robot.asl"

Da mesma forma que o agente owner, o agente robô passou a tratar a mensagem broadcast "+addstock(beer,N)", atualizando o estoque local o que permite que o dono realize novas solicitações.

// Agent robot in project beersponsor.mas2j

/* Initial beliefs and rules */
// initially, I believe that there are 5 beers in the fridge
available(beer,fridge).
stock(beer,3).

/* Initial goals */

/* Plans */
@b1
+!bringbeer(owner,beer)
: available(beer,fridge)
<- -at(robot,owner); // Have sure this old belief is out
!at(robot,fridge);
.print("Grabbing a beer to my master.");
!at(robot,owner);
.date(YY,MM,DD); .time(HH,NN,SS);
.send(owner, tell, has(owner,beer));
.print("Here is your beer my master.");
?stock(beer,Inventory);
!updateStock(beer,Inventory);
+consumed(YY,MM,DD,HH,NN,SS,beer).

@b2
+!bringbeer(owner,beer)
: not available(beer,fridge)
<- .print("Sorry, there is no beer!").

@a1
+!at(robot,P) : true// : not at(robot,P)
<- -at(robot,_); // Have sure the old belief is out
+at(robot,P);
.print("Robot is at ",P).
@m1
+!masterdrunkabeer(owner) : true
<- .send(owner, untell, has(owner,beer)).

@u1
+!updateStock(beer,Inventory) : Inventory > 1
<- ?stock(beer,Tmp);
Inv = Tmp - 1; 
-+stock(beer,Inv);
.print("Inventory had ",Inventory," beer(s). A beer is being taken, now the fridge has ",Inv," beer(s).").

@u2 //last beer
+!updateStock(beer,Inventory) : Inventory == 1
<- -+stock(beer,0);
-available(beer,fridge);
.print("Inventory had its last beer. Master needs to ask supermarket for more beer!").

@u3
+!updateStock(beer,Inventory) : Inventory == 0
<- -available(beer,fridge);
.print("Did I already told that there is no beer?").

@s1
+addstock(beer,N) : N > 0
<- .print("More ",N," beers just arrived! There are available beer again!");
-+stock(beer,N);
+available(beer,fridge).

O agente "sponsor.asl"

Este agente é a ligação entre a regra de negócio e a aplicação externa que permite comandar uma doação de cervajas. O objetivo giving_beer é um comando externo que ocorre quando um usuário pressiona o botão de doação. A crença thanks(sponsor) é informada pelo owner quando recebeu a doação. Este dado é retornado para a interface gráfica que imprime o agradecimento ao patrocinador.

// Agent sponsor in project beersponsor.mas2j
@g1
+!giving_beer   // this goal is created by the GUI of the agent 
    <- .broadcast(tell, addstock(beer,2));
.print("Broadcasting about the delivery.").
  
@t1 
+thanks(sponsor)[source(owner)] : true
<- thankyou(sponsor);
.print("Thanking sponsor.").

A aplicação "SponsorGUI.java"

A aplicação possui um botão e uma caixa de texto. Ao pressionar o botão adiciona o objetivo giving_beer ao agente sponsor. Ao receber a mensagem thankyou, imprime na tela o agradecimento.

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import jason.architecture.*;
import jason.asSemantics.ActionExec;
import jason.asSyntax.ASSyntax;
import jason.asSyntax.Literal;
import javax.swing.*;

/** example of agent architecture's functions overriding */
public class SponsorGUI extends AgArch {

    JTextArea jt;
    JFrame    f;
    JButton patronize;

    public SponsorGUI() {
        jt = new JTextArea(10, 30);
        patronize = new JButton("Give more beer");
        patronize.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Literal goal = ASSyntax.createLiteral("giving_beer");
                jt.append("\n\rGiving beer to my godson...");
                getTS().getC().addAchvGoal(goal, null);
                patronize.setEnabled(false);
            }
        });
        
        f = new JFrame("Sponsor agent");
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(BorderLayout.CENTER, new JScrollPane(jt));
        f.getContentPane().add(BorderLayout.SOUTH, patronize);
        f.pack();
        f.setVisible(true);
    }

    @Override
    public void act(ActionExec action, List<ActionExec> feedback) {
        if (action.getActionTerm().getFunctor().startsWith("thankyou")) {
            jt.append("\n\rThank you "+action.getActionTerm().getTerm(0)+"!");
            action.setResult(true);
            feedback.add(action);
            
            patronize.setEnabled(true); // enable GUI button
        } else {
            super.act(action,feedback); // send the action to the environment to be performed.
        }    
    }

    @Override
    public void stop() {
        f.dispose();
        super.stop();
    }
}

Fontes

  • Este programa foi baseado no exemplo beer.mas2j, melhorias foram implementadas baseadas nos exemplos que acompanham o pacote Jason

Nenhum comentário:

Postar um comentário