【发布时间】: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>4) .. 一切都停止了.. 没有错误,没有警告.. 它只是停止.. 即使 n 变为 5 但什么也没发生......我没有知道可能是什么问题.. 是 ACL 消息还是我不知道... 通常我不知道为什么 90% 的程序不打印 TContent 。消息会发生什么..
【问题讨论】:
-
老实说,我不明白出了什么问题。你不喜欢消息顺序吗?或者您只想接收带有内容(“G”+ groupID)的消息?
-
我很抱歉我的解释很糟糕。问题是我只想接收具有特定内容的消息。并且当我写这个时,如果在他们每个人之后,程序不会进入 if 语句。例如:
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(); 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