并行ContractnetResponder和Contractnetresponder

问题描述 投票:0回答:1

我开发了一个基于合约网协议的多代理系统,用于代理之间的通信。

我的系统由一个主管代理和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。

agent agents-jade
1个回答
0
投票

是的,您可以使用消息功能(如发件人、执行性、内容)来过滤传入消息。

关于并行行为的使用,看来你做得不错。您可以重现一些案例来尝试弄清楚您的代码发生了什么。 Jean Vaucher 和 Ambroise Ncho 展示的示例可能是一种方法:

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 );
© www.soinside.com 2019 - 2024. All rights reserved.