如何让座席在翡翠中交流?

How to make agents communicate in jade?

我想让我的第一个代理向第二个代理发送消息,这是第一个代理的代码:

import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.OneShotBehaviour;
import jade.lang.acl.ACLMessage;

public class First extends Agent {  

@Override
protected void setup() {
    addBehaviour(new OneShotBehaviour() {
        
        @Override
        public void action() {
            System.out.println("I'm sending");
            ACLMessage msg =new ACLMessage(ACLMessage.INFORM);
            msg.addReceiver(new AID("second",AID.ISLOCALNAME));
            msg.setContent("HELLO");
            send(msg);              
        }
    });
}}

第二个 class :

import jade.core.Agent;
import jade.core.behaviours.CyclicBehaviour;
import jade.lang.acl.ACLMessage;

public class Second extends Agent {
 
@Override
protected void setup() {
    addBehaviour(new CyclicBehaviour() {
        
         @Override
         public void action() {
             ACLMessage msg = receive();
             if(msg != null) {
                 System.out.print("i received "+msg.getContent());
             } else {
                 System.out.print("i didn't receive msg ");
                 block();
             }               
         }
    });
}}

但是第二个代理总是执行else语句并且msg似乎是空的,我不明白为什么。

有什么建议吗?

谢谢

下面这一行


ACLMessage msg = receive();

只从 agnet 的消息队列中读取一条消息。它不会等待接收消息。所以,你的第二个代理在他收到消息之前被执行,这就是 else 首先执行的原因。

然而,

But the second agent always execute the else statement and msg seems to be null, and i can't figure why.

这是不正确的,首先执行了else语句,然后代理打印它的信息,然后再次执行else,然后代理被阻塞。

解释:你的第一个代理有一个OneShotBehaviour,这意味着他将执行一次他的代码然后就完全执行。话虽如此,他只会发送一次信息。

虽然您的第二个特工有 CyclicBehaviour,这意味着他会不断重复自己。在此行为的第一个 运行 中,else 被执行,因为尚未收到消息。然后,block 将阻止此行为,直到收到消息。当收到消息时,行为会重复,但这次他会打印收到的消息。然后 block 再次...

如果你想让你的第二个代理打印第一次的消息,你需要让你的代理等待接收消息。您可以在上面的行之前使用方法 doWait() 。这样,您的第二个代理将一直等待,直到他收到消息。


doWait();

ACLMessage msg = receive();