проблемы с ACLMessages в JADE - PullRequest
0 голосов
/ 15 октября 2018

Я написал программу, и все выглядит хорошо .. но во время выполнения агенты путают сообщения.например, у меня есть этот код:

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.что будет с сообщениями ..

1 Ответ

0 голосов
/ 20 октября 2018

Если вы хотите получать конкретные сообщения aclMessages, вы можете использовать myAgent.receive (MessageTemplate t).

Например, вы хотите отправить сообщение

Агент1:

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

И вы хотите, чтобы ваш Agent2 получал только сообщения с ConversationId = "G"

Agent2:

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