Wiki

Vorwort

Dieses Wiki beschreibt den Aufbau, die Function und die Ziele von Streetworld. Um die Funktionsweise nachvollziehen zu können, ist Vorwissen in den Themengebieten Jason CArtAgO nützlich. Für die Frameworks gibt es gute Einführungen, daher wird auf diese Plattformen im Wiki nicht weiter eingegangen. Dieses Wiki beschreibt den Aufbau, die Function und die Ziele von Streetworld. Um die Funktionsweise nachvollziehen zu können, ist Vorwissen in den Themengebieten Jason CArtAgO nützlich. Für die Frameworks gibt es gute Einführungen, daher wird auf diese Plattformen im Wiki nicht weiter eingegangen.

Einführung

Streetworld basiert auf Jason und ist ein Multiagenten-System. Durch Simulationen kann das Verhalten von Agenten, dass in AgentSpeak implementiert wird, untersucht werden. Jason stellt hierfür ein Environment, indem die Agenten interagieren können, zur Verfügung. Allerdings ist dieses Environment für Streetworld zu unflexibel und nicht an die Bedürfnisse von Verkehrssimulationen anpassbar. Aus diesem Grund hat Streetworld ein eigenes Environment.

Diese Grafik zeigt die Grundzüge. Der Kern des Environments bildet ein ModusArtifact. Diese Klasse beinhaltet alle szenario-spezifischen Informationen und fungiert als Schnittstelle für die Agenten mit der "Außenwelt", wie auch für die Agenten untereinander. Damit die Agenten mit dem ModusArtifact interagieren können, benötigen sie einen Kommunikationsmedium, einen CommPort. ModusArtifact und CommPort erben von Artifact, einer KLasse aus dem Cartago-Framework. CArtAgO ist eine Erweiterung für Jason, die die Interaktion zwischen der Agenten-Logik in AgentSpeak und Java-Objekten erheblich erleichert und bereichert, so ist es zum Beispiel möglich über die Agenten Java-Objekte aufzurufen, sogenannte Artifacts, deren Zugriffsrechte für andere Agenten zu definieren und deren Methoden aufzurufen. Der CommPort enthält agenten-spezifischen Informationen und ist nur für diesen einsehbar und steuerbar.

Installation

In diesem Abschnitt werden die Vorraussetzungen beschrieben, um in und mit Streetworld programmieren zu können.

Streetworld basiert auf Java. Das OracleJDK oder das OpenJDK sind zwingend vorausgesetzt. SVN wird für die Versionsverwaltung verwendet und zum Download des Source-Codes benötigt. Ferner wird Streetworld mit dem Build-Management-Tool Maven Version 2.2.1 entwickelt. Auch dieses Tool ist Voraussetzung. Optional ist die Verwendung von Eclipse als integriete Entwicklungsumgebung. Hierfür sind die Plugins Jasonide und m2e.

Streetworld kann nun über

svn checkout svn://svn.code.sf.net/p/streetworld/code/trunk/streetworld

heruntergeladen werden. Anschließend muss

java -jar [Streetworld_Dir]/lib/net/sourceforge/jason/jason/3.6a/jason-3.6a.jar

aufgerufen werden und in den Sektionen Jason, Java Home und Ant libs mit den entsprechenden Verzeichnissen angegeben werden. Die übrigen Sektionen werden für Streetworld nicht benötigt. Jason speichert diese Angaben im Benutzerverzeichnis unter .jason/user.properties

Nun kann die Installation getestet werden. Im Streetworld-Verzeichnis muss erst der Code kompiliert, anschließend kann Streetworld gestartet werden:

mvn compile
mvn exec:exec

Starten der offiziellen Streetworld-Version

Das aktuelle Streetworld kann auch als ausführbare Version über Sourceforge als Archiv heruntergeladen werden.

SimulationsSzenario

Ein SimulationsSzenario, SimSzenario genannt, ist eine vordefinierte Ausgangssituation - hier ein Konflikt - von Agenten, die von Streetworld geladen und ausgeführt wird. Um ein SimSzenario zu erstellen, muss wie folgt eine Datei erstellt werden:

[Streetworld-Stammverzeichniss]/SavSimSzenario/[SimSzenario-Bezeichnung].simszen

Diese Datei wird in Streetworld als Property-File interpretiert, hier ist ein Beispiel:

# Streetworld Szenario

name             = DriveTest1
name_s           = DT1
modus            = Modus_CS
modus_package    = org.plathe.streetworld.modus.CS
window_gdx_size  = 960 70
screen_gdx_size  = 1920 140

#                    x  y dirx diry vTyp agTyp color
robo_list        = 100  1    1    0    2     3     0 \
                   100  2    1    0    2     3     0 \

other_agent_list =  -1 -1   -1   -1   -1     4     1

#                  typ   x y
map              =   0   0 0                         \
                     0 960 0
  • name: Bezeichnung für das SimSzenario
  • name_s: Steht für short name. Dieser wird unter anderen als Teil der Agenten-Bezeichnungen verwendet
  • modus: Klassen-Name des verwendeten Modus
  • modus_package: Package-Bezeichung des verwendeten Modus
  • window_gdx_size: Größe des Darstellungsfensters der Simulation. x- und y-Wert können durch Leerzeichen oder Tab getrennt sein.
  • screen:gdx:size: Größe der grafischen Ausgabe innerhalb des Darstellungsfensters. x- und y-Wert können durch Leerzeichen oder Tab getrennt sein.
  • robo_list: Hier werden alle Fahrzeug-Agenten definiert. Agenten werden zeilenweise mit folgenden Angaben definiert:
    • x: x-Position des Agenten
    • y: y-Position des Agenten
    • xdir: x-Anteil der Agenten-Ausrichtung
    • ydir: y-Anteil der Agenten-Ausrichtung
    • vTyp: steht für vehicle-typ. Folgende Typen können durch den entsprechenden Integer ausgewählt werden:
      • 0: car
      • 1: van
      • 2: truck
    • agTyp: steht für agent-typ. [hier muss auch noch der Java-Code erst nachbearbeitet werden]
    • color: steht für Farbe bzw. Clustergruppe, d.h. eine Gruppe mit gleichen oder ähnlichen Eigenschaften [hier muss auch noch der Java-Code erst nachbearbeitet werden]
  • other_agent_list: Hier werden alle Agenten definiert, die keine Fahrzeug-Agenten sind und/oder nicht als solche gezählt werden sollen. Die Syntax der Definition ist prinzipiell wie der in robo_list gleich, ausser das nicht vorhandene oder nicht benötigte Eigenschaften durch -1 also nicht definiert, gekennzeichnet werden.
  • map:

Modus

Modus_libgdx

Die grafische Ausgabe
Szenario
StartUp

Das folgende Diagramm zeigt, welche Prozesse ablaufen, bis ein Szenario vollständig geladen ist. Der Agent environmentCreator wurde in streetworld.mas2j angegeben und wird somit von jason automatisch gestartet. Die StreetworldGUI, welche von MASConsoleGUI erbt wurde in logging.properties als handlers definiert und wird somit auch automatisch geladen, alle anderen Szenario-spezifischen Klassen werden wie folgt gestartet:

Das View-System
Diagramm View System

Das Herzstück des View-Systems bildet die streetMap, eine ArrayListe, die im ModusArtifact deklariert und initialsiert wird. Sie enthält Objekte der Klasse ValueBox_Street. Diese valuebox'en sind in den ComPorts der Agenten deklariert und mit der streetmap verknüpft. Sie enthalten alle für das View-System wichtigen Attribute, beispielsweise die Identifikation, die Position, die Länge und den Blinkzustand des Agenten. Der Blinkzustand gibt an, ob ein Agent blinkt, und wenn ja auf welcher Seite. Die Identifikation und die Länge sind feste Werte. und den Der CommPort verwaltet den Blinkzustand selber. Die aktuelle Position ist im Sprite-Objekt hinterlegt (sieheDie grafische Ausgabe). Über die Methode update() werden die Attribute in der valueBox aktualisiert. Diese INTERNAL_OPERATION (siehe CArtAgO/Internal Operation) fungiert als Thread, der eine Scheife mit Haltezeit beinhaltet. Auch das ModusArtifact hat eine derartige Update-Methode. In dieser werden die sich stehts aktualisierenden valueBoxen der Agenten in der streetMap mit hilfe eines Comparator_StreetMap kontinuierlich nach aufsteigenden x-Wert sortiert. In der update()-Methode des CommPorts des Agenten werden desweiteren die Methoden getDistance_front(ValueBox_CS_StreetMap) und getDistance_back(ValueBox_CS_StreetMap) der Klasse ModusArtifact aufgerufen. Diese Methoden liefern die Abstände zu den nächsten Fahrzeugen vor und hinter dem Agenten auf allen drei Spuren. Hinter dem Agenten bedeutet hinter der Vorderseite, also nicht unbedingt hinter dem kompletten Agenten. Ist der Abstand zum nächsten Fahrzeug größer, als VIEW_RANGE, ein Wert der im ModusArtifact definiert wird, wird der Abstand als -1 das heißt als unbekannt bewertet, zurückgegeben. Die Methode getDistance_front(ValueBox_CS_StreetMap valueBox) liefert ausßerdem den Blinkstatus des Fahrzeuges, dessen Abstand bestimmt wurde. Den Blinkzustand der hinteren Fahrzeuge wurde als unwichtig befunden. Über die Methode getObsProperty(String).updateValues(Object) wird anschließend in der Update-Schleife des CommPorts die BeliefBase des Agenten auf dem laufenden gehalten.

Agenten-Interaktion

TODO

inhaltliche Aufgaben

  • Manhattan-Distance-Function implementieren * Gruppenbildungstechniken evaluieren und geeignete implementieren * Nagel-Schreckenberg implementieren

technische Aufgaben

  • Szenarios in normaler Texdatei schreib- und lesbar ~ erledigt
  • Verwendung von Property-Dateien
  • Lösung zur Verwendung relativer Dateipfade finden
    • zur Zeit ist es so, dass durch das Script, das das Programm startet, erst in das Root-Verzeichnis der Applikation springt. und somit ist es möglich auf Property-Files etc. zuzugreifen. Eine saubere Lösung über .class.getClassLoader() wäre bei Zeiten angebracht.
  • einführung eines ChangeLogs