Projektvorstellung Simunto
04.06.2019, Mirco Widmer

Wir stellen ein Kundenprojekt vor, in welchem wir verschiedene Erweiterungen umsetzen konnten.

Ausgangslage

Simunto bietet Softwarelösungen und Unterstützung für die Arbeit mit der agentenbasierten Verkehrssimulation MATSim an. Die Kunden von Simunto werden mit einer Webapplikation unterstützt, die ihnen verschiedene Möglichkeiten anbietet, um Simulationen zu verwalten und zu konfigurieren. Bei der Unterstützung in diesem Bereich wurden wir mit folgenden Herausforderungen konfrontiert:

  • Wie können unterschiedliche Benutzergruppen bei der Konfiguration via XML unterstützt werden?
  • Wie sieht eine Architektur aus, sodass einfach und sicher die Last des zentralen Servers minimiert werden kann, wenn rechenaufwändige Simulationen ausgeführt werden?
  • Wie können mehrere Gigabytes an Bewegungsdaten effizient visualisiert werden?

Resultate

Grafischer XML Editor

Mit der Möglichkeit, XML-Konfigurationsfiles grafisch zu editieren, schafften wir den Mehrwert, dass die Benutzer nicht mehr XML direkt schreiben müssen. Sie können sich so auf die effektive Konfiguration konzentrieren und das darunterliegende Datenformat ist irrelevant für sie. Je nach Erfahrungsniveau der Benutzer können zusätzliche Bereiche konfiguriert werden.

Schema

Mit einem für den grafischen Editor entwickelten Schema wird konfiguriert, welche Konfigurationen in einem bestimmten Kontext konfiguriert werden können. Das Schema definiert die einzelnen Module (hier das Beispiel eines einzelnen Moduls). Die einzelnen Einstellungen sind gruppierbar und wiederholbar und bieten die Möglichkeit einer Validierung.

{
  "modules": [
    {
      "name": "Replanning",
      "categories": ["beginner", "advanced", "expert"],
      "items": [
        {
          "label": "Number of threads",
          "type": "text",
          "binding": "global.numberOfThreads",
          "validation": "^\\d+$",
          "validationMessage": "integers ≥ 0",
          "categories": ["beginner", "advanced", "expert"]
        },
        {
          "label": "Fraction of iterations to disable innovation",
          "type": "text",
          "binding": "strategy.fractionOfIterationsToDisableInnovation",
          "validation": "^1\\.0$|^0\\.?\\d+$|^Infinity$",
          "validationMessage": "numeric value between 0.0 and 1.0.",
          "hint": "recommended values are around 0.8 and 0.9",
          "categories": ["advanced", "expert"]
        },
        {
          "label": "Replanning strategies",
          "type": "group",
          "binding": "strategy.strategysettings",
          "categories": ["beginner", "advanced", "expert"],
          "items": [
            {
              "label": "Strategy",
              "type": "select",
              "binding": "strategyName",
              "selectableValues": [
                "ReRoute", "TimeAllocationMutator", 
                "ChangeLegMode", "TimeAllocationMutator_ReRoute",
                "ChangeSingleLegMode", "ChangeSingleTripMode",
                "SubtourModeChoice", "ChangeTripMode",
                "TripSubtourModeChoice"
              ],
              "customValueAllowed": true,
              "categories": ["beginner", "advanced", "expert"]
            },
            {
              "label": "Weight",
              "type": "text",
              "binding": "weight",
              "validation": "^\\d+\\.?\\d+$",
              "validationMessage": "floating point value ≥ 0.",
              "categories": ["beginner", "advanced", "expert"]
            },
            {
              "label": "Disable after iteration",
              "type": "text",
              "binding": "disableAfterIteration",
              "validation": "^-1$|^\\d+$",
              "validationMessage": "integers ≥ 0, or -1",
              "hint": "Use -1 to never disable this strategy",
              "categories": ["advanced", "expert"]
            },
            {
              "label": "Subpopulation",
              "type": "text",
              "binding": "subpopulation",
              "categories": ["expert"]
            }
          ]
        }
      ]
    }
  ]
}

Grafisches User Interface für die Konfiguration

Das GUI basiert auf dem Schema und rendert die Formular-Elemente entsprechend der Definition. So kann das komplexe XML leicht und angepasst auf die Domäne konfiguriert werden.

Beginner Mode

Im Beginner Modus sind nur die wesentlichsten Konfigurationsmöglichkeiten sichtbar.

Ein Screenshot, der den Editor im _Beginner_ Modus zeigt.

Advanced Mode

Im Advanced Modus können zusätzliche und komplexere Konfigurationsmöglichkeiten verwendet werden.

Ein Screenshot, der den Editor im _Advanced_ Modus zeigt.

Expert Mode

Im Expert Modus ist es dann ebenfalls möglich das XML-File direkt zu editieren.

Ein Screenshot, der den Editor im Experten-Modus zeigt.

Job Runner Architektur

Um die Last auf dem Webserver zu minimieren, implementierten wir eine Architektur, die es ermöglicht, dass sich andere Computer beim Server anmelden können, um gewisse Aufgaben zu übernehmen.

Eine Grafik, die die Runner-Architektur symbolisiert.

Die einzelnen Runners kommunizieren mit dem Server über GRPC. Es können sich beliebig viele Runners beim Server anmelden, was zu einer optimalen Skalierung führt. Der Server kann Aufgaben an spezifische Runners delegieren und erhält eine Antwort, nachdem die Aufgabe vom Runner erfolgreich erledigt worden ist.

Visualisierung von Bewegungsdaten

Resultate von MATSim-Simulationen sind unter anderem Bewegungsdaten von Agenten, die zu bestimmten Zeiten an bestimmten Orten sind. Diese Daten können sehr gross werden und sollen im Browser sinnvoll visualisiert werden. Der Server bereitet die geografisch eingeschränkten Daten auf und schickt diese in einem optimierten Binär-Format an den Browser. Im Browser werden einerseits die Bewegungsdaten, aber auch das Strassennetz und Metadaten, mithilfe von deck.gl und Mapbox visualisiert. Die Animation der Bewegungsdaten kann gestartet, gestoppt und deren Geschwindigkeit angepasst werden. Ebenso ist es möglich, weitere Informationen zum darunterliegenden Netzwerk zu erhalten und einen Agenten visuell zu verfolgen.

Übersicht Berlin mit Agenten (rot)

Die roten Elemente symbolisieren Agenten, die sich über den Zeitraum eines Tages in und um Berlin herum bewegen.

Screenshot aus Tramola, das ein Strassennetzwerk aus Berlin zeigt.

Detailansicht Berlin mit Agenten (rot)

Wenn ganz hineingezoomt wird, dann ist gut sichtbar, wo sich die Agenten genau befinden.

Screenshot aus Tramola, welcher einzelne Agenten zeigt

Strassennetzwerk Schweiz

Auf der folgenden Abbildung ist das komplette Strassennetzwerk der Schweiz visualisiert. Es besteht aus tausenden von Strassenabschnitten und alle werden flüssig dargestellt.

Screenshot des Strassennetzwerks der Schweiz aus Tramola

Animation

Die Animation zeigt wie sich eine Vielzahl von simulierten Agenten bewegen.