你好每一个我是玉的新人,我有一个小问题, 但首先我有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();
}
}
}