2

コンテキストは次のとおりです。あるエージェント(「senderAgent」としましょう)から別のエージェント(「targetAgent」)にメッセージを送信しています。ここでは何も複雑ではありません。メッセージ伝搬タイプは INFORM です。

関連するsenderAgent部分のコードは次のとおりです(ワンショット動作内):

message = new ACLMessage(ACLMessage.INFORM);
message.addReceiver(new AID("targetAgent", AID.ISLOCALNAME));
message.setContent(jsonContent); // not important here
send(message);

関連する targetAgent 部分のコード (循環動作内):

MessageTemplate mt =
        MessageTemplate.and(MessageTemplate.MatchPerformative(ACLMessage.INFORM),
        MessageTemplate.MatchSender("senderAgent", AID.ISLOCALNAME));
ACLMessage msg = receive(mt);

if (msg != null) {
      //do something
    }
block();

問題は、このメッセージが targetAgent によって捕捉されないことです。それは確かに私のsenderAgentによって送信されますが、targetAgentの周期的な動作は常に「null」メッセージ(別名「メッセージなし」)を受け取るようです。

Jade Console の Sniffer ツールと Introspector ツールの両方を使用して調査しました。

  • Sniffer は、メッセージが senderAgent から targetAgent に効果的に送信されていることを示しています。
  • イントロスペクターは、メッセージが送信者側で送信され、ターゲット側で受信されたことも示しています。

コンテンツは問題なく、AID も問題ないのに、targetAgent の周期的な受信動作が何もキャッチしないのはなぜですか?

この問題が発生するのはこれが初めてで、システムの他のエージェント間で同様の通信を正常に実装する前に、かなり迷っています...

ヘルプ、デバッグのヒント、またはアイデアをいただければ幸いです。

4

1 に答える 1

2

さて、私の問題は、実際にはシステムの大きな設計ミスに起因していました。

実際、2 つの循環動作 (targetAgent 内) が、同じパフォーマティブと同じ送信者 (senderAgent) に一致する MessageTemplate を持つメッセージを待機していました。これらの動作は両方とも、解析されたメッセージの内容に基づいて、何かを行うかどうかを決定します。これは愚かで非常に悪い設計だったので、これら 2 つのエージェントを 1 つに融合し、そこにコンテンツ関連の条件を追加することでうまくいきました。

「受信」メソッドのJADEドキュメントを読んで、これを見つけました。「エージェントのメッセージ キューでメッセージを取得している」ことを確認したとき、すべてが明らかになりました。受信しようとしたときにキューにメッセージがなく、同じエージェントの別の動作によって既に受信されていることは確かです。

さて、ケースは閉じました!

于 2014-05-13T01:58:22.007 に答える