Я написал программу, и все выглядит нормально.. но во время выполнения агенты путают сообщения. например, у меня есть этот код:
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.
когда я получаю следующее сообщение, я понял, что сообщения перепутаны ... они не получены должным образом. Я имею в виду, что выполнение приведенного ниже кода дает 2 разных результата:
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 . что будет с сообщениями..
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 }
к сожалению, часть do sth никогда не выполняется и оставляет мне проблемы... - person Mehregan Rahmani   schedule 17.10.2018block();
для ожидающих сообщений? Вы уверены, чтоcase 18
выполняется после отправки сообщения deligateAgent? - person nikelyn   schedule 31.10.2018