【问题标题】:problems with ACLMessages in JADEJADE 中的 ACLMessages 问题
【发布时间】:2018-10-15 13:07:12
【问题描述】:

我编写了一个程序,一切看起来都很好。但在运行时代理会混淆消息。例如我有这个代码:

ACLMessage msg = new ACLMessages (ACLMessage.INFORM);
msg.setContent = ("G" + groupID);
for(int i =0 ; i<50 ; i++){
    msg.addReceiver(new AID("MyClass" + i, AID.ISLOCALNAME));
}
send (msg);

并假设我是这样收到的:

ACLMessage rcv = myAgent.receive();

并假设我在程序的另一部分定义了另一个 ACLMessage,例如名为 msg2.. 在另一个块中.. 内容 = "T" + temp。

当我收到下一条消息时,我意识到这些消息很混乱......它们没有被正确接收。我的意思是运行下面的代码有两个不同的结果:

System.out.println("rcv Content is: " + rcv.getContent());

结果将是:G1 有时是:T34

这个错误消息使我的程序无法正确运行...我更改了消息格式,例如:“T”+ groupID +“T”或其他形式...但它不起作用..

/////////////////////////////////////// //// 在我学会使用消息模板之后:

 case 17:{// in this case deligates send the avg to the supervisor
                if(!deligateFlag){
                    state++;
                    break;
                }

                ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
                msg.setConversationId("A");
                msg.setContent("V" + avg);
                //System.err.println("Content of rcv is: " + msg.getContent());
                msg.addReceiver(mySupervisor);
                send(msg);
                System.out.println(myAgent.getLocalName() 
                        + " Says: I am deligate of group " 
                        + group 
                        + " And I sent the average temp of my followers "
                        + "to the supervisor which is: " 
                        + mySupervisor.getLocalName());
                state++;
                break;
            }
            case 18:{/* in this case supervisor receives the avg temp of 
                each group and calculates the avg of averages and then 
                decides what to do*/
                if(!supervisorFlag){
                    n=1;
                    state++;
                    break;
                }
                //System.err.println("This is Beginning of case 18");
                if(supervisorFlag){
                    MessageTemplate mt = MessageTemplate.MatchConversationId("A");
                    ACLMessage msg = myAgent.receive(mt);
                    if (msg != null) { System.err.println("TContent is: " + msg.getContent());
                        dAvg += Character.getNumericValue(msg.getContent().charAt(1));

                        if(msg.getContent().charAt(0) == 'V'){
                            n++;
                            System.err.println("N is: " + n);
                        }
                    }
                    if(n > 4){

                                dAvg /= 4;
                                totalAvg = dAvg;
                                System.out.println("Supervisor " 
                                        + myAgent.getLocalName() 
                                        + "Says: The total average of whole system is: " 
                                        + totalAvg);
                        }
                        state++;
                        break;

问题是,在最好的情况下,程序运行到if (n&gt;4) .. 一切都停止了.. 没有错误,没有警告.. 它只是停止.. 即使 n 变为 5 但什么也没发生......我没有知道可能是什么问题.. 是 ACL 消息还是我不知道... 通常我不知道为什么 90% 的程序不打印 TContent 。消息会发生什么..

【问题讨论】:

  • 老实说,我不明白出了什么问题。你不喜欢消息顺序吗?或者您只想接收带有内容(“G”+ groupID)的消息?
  • 我很抱歉我的解释很糟糕。问题是我只想接收具有特定内容的消息。并且当我写这个时,如果在他们每个人之后,程序不会进入 if 语句。例如:ACLMessage msg = new ACLMessages (ACLMessage.INFORM); msg.setContent = ("G" + groupID); for(int i =0 ; i&lt;50 ; i++){ msg.addReceiver(new AID("MyClass" + i, AID.ISLOCALNAME)); } send (msg); ACLMessage rcv = myAgent.receive(); if(rcv.getContent().equals("G" + groupID) { //do sth } 不幸的是,做某事的部分从未完成,给我留下了问题......
  • 接收(MessageTemplate 模式)怎么样?
  • 我没有找到你在iro.umontreal.ca/~vaucher/Agents/Jade/primer4.html 中说的那样的功能,那是怎么回事?..
  • 已发布答案,您可以在 javadoc jade.tilab.com/doc/api/jade/core/Agent.html 中看到此方法

标签: java agents-jade


【解决方案1】:

如果您想接收特定的 aclMessages,您可以使用 myAgent.receive(MessageTemplate t)。

比如你要发消息

代理1:

ACLMessage request = new ACLMessage(ACLMessage.REQUEST);
...     
request.setConversationId("G");
myAgent.send(request)

并且您希望您的 Agent2 只接收 ConversationId = "G" 的消息

代理2:

MessageTemplate mt = MessageTemplate.MatchConversationId("G");;
ACLMessage msg = myAgent.receive(mt);
if (msg != null) {
  // Process it
  ...
} else {
   block();
}

【讨论】:

  • 这些解决方案适用于多种情况,但在一种情况下,我想知道为什么它不起作用并且条件 if (msg != null) 总是错误的,这意味着代理没有收到具有该确切对话 ID 的消息.. 可能的原因是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多