Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws2021:simulation_infektionsgeschehen

Simulation Infektionsgeschehen

Gruppenmitglieder: Nestan, Sarah, Jessica, Livia

1. Projektbeschreibung

Wir erstellen eine Simulation, die den Infektionsverlauf einer Pandemie nach verschiedenen Parametern untersucht und visuell darstellt. Wir orientieren uns dabei an der aktuellen Covid-19 Pandemie.

2. Modelle zur Darstellung einer Pandemie

Agentenbasiertes Modell

Wie jedes Modell ist auch das agentenbasierte Modell eine abstrakte Beschreibung eines Vorgangs. Bestimmte Aspekte werden vernachlässigt, andere werden hervorgehoben. Der Fokus liegt auf den Aspekten, die wichtig sind und untersucht werden sollen.

Beispiele für agentenbasierte Modellierung sind Simulationen von Staus, künstliche Wirtschaftssysteme, oder wie in unserem Fall die Simulation der Ausbreitung einer Krankheit.

Weitere Infos zum agentenbasierten Modell

SEIR-Modell

Das SEIR-Modell (Susceptible, Exposed, Infected, Recovered) ist ein mathematisches Modell, das die Ausbreitung von ansteckenden Krankheiten beschreibt. Am Anfang sind alle Agenten susceptible, ein Agent ist infiziert. Bei Kontakt mit dem infizierten Agenten wechselt der Zustand zu exposed, nach einer bestimmten Zeit zu infected und wieder nach einer bestimmten Zeit zu recovered. Nur Agenten mit dem Zustand „infected“ können andere anstecken. Recoverte Agenten sind immun und können sich nicht erneut anstecken.

Weitere Infos zum SEIR-Modell

3. Visualisierung mit Turtle & Plotly

Turtle

Zuerst haben wir unsere Simulation mit Turtle visualisiert, da wir uns damit bereits beschäftigt hatten und Turtle ein sehr leicht zu durschauendes Visualisierungs-Tool ist. Turtle hatte für uns jedoch den Nachteil, dass wir nicht zeitgleich zur Simulation die Graphen erstellen konnten. Deshalb haben wir uns für plotly entschieden.

Hier könnt ihr über Turtle graphics lesen

Was ist Plotly?

Plotly-Tutorial

Plotly ist eine Python-Bibliothek für verschiedenste Grafiken. Mithilfe von Plotly ist es uns gelungen, die Darstellung unserer Agenten deutlich flüssiger zu gestalten. Zusätzlich können wir Graphen plotten, die die Veränderung der Anzahl der susceptible, infected und recovered Agenten aufzeichnen. Sie erleichtern somit die Auswertung der Simulationen.

4. Erklärung der Klassen

Klasse Agents

Die Klasse Agents ist eine Objektklasse und dient zur Erstellung der Agenten mit verschiedenen Attributen und Eigenschaften. In unserer Agentenklasse haben Agenten die Attribute Farbe, Position, Richtung, Geschwindigkeit und Tage. Die Agenten können ihren Zustand ändern, in dem sie ihre Farbe und Tage verändern, außerdem können sie sich bewegen.

Klasse Agents

Klasse World

Die Klasse World erstellt eine Umgebung von Agenten und ist zuständig für die Interaktion zwischen den Agenten. In der Klasse wird geprüft, ob die Änderung der Zustände nötig ist, in dem man die Begegnung zwischen zwei Agenten betrachtet. Außerdem werden in der World-Klasse Listen aktualisiert, die später für die Visualisierung nötig sind. In diesen Listen werden die Positionen von allen Agenten bzw. die Anzahl der Susceptibles, Exposed, Infected und Recovered gespeichert. In dieser Klasse kann man auch die Bewegungseinschränkung einstellen, genau so wie die Wahrscheinlichkeit bei der Quarantäne und die Ansteckungswahrscheinlichkeit.

Klasse World

Maincode

In dem Maincode werden die Klassen und Ihre Funktionen aufgerufen und die Simulation wird mithilfe von Plotly visualisiert.

Maincode

5. Endergebnisse

Simulation ohne Maßnahmen

Die Agenten bewegen sich in eine zufällige Richtung mit einer zufälligen Geschwindigkeit. Am Anfang ist ein Agent ansteckend. Bei Kontakt mit diesem Agenten steckt sich ein gesunder, nicht immuner Agent zu 70% an.

Simulation mit Masken

Masken bewirken, dass die Ansteckungswahrscheinlichkeit bei Kontakt geringer ist. Wir haben in unserem Code die Ansteckungswahrscheinlichkeit auf 10% gesenkt. Die Auswirkung dieser Maßnahme ist im Graph deutlich zu erkennen.

def changeCondition1(self,agent1, agent2, probability = 0.1): # probability of agents getting infected
    '''
    change condition of one agent in case of a collision with the infected Agent
    '''
    if self.checkForCollision(agent1, agent2):
        # check if one of the Agents is infected and the other one susceptible, in that case susceptible Agent gets exposed
        if agent1.isSusceptible() and agent2.isInfected() and random.random() < probability:
            agent1.setExposed()
            self.number_exposed += 1
            self.number_susceptible -= 1
        elif agent1.isInfected() and agent2.isSusceptible() and random.random() < probability:
            agent2.setExposed()
            self.number_exposed += 1
            self.number_susceptible -= 1

Simulation mit Masken und Bewegungseinschränkung

Wir haben die niedrigere Ansteckungswahrscheinlichkeit beibehalten. Außerdem bewegt sich nur jeder zweite Agent. Das soll die verringerte Mobilität während der Pandemie darstellen, dadurch gibt es weniger Kontakte.

def lessMovement(self, n = 2):
    '''
    set speed of every n-th Agent to 0
    '''
    for i in range(0,self.number_of_agents,n):
        self.agents_list[i].xspeed = 0
        self.agents_list[i].yspeed = 0

Simulation mit Quarantäne, ohne weitere Einschränkungen

Wir haben eine Quarantäne-Funktion hinzugefügt, bei der jeder zweite Agent nach vier Tagen nach der Infektion in Quarantäne geht. Wir haben uns für jeden zweiten Agent entschieden, da auch in Realität viele Infektionen nicht erkannt werden. Im Code kann man die Wahrscheinlichkeit einfach ändern, mit der die infizierten Agenten in Quarantäne gesetzt werden. Wenn der Agent 14 Tage in Quarantäne war, ist er recovered und begibt er sich wieder in das Haupt-Feld und bewegt sich normal weiter. Im Graphen erkennt man einen deutlich flacheren Verlauf als ohne Quarantäne.

def changeCondition2(self,agent, quarantine = 0):   # quarantine = probability of infected Agents going into quarantine 
 
        elif agent.day == 4*days:
            # change the condition to Infected if the agent has been exposed for 4 days
            agent.setInfected()
            self.number_infected += 1
            self.number_exposed -= 1
 
            if random.random() < quarantine:
                # move the agent to the quarantine and change its speed to zero
                agent.xpos = random.uniform(self.width+2*Agents.radius +10,self.width+30)
                agent.ypos = random.uniform(0,(self.height+Agents.radius)/2-Agents.radius)
                agent.xspeed = 0
                agent.yspeed = 0
 
        elif agent.day == 18*days:
            # move the agent who is in quarantine back to the main square after 14 days of being infected (18 days after the collision with infected)
            # set speed
            agent.xpos = random.uniform(0,self.width)
            agent.ypos = random.uniform(0,self.height)
            agent.xspeed = self.temp*random.uniform(-10,10)
            agent.yspeed = self.temp*random.uniform(-10,10)
            agent.day += 1

6. Fazit

Unser Modell kann zur Veranschaulichung des Infektionsgeschehens während einer Pandemie, wie z.B. der Covid-19-Pandemie dienen und zeigen, wie dieses beeinflusst werden kann.

Im Verlauf des Projekts haben wir unsere Fähigkeiten und Fertigkeiten im Programmieren mit Python konstant weiterentwickelt und sind mit den Herausforderungen gewachsen, die die Aufgabe an uns gestellt hat.

Die größten Schwierigkeiten waren hierbei einerseits die Programmierung der Agentenbewegung und andererseits das Verstehen der Visualisierungsoberfläche Plotly. Unser Projekt hat mit einem Code begonnen, der im Laufe unserer Arbeit immer komplexer wurde. Am Ende mussten wir daher besonders an der Übersichtlichkeit arbeiten. Dies ist uns durch das Umschreiben des Codes in eine Klasse gelungen. Schließlich haben wir eine Simulation erstellt, die das Infektionsgeschehen einer Pandemie in einem kleinen Maßstab und vereinfacht darstellt und anhand von Graphen visualisiert.

7. Lustige Fehlversuche

8. Ausführliche Protokolle

9. Weitere Ideen für das Projekt

  • Möglichkeit einer Impfung einführen
  • Laufzeit verbessern
  • mehrere Agenten-Räume mit/ohne Einschränkung von Mobilität
  • interaktive Benutzeroberfläche

Ideen für das Projekt und Zwischenziele

Literatur und Hilfsmittel

Code als Zip-Datei

Verzeichnis der Python-Pakete

ws2021/simulation_infektionsgeschehen.txt · Zuletzt geändert: 2021/04/13 21:34 von jessica.03