2016-05-09 7 views
1

hinzufügen Ich habe die folgende Voraussetzung in JADE. Ich muss mehrere Agenten erstellen, deren Aufgabe es ist, Zufallszahlen zu generieren. Ein weiterer Empfängeragent sammelt alle erzeugten Zufallszahlen und fasst sie zusammen, um eine Entscheidung zu treffen. Diese ist der Sender Mittel-Klasse erweitert tickerbehaviour und seine tick onTick Methode ist wie folgtWie Nachrichten (ganzzahlige Werte) von mehreren Agenten in einem anderen Agenten mit JADE

protected void onTick() 
      { 
       ACLMessage msg_LoadDetails = new ACLMessage(ACLMessage.INFORM); 
       msg_LoadDetails.addReceiver(new AID("LoadCoordinator", AID.ISLOCALNAME)); 
       msg_LoadDetails.setContent(String.valueOf(getLoad())); 
       LoadConv.send(msg_LoadDetails); 
       //load = (int)(Math.random()*1000+1); 
      } 

Der Empfänger Klasse zyklisches Verhalten erweitern und seine Aktionsmethode ist wie folgt

public void action() 
    { 
     ACLMessage msg_IncomingLoadDetails = LoadCoordinator.receive(); 
     if(msg_IncomingLoadDetails!=null) 
     totalLoad = Integer.parseInt(msg_IncomingLoadDetails.getContent()); 

     if(totalLoad>500) 
     {actioncommand = "off";} 
     else 
     {actioncommand = "on";} 

     System.out.println("The current load is:" +totalLoad+ "; the load will be switched " +actioncommand); 
     block(); 
    } 

Die hier Problem ist, dass die empfangene Werte sind nur für einen Agenten, den ich erstelle (von der Konsole). Ich möchte Werte für alle erstellten Agenten erhalten. Muss ich dafür eine Reihe von Agenten erstellen? Wie lese ich Werte aus vielen Agentennachrichten? Könnte jemand bitte mit dem Code helfen, da ich neu bei JAVA und JADE bin?

Antwort

2

Ich habe Ihren Code getestet und der Empfängeragent erhält eine Nachricht von allen Absenderagenten.

Ich habe einige Fragen und Bemerkungen:

  1. Wie oft Absender Agenten ihre Nummer senden sollte? Nur einmal oder zyklisch nach einer bestimmten Zeit?

  2. Ihr Empfangsagent summiert keine empfangenen Werte, er vergleicht immer den zuletzt empfangenen Wert.

  3. Bessere Nutzung dieser Struktur für die Logik, nach der Nachricht empfangen:

    if (msg_IncomingLoadDetails != null) { 
        // your logic 
    } else { 
        block();    
    } 
    

    kann es helfen, alle 5s einige Probleme wie Nullpointer

+0

Die Zecke Verhalten führt onTick Verfahren zu verhindern. Ich weiß, dass es die Werte nicht summiert. Ich würde gerne wissen, wie ich die Werte von allen Agenten erhalten und summiere sie dann –

+0

Agent.receive() -Methode empfängt die älteste Nachricht in der Warteschlange des Agenten. Ich habe 2 Senderagenten erstellt, die alle 5 Sekunden eine zufällige Ganzzahl senden. Und Empfänger empfängt von beiden Sendern, hier ist Protokoll von meiner Konsole: http://pastebin.com/D8sN1fUY –

+1

Dies funktioniert auf diese Weise: Absender und Empfänger Agent starten, Empfänger versucht, Nachricht zu erhalten, aber die Warteschlange ist leer. Also blockiert sein Verhalten und wartet auf Signal. Dann senden beide Absender ihre Nummern. Empfänger erhält Signal über neue Nachrichten und löst sein Verhalten aus. Es findet die Nachricht in der Warteschlange, ruft sie ab und zeigt sie an. Dann löst das Verhalten erneut aus, findet die zweite Nachricht in der Warteschlange, ruft sie ab und zeigt sie an. –