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.
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.
infrastructure: Centralised
agents:
robot;
owner;
sponsor agentArchClass SponsorGUI;
aslSourcePath:
"src/asl";
}
// 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).
// 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?").
// 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.").
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();
}
}
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
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.
/* 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.
/* 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).
+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.
@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.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