проблемы с ACLMessages в JADE

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

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


person Mehregan Rahmani    schedule 15.10.2018    source источник
comment
честно не понимаю что не так. тебе не нравится порядок сообщений? Или вы хотите получать только сообщения с содержанием (G + groupID)?   -  person nikelyn    schedule 17.10.2018
comment
Прошу прощения за мое плохое объяснение. проблема в том, что я хочу получать сообщения только определенного содержания. и когда я когда-либо пишу это, если после каждого из них программа не переходит к оператору 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 } к сожалению, часть do sth никогда не выполняется и оставляет мне проблемы...   -  person Mehregan Rahmani    schedule 17.10.2018
comment
как насчет получения (шаблон MessageTemplate)?   -  person nikelyn    schedule 17.10.2018
comment
Я не нашел такой функции, как вы сказали, в iro.umontreal. ca/~vaucher/Agents/Jade/primer4.html Как это?..   -  person Mehregan Rahmani    schedule 19.10.2018
comment
отправил ответ, и вы можете увидеть этот метод в javadoc jade.tilab.com/ doc/api/jade/core/Agent.html   -  person nikelyn    schedule 20.10.2018
comment
Спасибо, я знаю, что это может быть странно, но хотя я нашел функции, но мне действительно нужны некоторые примеры, я пробовал, но не смог работать с шаблонами msg. есть в инете?....   -  person Mehregan Rahmani    schedule 30.10.2018
comment
Что именно не работает? агент1 отправляет сообщение, но агент2 не получает его? если ваш проект некоммерческий, можете ли вы прикрепить больше своего кода?   -  person nikelyn    schedule 31.10.2018
comment
Я отправляю это как редактирование вопроса, который я задал .. и спасибо   -  person Mehregan Rahmani    schedule 31.10.2018
comment
почему вы не используете block(); для ожидающих сообщений? Вы уверены, что case 18 выполняется после отправки сообщения deligateAgent?   -  person nikelyn    schedule 31.10.2018
comment
@nikelyn Еще раз привет, я написал блок(); в конце кейса 17, каждый раз, когда я отлаживаю проект, хотя состояние становится 18, когда кейс 17 заканчивается, программа не входит в кейс 18 и просто зависает.. без сообщения об ошибке ... это происходит, когда я ставлю точка останова строки в конце состояния и отладка.. иногда, хотя состояние все еще 18, оно переходит в состояние 19.. мой проект становится катастрофой -_-   -  person Mehregan Rahmani    schedule 03.11.2018
comment
код, который вы приложили, используют как делигативный агент, так и супервизор? это общий код?   -  person nikelyn    schedule 06.11.2018
comment
Я работал над этим в эти дни, и я мог бы решить его, наконец, но снова столкнулся с проблемой работы с сообщениями acl, я напишу комментарий к ответу, который вы разместили здесь.   -  person Mehregan Rahmani    schedule 13.11.2018


Ответы (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();
}
person nikelyn    schedule 20.10.2018
comment
это решение работало в нескольких случаях, но в одном случае мне интересно, почему оно не работает, а условие if (msg != null) всегда неверно, что означает, что агент не получает это сообщение с этим точным идентификатором разговора. Что может быть возможной причиной? - person Mehregan Rahmani; 13.11.2018