Параллельно ContractnetResponder и Contractnetresponder - PullRequest
0 голосов
/ 27 апреля 2018

Я разрабатываю многоагентную систему, основанную на протоколе контрактной сети для связи между агентами. Моя система состоит из одного агента супервизора и n агентов машины. Супервизорный агент запускает CFP, чтобы найти подходящий компьютер для выполнения данной задачи. Каждый агент машины отвечает на CFP и добавляет задачу в свою очередь, если его предложение принимается агентом супервизора. В то же время каждый агент машины запускает CFP для других агентов машины, целью которых является обмен задачами, находящимися в его очереди (задачи приняты).

Я реализовал на агенте-супервизоре поведение ContractNetInitiator. Я реализовал на машине агента поведение ContractNetreponder.

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

ParallelBehaviour PB = new ParallelBehaviour();

PB.addSubBehaviour(new Responder(this, null)); //ContractNetresponder behaviour
PB.addSubBehaviour(new initiator(this,60000));  //ContractNetinitiator behaviour
addBehaviour(PB);

Мой вопрос: в поведении респондента агент машины получает CFP от агента супервизора и от других агентов машины. Могу ли я использовать один ContractNetresponder и фильтровать позже входящие сообщения или мне нужно создать два поведения ContractNetresponder для отдельной обработки CFP.

Спасибо за ваш ответ или любую ориентацию. С наилучшими пожеланиями

1 Ответ

0 голосов
/ 05 мая 2018

Да, вы можете использовать функции сообщений (такие как отправитель, перформатив, контент) для фильтрации входящих сообщений.

По поводу использования параллельного поведения, похоже, у вас все хорошо. Вы можете воспроизвести некоторые случаи, чтобы попытаться выяснить, что происходит с вашим кодом. Пример, показанный Жаном Ваучером и Амбруазом Нчо , может быть способом сделать это:

Acheteur2.java

   int        bestPrice = 9999;
   ACLMessage bestOffer = null;

   protected void setup() 
   {
      ACLMessage msg = newMsg( ACLMessage.QUERY_REF ); 

      MessageTemplate template = MessageTemplate.and( 
            MessageTemplate.MatchPerformative( ACLMessage.INFORM ),
            MessageTemplate.MatchConversationId( msg.getConversationId() ));

      SequentialBehaviour seq = new SequentialBehaviour();
      addBehaviour( seq );

      ParallelBehaviour par = new ParallelBehaviour( ParallelBehaviour.WHEN_ALL );
      seq.addSubBehaviour( par );

      for (int i = 1; i<=3; i++) 
      {
         msg.addReceiver( new AID( "s" + i,  AID.ISLOCALNAME ));

         par.addSubBehaviour( new myReceiver( this, 1000, template) 
            {
               public void handle( ACLMessage msg) 
               {  
                  if (msg != null) {
                     int offer = Integer.parseInt( msg.getContent());
                     if (offer < bestPrice) {
                        bestPrice = offer;
                        bestOffer = msg;
               }  }  }
            });
      }
      seq.addSubBehaviour( new OneShotBehaviour()
          {
             public void action() 
             {  
                if (bestOffer != null) 
                     System.out.println("Best Price $" + bestPrice );
                else 
                   System.out.println("Got no quotes");    
             }
          });

      send ( msg );
...