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.
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.
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
Das aktuelle Streetworld kann auch als ausführbare Version über Sourceforge als Archiv heruntergeladen werden.
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
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 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.