Home

NetLogo

Methoden

Umsetzungen

Aktuelles

Forschung

Sonstiges

Links

Kontakt




















 

Die Programmiersprache NetLogo


Zurück zum Inhaltsverzeichnis


Neben dem Namen des Programms bezeichnet NetLogo die Programmiersprache, mit der das Programm NetLogo gesteuert wird. NetLogo ist ein Dialekt von Logo, welches bereits in den 70er Jahren entwickelt wurde und sich in erster Linie an Kinder und Jugendliche wandte. Allen Logosprachen gemein ist der prozedurale Aufbau und die Verwendung von turtles. Die turtles sind gedachte Wesen, die sich auf der Zeichenebene (dem Bildschirm) steuern lassen. turtles werden auch agents, beziehungsweise Agenten genannt. Das Programm an sich besteht aus einer Abfolge von Befehlen, die das Programm entweder selbst kennt (Stammfunktionen oder primitives) oder die der Programmierer selbst erstellt. Dies soll anhand eines einfachen Beispiels verdeutlicht werden. Mit NetLogo sieht eine einfache Steueranweisung für eine turtle folgendermaßen aus:

ask turtle 1 [forward 10]

Die turtle mit der ID 1 macht zehn Schritte vorwärts. Der Befehl forward ist eine Stammfunktion und muß daher nicht weiter definiert werden. Möchte man eine turtle veranlassen, ein Quadrat mit der Kantenlänge 10 zu zeichnen, werden folgende Befehle benötigt:

ask turtle 1 [
               pen-down
               forward 10
               right-turn 90
               forward 10
               right-turn 90
               forward 10
               right-turn 90
               forward 10
               pen-up
   
                         ]

Die Befehle pen-down, pen-up und right-turn sind wiederum Stammfunktionen. Eine der Stärken der Sprache besteht darin, daß Abfolge von Befehlen als eigener Befehl definiert werden kann. Ein komplettes NetLogo-Programm zum Zeichnen eines Quadrats könnte so aussehen:

to go
  
setup-turtle
   draw-square
end

to setup-turtle
    create 1
    ask turtles [set color red]
end

to draw-square
    ask turtles [
            pen-down
            forward 10
            right-turn 90
            forward 10
            right-turn 90
            forward 10
            right-turn 90
            forward 10
            pen-up
            die
                ]
end

Der Anwender muß nun lediglich den Befehl go ausführen. Innerhalb von go wird zuerst der selbst definierte Befehl setup-turtle ausgeführt, der in der Prozedur to setup-turtle definiert wird. Das gleiche gilt für den Befehl draw-square.

Auf diese Art und Weise können Funktionen an Unterprogramme delegiert werden und von unterschiedlichen Stellen aus der Hauptprozedur (im obigen Fall go) aufgerufen werden. Nach dem Baukastenprinzip kann eine Anwendung stets erweitert werden. Das Definieren eigener Befehle erlaubt den Aufbau einer umfangreichen Sprachbibliothek. Netlogo zeichnet sich dadurch aus, daß es nicht nur eine, sondern theoretisch unendlich viele turtles gleichzeitig befehligen kann und über explizit räumliche 2D-Stammfunktionen verfügt.

Das Funktionsprinzip des Programms NetLogo

Dieser Punkt soll keine vollständige Anleitung liefern. Vielmehr soll er einen Einblick in die Funktionsweise und Strukturen des Programms vermitteln.

Das Turtle-Patch-Observer-Prinzip

Quelle:

Batty, Michael & Jiang, B. (1999): Multi-Agent Simulation: New Approaches to Exploring Space-Time Dynamics within GIS
http://www.casa.ucl.ac.uk/newvenue/Gisruk.PDF

Die NetLogo-Welt gliedert sich in drei Ebenen. Grundlage und gleichzeitig die Repräsentation der Umwelt bilden die patches. Die patches sind quadratische Rasterzellen zur Repräsentation einer Raumeinheit wie man es aus rasterbasierten GIS-Systemen gewohnt ist. Ungewohnt ist das Koordinatensystem, in dem die patches aufgespannt sind. Der Nullpunkt liegt in der Mitte des Bildes. Die turtles stellen die Agenten dar. Sie können sich innerhalb der 2D-Umwelt, die durch die patches gebildet wird, bewegen. Die dritte Ebene ist der observer, womit in der Regel der Programmierer gemeint ist. patches und turtles können autonom handeln, wobei den patches die Mobilität verwehrt bleibt. Der observer kann jedoch jederzeit in das Geschehen eingreifen. Einige Beispiele zur Verdeutlichung:

Ein typischer turtle-Befehl könnte so lauten:

T: if any? other turtles-here [die]

Die turtle soll prüfen, ob sich auf diesem patch eine weitere turtle befindet. Falls dem so ist, stirbt sie. Führt ein patch ein ähnliches Kommando aus, ist folgender Code notwendig:

P: while [count turtles-here > 1]
[ask random-one-of turtles-here [die]]

Der patch überprüft, ob sich mehr als eine turtle auf ihm befindet. Solange dies der Fall ist, „bittet" der patch eine zufällig ausgewählte turtle zu sterben. Der observer kann auf alle patches und turtles zugreifen. Zum Beispiel:

O: ask turtles [die]

Alle turtles sterben. Oder:

O: ask patches [set pcolor red]

Alle patches setzen ihre Farbe auf rot. Oder:

O: stop

Die Prozedur wird angehalten.

Zwischen allen drei Ebenen ist Kommunikation und Interaktion möglich. Es ergeben sich folgende Möglichkeiten:

Interaktion zwischen:

turtle – turtle
urtle – patch
patch – patch
patch – turtle
observer – patch
observer – turtle

Die Kommunikation findet über Variablen statt.

Räumliche Stammfunktionen

NetLogo verfügt über eine große Anzahl von Stammfunktionen. Neben mathematischen und logischen Operatoren, Agentenbefehlen, Listenfunktionen, File I/O-Kommandos und Displayanweisungen gehören die Funktionen mit räumlichem Bezug für geographische Anwendungen zu den Interessantesten. Der Raum in Netlogo ist zweidimensional, in diesem Sinn sind auch die Befehle und Reporter zu verstehen. Die wichtigsten Funktionen im Überblick:

Patchfunktionen:

diffuse:  verteilt den Wert einer Variable nach bestimmten Regeln auf die Nachbarpatches

Turtlefunktionen:

uphill/downhill:: liefert die Richtung einer turtle (siehe auch unter heading) auf den Nachbarpatch mit dem geringsten, beziehungsweise höchsten Wert einer Patchvariable

heading: zeigt die Ausrichtung einer turtle an, wobei die Werte null und 360 eine Ausrichtung nach Norden, der Wert 180 eine Ausrichtung nach Süden anzeigt.

Patch- und Turtlefunktionen:

distance: ermittelt die euklidische Distanz zu einer

in-radius: ermittelt die turtles oder patches in einem bestimmten Radius

neighbors: ermittelt die turtles oder patches in unmittelbarer Nachbarschaft

towards: ermittelt den Winkel, bezogen auf Null, in dem sich eine turtle oder ein patch vom Standpunkt des Ausführenden aus, befindet

Variablen

NetLogo kennt alle gängigen Variablentypen. Eine Variable kann eine globale, eine lokale, eine turtle-own oder eine patch-own Variable sein. turtle-own- beziehungsweise patch-own-Variablen beziehen sich jeweils nur auf turtles oder patches. Nebenstehende Abbildung zeigt exemplarisch, welche Variablen eine turtle tragen kann. Bestimmte Variablen wie zum Beispiel X- und Y-Koordinate sind immer vergeben. Andere, wie zum Beispiel die Variable happiness werden je nach Bedarf vergeben. Jede turtle verfügt selbständig über ihre Variablen, das heißt jede turtle kann für die gleichlautende Variable einen anderen Wert besitzen. Die breed-Variable ist für den praktischen Umgang mit unterschiedlichen Agententypen sehr hilfreich. Sie erlaubt die Aufteilung der turtles in verschiedene Klassen, die separat angesprochen werden können.

Lokale Variablen können nur innerhalb einer Prozedur verwendet werden. Globale Variablen sind für alles und jeden zugänglich und können jeweils nur einen festen Wert besitzen.

Sehr hilfreich sind einige besondere Variablentypen, die NetLogo kennt. Die Listen und die agentsets. Ein agentset besteht aus mehreren turtles oder patches. In folgendem Beispiel wird die Variable forest gesetzt:

set forest patches with [pcolor = green]

Alle grünen patches werden von nun an unter der Variable forest geführt. Ähnlich verhält es sich mit Listen. Einer Variable wird nicht nur ein einzelner sondern mehrere Werte zugewiesen.

set waylist [-32 30 -10 10 0 1 20 25]

In diesem Beispiel wird der Variable waylist eine Abfolge von Zahlen zugewiesen. Dies kann sehr nützlich sein, um beispielsweise zurückgelegte Wege, Erinnerungen, Wünsche oder Ziele zu speichern.

Datenausgabe

Um dem Programmablauf folgen zu können und Veränderungen von Zuständen zu beobachten stehen dem Anwender verschiedene Datenausgabemöglichkeiten zur Verfügung. Im einzelnen sind dies:

Das graphische Ausgabefenster

In den meisten Fällen, im besonderen bei räumlichen Fragestellungen, ist das graphische Fenster unverzichtbar. Hier werden turtles und patches dargestellt. Einige Programme erlauben eine direkte Kommunikation über die Maus mit dem graphischen Ausgabefenster.

 

 

 

Der plot

 

 

 

Plot Histogramm

Mit Hilfe von plots lassen sich Werte von Variablen im Zeitverlauf darstellen. Bei dem gezeigten Beispiel  wird der Verlauf einer Bevölkerungsentwicklung dargestellt. Eine Sonderfall des plots bildet das Histogramm. Es zeigt die aktuelle Häufigkeitsverteilung bestimmter Variablenwerte.

Der Monitor

Monitore dienen ebenfalls zur Überwachung von Variablen. Im Beispiel  zeigt der Monitor die Anzahl der Rechenschritte seit dem Programmstart an.

Steuerung des Programms

Einer ungeschriebenen Konvention folgend wird ein Programm über den Setup-Button initialisiert. Gestartet wird ein Programm – der gleichen Konvention folgend – über den Go-Button. Neben den Buttons  stehen dem Anwender weitere Möglichkeiten zur Einflußnahme auf den Programmablauf zur Verfügung. slider (eventuell übersetzbar mit Schieberegler) erlauben das Setzen einer Variable innerhalb einer festgelegten Spannweite. switches (im Deutschen: Ein/Aus Schalter) können gewisse Programmfunktionen aktivieren oder deaktivieren.

Button

slider switch

Ein Spezialfall stellt der Behavior Space dar. Er erlaubt das mehrfache automatische Durchlaufen eines Programms unter Variierung der verwendeten Parameter. Die jeweiligen Ergebnisse können in Dateien gespeichert werden. Vom Ansatz her ist er den genetischen Algorithmen  sehr ähnlich.

Datenim- und export

Der Import von explizit räumlichen Daten in NetLogo ist eigentlich nicht vorgesehen. Trotzdem ist es möglich, über Textfiles Punktwerte einzulesen und den patches als Variablen zuzuweisen. Der Zugriff auf andere Dateien erlaubt es auch, Listen jeglicher Art, auch während des Programmablaufs, zu importieren und zu verarbeiten.

Für den Datenexport stehen mehrere Möglichkeiten zur Verfügung:

  • Graphikexport des graphischen Ausgabefensters

  • Export beliebiger Variablen, Listen oder plots im .txt- oder .csv-Format

  • Export der aktuellen, vollständigen NetLogo-Welt (die Zustände der turtles, patches und Variablen werden in einer Datei als world-file gespeichert)

Die exportierten Daten stehen somit in einem Format zur Verfügung, welches die Weiterverarbeitung in einem Tabellenkalkulationsprogramm oder einer GIS-Anwendung ermöglicht.