如何让座席在翡翠中交流?
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();
我想让我的第一个代理向第二个代理发送消息,这是第一个代理的代码:
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();