簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM