Einführung in JAM (Stefan Bosse) [5.2025]

Programmierung von JAM Agenten (Teil 1)

Einführung

Die JavaScript Agent Machine (JAM) ist eine unievrsele Agentenausführungsplattform für AgentJS Agenten. Ein Agent gehört zu einer Klasse die durch eine Konstruktionsfunktion beschrieben wird. Diese muss vier wesentliche Abschnitte definieren:

  1. Körpervariablen: this.x=<init>
  2. Aktivitäten (die Aktionen ausführen): this.act={ .. }
  3. Übergänge zwischen Aktivitäten (transitions): this.trans={ .. }
  4. Signal- und Ereignishandler (optional): this.on

Die JAM Plattform ist als Shell in diese Übung integriert. Es wird keine weitere Software benötigt.

Weitere Informationen finden sich im über die JAM Shell in jamsh.pdf, über JAM in jam2020.pdf, und zusammenfassend in diesem Buch jamabx.pdf.

JAM Plattform Shell

Eine Shell erzeugen. Nur einmal ausführen!

 ▸ 
 ✗ 
 ≡ 

Die Plattform beinhaltet u.A.:

  1. AIOS: Das Agent-Input-Output System als Schnittstelle der Agenten zu der Hostplattform und definiert die Funktionen und Variablen die der Agent (neben JS Schlüsselwörtern) verwenden kann;
  2. Einen Prozess Scheduler;
  3. Ressourcenmanagement;
  4. Code Serialisierung und Deserialisierung;
  5. Kommunikationsmodule;
  6. Tupelraumserver.

Plattformkonfiguration und Start der Shell

 ▸ 
 ✗ 

Programmieren eines Agenten

Das Programmiermodell bildet das ATG Modell direkt ab:

Zunächst muss grob der ATG definiert werden, d.h. die Aufgabe eines Agenten in Aktivitäten partitioniert werden. Es ist immer sinnvoll eine Start- und eine Endaktivität zu definieren.


Eine einfache Agentenklasse myagent definieren und mit dem ATG füllen. Der Name der Konstruktorfunktion entspricht der Agentenklasse (wird später noch benötigt). Am Ende wird die Funktion von JAM "übersetzt" und die Agentenklasse in JAM publiziert.

 ▸ 
 ✗ 

Körpervariablen müssen immer initialisiert werden (ggfs. mit null). Alle Aktivitäten (Namen) stehen als Variablen zur Verfügung. Alternativ kann man Aktivitäten durch einen String und deren Name bezeichnen. Die Übergangsfunktion definiert den Übergang von der aktuellen (links) bezeichneten Aktivität zu der nächsten. Wird null oder udnefined zurück gegeben findet kein Übergang statt.

Agent erzeugen und starten


Agent erzeugen und starten

 ▸ 
 ✗ 

Frage 1. Was geht schief bei der Ausführung unseres Agenten der den GGT berechnen soll und wie reagiert die Plattform? Finde den Fehler (recherchiere den GGt Algorithmus) und korrigiere obigen Agentencode. Es gibt noch einen weiteren Fehler im trans Abschnitt. Korrigiere auch diesen so dass der Agent ein gültiges Ergebnis liefert.


Zwei Agenten

Jetzt sollen zwei Agenten (mit zwei Agentenklassen) einmal als Konsument (Klient) und einmal als Produzent (Server) auftreten.

Die Callback Funktion der inp Funktion wird als Parameterargument entweder das vollständige Tupel als Array oder null enthalten (d.h. unterbrochen oder kein Tupel gefunden). Die Elemente können mit einem numerischen Index 0,1,2 usw. gelesen werden. Das formale Argument (Wildcard, Platzhalter) ist hier _ was null entspricht. Eine Aktivität wird solange angehalten bis inp terminiert. Wichtig: Es darf pro Aktivität nur eine blockierende Funktion aufgerufen werden. Also kein zwei inp Funktionen in einer Aktivität aufrufen.

Aufgabe 2. Programmiere nachfolgend beide Agentenklassen und teste den Ablauf und das Zusammenspiel der Agenten.


Server und Klientenklassen

 ▸ 
 ✗ 

VEJB

Wenn die Ausführung fehl schlägt können noch Tupel im Tupelraum verbleiben. Man kann statt out(..) auch mark(timeout,..) verwenden. Der Timeout kann auf 100 (ms) gesetzt werden. Oder jeder Agent entfernt alle Tupel die er aussenden würde (z.B. mit rm(['GGT',_,_],true).


Agenten erzeugen und starten

 ▸ 
 ✗ 



Hilfe



Einreichung (Assignment #2025-39929)



Prüfen



Bewerten (Lehrer)




Created by the NoteBook Compiler Ver. 1.36.4 (c) Dr. Stefan Bosse (Fri May 16 2025 22:17:37 GMT+0200 (Central European Summer Time))