Jade Agent Communication:让代理回复

时间:2017-11-21 09:35:26

标签: java agent agents-jade

我正在做一个关于玉的项目MAS项目。 我有2个代理人要发送,1个要接收。 如何让代理1向代理2发送消息,例如" 1000",并且只有当代理2收到" 1000"时,代理2才会回复,例如&# 34;关掉"?

3 个答案:

答案 0 :(得分:1)

我的兴趣是使用RequestPerformer行为创建agent1,使用CyclicBehaviour创建agent2来监听消息。

agent1行为内容可以是这样的:

ACLMessage cfp = new ACLMessage(ACLMessage.CFP);
cfp.addReceiver(/*agent2AID*/);

cfp.setContent("1000");
cfp.setConversationId(1000);
cfp.setReplyWith("cfp" + System.currentTimeMillis()); // Unique value
myAgent.send(cfp);
mt = MessageTemplate.and(MessageTemplate.MatchConversationId(targetProduct),
                    MessageTemplate.MatchInReplyTo(cfp.getReplyWith()));

agent2行为可以是这样的:

私有类CFPServer扩展了CyclicBehaviour {     private static final long serialVersionUID = 1L;

public void action() {
    MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.CFP);
    ACLMessage msg = myAgent.receive(mt);
    if (msg != null) {
        // CFP Message received. Process it
        String title = msg.getContent();
        ACLMessage reply = msg.createReply();

        // The requested fruit is NOT available for sale.
        reply.setPerformative(ACLMessage.INFORM);
        reply.setContent("turn off");

        myAgent.send(reply);

    } else {
        block();
    }
}

}

相关问题已在很多方面得到很好的讨论和解决,您可以查看以下简单的合同网协议的实现,您可以在其中找到发送和回复功能:

https://github.com/clebercbr/tp_cnp/blob/master/src/java/ 看到代理启动器就像agent1一样,参与者和拒绝者就像你的agent2

答案 1 :(得分:0)

我不建议为messageReception写一个循环行为,它会无偿地烧录proc。一个simpleBehaviour,其done()为false,而action()为block()则效率更高。

关于您的铅,类似的东西应该起作用:

public class ReceiveMessageBehaviour extends SimpleBehaviour{

       private boolean finished=false;

    /**
     * 
     * This behaviour is a one Shot.
     * It receives a message tagged with an inform performative, print the content in the console and destroy itself if its equal to 1000
     * @param myagent
     */
       public ReceiveMessageBehaviour(final Agent myagent) {
           super(myagent);
       }

       public void action() {
            //1) receive the message
            final MessageTemplate msg Template = MessageTemplate.MatchPerformative(ACLMessage.INFORM);          
            final ACLMessage msg = this.myAgent.receive(msgTemplate);
            //2) check its caracts
            if (msg != null && msg.getContent().equals("1000")) {       
                System.out.println(this.myAgent.getLocalName()+"<----Result received from "+msg.getSender().getLocalName()+" ,content= "+msg.getContent());
                this.finished=true;

                //3) answer
                final ACLMessage msg2 = new ACLMessage(ACLMessage.INFORM);
                msg2.setSender(this.myAgent.getAID());
                msg2.addReceiver(new AID(msg.getSender().getLocalName(), AID.ISLOCALNAME));     
                msg2.setContent("turn off");
                this.myAgent.send(msg2);

            }else{
                block();// the behaviour goes to sleep until the arrival of a new message in the agent's Inbox.
            }
      }

    public boolean done() { return finished;}
}

答案 2 :(得分:0)

我是这些 JADE 相关组件的新手。但我想添加最简单的代码,我们可以使用 oneShotBehaviour 和 Cyclicehaviour 来解决这个问题。

以下代码实现了两个客户端之间的简单通信。

A 级特工:-

public class Agent_A extends Agent{
  
    protected void setup(){
    
    System.out.println(getAID().getName()+" is ready.");  
    addBehaviour(new AgentA_SendMessage());
    addBehaviour(new AgentA_ReceiveMessage()); 
    }
    
    public class AgentA_SendMessage extends OneShotBehaviour{
        @Override
        public void action(){
            ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);
            msg.addReceiver(new AID("AgentB",AID.ISLOCALNAME));
            msg.setContent("1000");
            send(msg);
        }
    }
    
    public class AgentA_ReceiveMessage extends CyclicBehaviour{
        Scanner scn2 = new Scanner(System.in);
        @Override
        public void action(){
        ACLMessage remsg = myAgent.receive();
            if(remsg!=null){
                String reply = remsg.getContent();
                System.out.println("Reply From "+remsg.getSender()+" :- "+reply);
            }
            else{
            block();
            }
        }
    }
    
  
    
}

B 级特工:-

public class Agent_B extends Agent{
    protected void setup(){
    System.out.println("Hello Seller Agent : "+getAID().getName()+" is ready.");
    addBehaviour(new AgentB_ReceiveMessage());
    }
    public class AgentB_ReceiveMessage extends CyclicBehaviour{
    
            @Override
            public void action(){
                ACLMessage remsg = myAgent.receive();
                
                    if(remsg!=null){
                        System.out.println(""+remsg);
                        ACLMessage reply = remsg.createReply();
                        reply.setPerformative(ACLMessage.INFORM);
                        String price = remsg.getContent();
                        reply.setContent("off");
                        send(reply);     
                    }else{
                        block();
                    }
            }
    }
}