如何使用CMD在玉器中启动Multi代理?

时间:2016-11-03 15:31:33

标签: java agent agents-jade

你好每一个我是玉的新人,我有一个小问题, 但首先我有2个类或者说2个代理:AgentA和AgentB。 当AgentA启动时,他进入等待状态(因为我正在使用FSMBehaviour)。 AgentA睡眠的任何方式告诉事件或消息来自AgentB, 但问题是当AgentB启动时,他会向AgentA发送一条消息,然后他也会进入等待状态(等待AgentA的重播) ,所以当我在CMD中键入此命令以启动两个代理时,基本上就是问题,

如果代理B首先启动,代码将无效, 因为这里的代理人A没有收到来自代理B的消息,所以他会等待,同样代理商B在这里,因为他要等待代理人A重播他的消息

如果代理A首先启动,则代码可能有效,也可能无效。 有时它工作正常,有时则没有。

基本上我坚持'en attente de l agent B'的信息

这是cmd命令

  

java jade.Boot -gui agentA:AgentA agentB:AgentB

我不知道问题出在哪里。 那么如何使用cmd命令运行多个代理 如果可能的话,如何告诉代理A在cmd命令中的代理b之前启动 谢谢

这是AgentA的代码

public class AgentA extends Agent {

protected void setup(){

  System.out.println("---------------------------------------");
  System.out.println("----------------agent A----------------");
  System.out.println("---------------------------------------");

  FSMBehaviour agentA_beh= new FSMBehaviour();
  agentA_beh.registerFirstState(new attendreAgentB(), "attendreAgentB");
  agentA_beh.registerState(new envoiChiffre(), "envoiChiffre");
  agentA_beh.registerLastState(new fin(), "fin");
  agentA_beh.registerDefaultTransition("attendreAgentB", "envoiChiffre");
  agentA_beh.registerTransition("envoiChiffre", "attendreAgentB",0);
  agentA_beh.registerTransition("envoiChiffre", "fin", 1);//}
private class attendreAgentB extends OneShotBehaviour{

      @Override
      public void action() {

      System.out.println("en attente de l agent B");
      block();
      }
    }

/*****************************************************************/
private class envoiChiffre extends OneShotBehaviour{
  int valeurRetour = 0;
  @Override
  public void action() {

  ACLMessage messageRecu = receive();
  if (messageRecu.getContent().equalsIgnoreCase("pret") ) valeurRetour=0;
  else  valeurRetour=1;

  int chiffre = (int)(Math.random()*10);
  System.out.println("envoi de la valeur "+ chiffre);
  ACLMessage message = new ACLMessage(ACLMessage.INFORM);
  message.addReceiver(messageRecu.getSender());
  message.setContent(chiffre+"");  
  send(message);
  }      

  public int onEnd(){
  return valeurRetour;   
  }  
}
/*****************************************************************/
private class fin extends OneShotBehaviour{

  @Override
  public void action() {
  System.out.println("arret de l'agent A");
  myAgent.doDelete();  
  }  
}}

这是AgentB代码

public class AgentB extends Agent {

  int somme = 0;
  boolean stop = false;
  protected void setup(){
    System.out.println("----------------agent B----------------");
    FSMBehaviour agentB_beh= new FSMBehaviour();

    agentB_beh.registerFirstState(new attendrechiffre(), "attendrechiffre");
    agentB_beh.registerState(new afficher(), "afficher");
    agentB_beh.registerState(new fin(), "fin");

    agentB_beh.registerTransition("attendrechiffre", "afficher",0);
    agentB_beh.registerTransition("attendrechiffre", "fin",1);
    agentB_beh.registerDefaultTransition("afficher", "attendrechiffre");

    addBehaviour(agentB_beh);

  }
  private class attendrechiffre extends OneShotBehaviour{

    int valeurRetour = 0;

    public void action() {
    ACLMessage message = new ACLMessage(ACLMessage.INFORM);
    message.addReceiver(new AID("AgentA", AID.ISLOCALNAME));  

      if(!stop){
        message.setContent("pret");
        send(message);
        valeurRetour=0;
        block();
      }else{
        message.setContent("arret");
        send(message);
        valeurRetour=1;  
      }    
    }
  public int onEnd(){
    return valeurRetour;
  }  
  }
  /**********************************************************************/
  private class afficher extends OneShotBehaviour{  
        @Override
        public void action() {
          ACLMessage messageRecu = receive();
          somme+= Integer.parseInt(messageRecu.getContent());
          System.out.println("message recu= "+ messageRecu.getContent());
          System.out.println("la somme actuelle = "+somme);
          if (somme > 50) stop = true;
        }  
      }
      /**********************************************************************/
      private class fin extends OneShotBehaviour{
        @Override
        public void action() {
          System.out.println("fin de l'agent B");
          myAgent.doDelete();
        }  
      }
    }

0 个答案:

没有答案