[英]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 似乎是 null,我不明白為什么。
有什么建議嗎?
謝謝
下面這一行
ACLMessage msg = receive();
只從 a.net 的消息隊列中讀取一條消息。 它不會等待接收消息。 所以,你的第二個代理在他收到消息之前被執行,這就是為什么首先執行else
的原因。
然而,
但是第二個代理總是執行 else 語句並且 msg 似乎是 null,我不明白為什么。
這是不正確的,先執行else語句,然后代理打印它的消息,然后再次執行else,然后代理被阻塞。
解釋:您的第一個代理有一個OneShotBehaviour
,這意味着他將執行他的代碼一次然后完全執行。 話雖這么說,他只會發送一次消息。
雖然您的第二個代理有CyclicBehaviour
,這意味着他會不斷重復自己。 在此行為的第一次運行中, else
被執行,因為尚未收到消息。 然后,有一個block
將阻止此行為,直到收到消息。 當收到消息時,行為會重復,但這次他會打印收到的消息。 然后又是block
...
如果你想讓你的第二個代理從第一次打印消息,你需要讓你的代理等待接收消息。 您可以在上面的行之前使用方法doWait()
。 這樣,您的第二個代理將一直等待,直到他收到一條消息。
doWait();
ACLMessage msg = receive();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.