开发了一个基于合同网协议的多智能体系统,实现了智能体之间的通信。我的系统由一个主管agent和n个机器agent组成。主管座席启动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。
感谢您的回复或指导。诚挚的问候
发布于 2018-05-06 02:08:17
是的,您可以使用消息功能(如发送者、执行者、内容)来过滤传入的消息。
关于并行行为的使用,看起来你做得很好。你可能会重现一些案例,试图弄清楚你的代码到底出了什么问题。Jean Vaucher and 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 );https://stackoverflow.com/questions/50068832
复制相似问题