In den Schuhljahren 2019/20 und 2020/21 sorgte die Corona-Pandemie für mehrwöchige Schulschliessungen. Die rasche Ausbreitung der Viren und grosse Infektionsrisiken machten enorme Einschränkungen des Alltags und ausserordentliche Hygienemass nahmen notwendig. Weltweit gab es mehr als 5 Millionen Todesfälle (Stand am 30.11.2021: WHO (opens new window)).

Neben den Schulen mussten daher auch viele Geschäfte und Unternehmen ihren Betrieb einstellen oder stark zurückfahren, kulturelle Angebote kamen zum Erliegen oder waren nur online möglich. Persönliche Kontakte waren auf die dringend notwendigen zu reduzieren. Damit sollte einer noch schnelleren Verbreitung entgegengewirkt werden und somit zur Entlastung der Krankenhäuser beigetragen werden.

Defintion

Pandemien bezeichnen länderübergreifende Ausbreitungen von Infektionskrankheiten. Die Ausbreitung des Corona-Virus SARS-CoV-2, die vermutlich im Dezember 2019 in China begann, wurde am 11. März 2020 von der Weltgesundheitsorganisation WHO zur Pandemie erklärt.

# Simulation einer Ausbreitung

In diesem Kapitel wollen wir die Ausbreitung eines Virus simulieren. Konkret werden wir mit einem einfachen Modell die Ausbreitung eines Virus nachahmen, veranschaulichen und statistisch erfassen.

Defintion

Eine Simulation bezeichnet die Analyse eines dynamischen Systems durch Experimente an einem Modell, um Erkenntnisse über das reale System zu erzielen.

Simulationen werden in der Regel dort verwendet, wo man die Zusammenhänge relevanter Grössen nicht mehr mit einfachen mathematischen Formeln beschreiben kann. Häufig spielt bei solchen Systemen auch die Modellierung des Zufalls (stochastische Prozesse) eine Rolle.

Der erste Schritt einer Simulation ist die Modellfindung.

# Modellierung 1: System

Wir verwenden für diese Reihe ein sehr einfaches Modell eines eher harmlosen Virus. Für unser fiktives Szenario ist es unerheblich, ob es sich um ein Virus bei Menschen oder Tieren handelt. Daher sprechen wir im Folgenden immer von Individuen. In den Aufgaben werden Variationen dieses Modells vorgeschlagen. Ihr solltet jedoch darauf aufbauend versuchen, euer eigenes Modell zu entwickeln und zu implementieren.

# Unser Modell

In unserem Modell sollen sich 50 Individuen in einem Raum frei und zufällig bewegen. Die Infizierung und Erkrankung geschieht gemäss einem zustandsbasierten Modell, das im nächsten Schritt beschrieben wird. Abschliessend erfolgt als statistische Aufbereitung eine Zählung und grafische Darstellung, so dass die zeitliche Entwicklung der Ausbreitung nachvollzogen werden kann.

# Raum und Anordnung

Der Raum wird als Rechteck modelliert, dessen Koordinaten wir in Abhängigkeit von der Programmiersprache und der Anzahl der Individuen wählen. Jedes Individuum soll in diesem Rechteck zufällig platziert werden. Dabei sollte die Wahrscheinlichkeit der Zuordnung zu einer Position innerhalb des Rechteckes gleichverteilt sein.

Raum und Bewegung der Individuen

# Bewegung

Die Bewegung der Individuen soll gleichförmig erfolgen, d. h. die Individuen bewegen sich mit konstanter Geschwindigkeit immer in die gleiche Richtung, am Rand des Rechtecks «prallen sie ab» (Einfallswinkel gleich Ausfallswinkel). Alle Individuen bewegen sich mit gleicher Geschwindigkeit und weichen nicht einander aus.

# Implementierung 1: System

Wenn wir auf die Programmier-Erfahrung in diesem Fach zurückschauen, dann sehen wir sofort, dass sich Pygame Zero wohl sehr gut eignet, um das Modell des Systems zu implementieren:

  • Das Fenster stellt den rechteckigen Raum dar
  • 50 zufällig positionierte Actors stellen die Individuen dar
  • Die Actors können sich gleichmässig in eine zufällige Richtung bewegen und am Rand abprallen

System

Erstelle eine neues Pygame-Zero-Projekt:

  • Fenster mit Titel «Pandemie-Simulation»
  • 50 zufällig positionierte Actors mit Bild «gesund»
  • Actors bewegen sich gleichmässig in zufällige Richtung und prallen an den Rändern ab
gesund

# Modellierung 2: Infizierung

Wie bereits erwähnt, modellieren wir ein sehr einfaches Modell eines eher harmlosen Virus.

Wir gehen in unserem Modell davon aus, dass sich ein Individuum immer in einem der folgenden vier Zustände befindet:

  1. gesund
  2. infiziert
  3. krank
  4. geheilt

Die Infizierung erfolgt immer sofort bei Kontakt mit infizierten oder kranken Individuuen. Nach der Infizierung vergehen exakt 6 Tage bis die Krankheit ausbricht. Nach weiteren 14 Tagen gilt das Individuum dann als geheilt. Eine erneute Infizierung ist nicht möglich.

Zustandsdiagramm Krankheitsverlauf

# Implementierung 2: Infizierung

# Zustände

Die vier Zustände lassen sich in Pygame Zero einfach durch 4 Bilder für den Actor implementieren. Zum Beispiel:

gesund
infiziert
krank
geheilt

oder in den Gymerfarben:

gesund
infiziert
krank
geheilt

Die Bilder können mit einem Rechtsklick abgespeichert werden. Aber sie sind sehr klein, also genau klicken!

# Startzustand

  • Alle bis auf ein Individuum sollten im Startzustand «gesund» beginnen.
  • Ein Individuum muss patient zero (Indexpatient) sein.

# Zustandsübergänge

  • Treffen zweier Individuen lassen sich mit colliderect() überprüfen
  • Die Infektion lässt sich durch Überprüfen des aktiven Bildes des Individuums realisieren
  • Die Zeitdauer bis zum nächsten Zustand lässt sich mit clock.schedule() erreichen. Allerdings können wir beim geplanten Aufruf des so registrierten Unterprogramms, keine Argumente mitgeben – Wir müssen uns also sonst irgendwie merken, welcher Actor in einen neuen Zustand übergeht. (z.B. indem wir eine Liste aller Infizierten und eine Liste aller Kranken führen und dann dort immer beim ältestens den Zustand anpassen)

Tipp: Wie funktioniert das mit colliderect() und clock.schedule()

def werde_krank():
   individuum = infizierte[0]
   individuum.image = KRANK
   del infizierte[0]
   kranke.append(individuum)
   clock.schedule(werde_gesund, 14)

def update(dt):
   # actor verschieben und abprallen lassen
   # ...
   for individuum in individuen:
      for krank in kranke:
         if individuum.colliderect(krank):
            individuum.image = INFIZIERT
            infizierte.append(individuum)
            clock.schedule(werde_krank, 6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Infizierung

Implementiere die Infizierung:

  1. Setze den patient zero
  2. Teste, ob das mit colliderect() funktioniert, indem du eine sofortige Ansteckung simulierst
  3. Baue nun clock.schedule() ein, damit infizierte krank werden und kranke wieder gesund.

# Grafische Darstellung

Um die Entwicklung der Zahl der Infizierten, Kranken und Geheilten zu veranschaulichen ist eine statistische Erfassung und Auswertung notwendig. Hierzu benötigen wir Variablen um die Anzahl der Individuen in den jeweiligen Zuständen zu zählen. Die Variablen sollten immer sofort beim Zustandsübergang de- bzw. inkrementiert werden, so dass immer der aktuelle Bestand in den Variablen erfasst ist. Wenn wir eine Liste haben mit allen Kranken, können wir natürlich auch die Länge der Liste nehmen.

Um die Entwicklung «aufzuzeichnen», kann man z.B. pro Sekunde mit (clock.schedule_interval(plot, 1)) ein selbst definiertes Unterprogramm plot() aufrufen. Dort können verschiedene

  • Dieses gibt die Zahl der Kranken in der Shell aus.
  • Diese Werte können mit dem integrierten Plotter von Thonny dargestellt werden.
  • Alternativ, kann man die Daten auch per Copy&Paste ins Excel rübernehmen und dort als Diagramm darstellen.
  • oder man merkt sich alle Werte in einer Liste und zeichnet die als Diagramm im draw-Unterprogramm selbst!

Implementierung Graph

Programmieren die Anzeige des Graphen

# Auswertung

Nun können wir versuchen, Rückschlüsse aus der Simulation zu gewinnen:

Auswertung Graph

  1. Beschreibe den Verlauf des Graphen:
    • Welche charakteristischen Merkmale kannst du erkennen?
    • Kannst du den Graphen einem Funktionstyp, den du aus dem Mathematik-Unterricht kennst, zuordnen?
    • Erkläre den Verlauf auf der Basis der Modellannahmen.
  2. Führe die Simulation mehrfach durch: Welche Unterschiede und Gemeinsamkeiten bei den einzelnen Durchgängen kannst du beobachten?
  3. Verändere einige Parameter der Simulation, z. B. die Anzahl der Klone, die Zeitdauer beim Zustandsmodell oder die Geschwindigkeit der Bewegungen. Erkläre die Auswirkungen der jeweiligen Änderungen.

# Anpassungen

Aufgabe Modell und Experiment

Versuche mit den unten beschrieben Anpassungen Massnahmen zu ergreifen. Passe das Modell entsprechend an, damit die Wirkung dieser Massnahmen getestet werden kann!

# Bewegungsraum

Steuere die Bewegung der einzelnen Individuen so, dass sie sich

  • in x- und y-Richtung jeweils maximal um 50 Pixel von der Startposition fortbewegen,
  • nur in einem Umkreis von 50 Pixel von ihrer Startposition bewegen.

# Bewegungsgeschwindigkeit

Steuere die Bewegung der einzelnen Individuen so, dass sie sich mit unterschiedlichen Geschwindigkeiten bewegen.

# Weiteres

Überlege dir weitere Massnahmen und setze diese um: z.B. «Isolation»: Kranke bleiben stehen oder sind nicht mehr ansteckbar (weil isoliert) oder «Massentests»: Infizierte nehmen teils an Tests teil und können so bevor sie erkranken in Isolation geschickt werden.


Letzte Änderung: 12. Januar 2022 08:58