[PYTHON] [Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬

Auf dem Gebiet der numerischen Berechnung gibt es seit langem Simulationen von frei beweglichen Partikeln und kollektiven Bewegungen von sich braun bewegenden Partikeln. Dieses Mal werde ich dies auf die Simulation einer Coronavirus-Infektion anwenden. pNo1000_R30sec_IP30%.gif Es gibt PSO als ähnliche Simulation, aber dieses Mal habe ich mich auf diese Python-Codes bezogen. 【Referenz】 ・ Informationen zu Parametern der Partikelgruppenoptimierung (PSO)Gespeicherte Methode zur Optimierung von Partikelgruppen (PSO)

Was ich getan habe

・ Codeerklärung ・ Abhängigkeit von der Infektionsrate ・ Abhängigkeit von der Partikeldichte ・ Abhängigkeit der Partikelbewegung

・ Codeerklärung

Der gesamte Code ist unten. ・ Collective_particles / snow.py Beschreiben Sie die Hauptteile des Codes. Die verwendeten Bibliotheken sind wie folgt

import numpy as np
import matplotlib.pyplot as plt
import random
import time

Die Definition des Anfangswertes ist wie folgt

PARTICLE_NO = 1000 #Anzahl der Partikel
ITERATION = 200 #Maximale Anzahl von Schleifen Stoppt, wenn die Anzahl infizierter Personen 0 erreicht
MIN_X, MIN_Y = -100.0, -100.0 #Mindestreichweite zu Beginn der Suche
MAX_X, MAX_Y = 100.0, 100.0 #Maximale Reichweite zu Beginn der Suche
recovery=30 #Nach einer gewissen Zeit geheilt
p=0.03 #probability of infecion

Die grafische Anzeige, wie Sie aus den obigen Ergebnissen sehen können, ax1: Informationen zur Partikelposition ax2: Blau; Normale Zahl, Rot; Infektionszahl, Grün; Heilungszahl-Frequenzdiagramm Wird wie folgt angezeigt. Argumente sind Diagrammnummer, Positionsinformationen, verstrichene Zeit, r-, g-, b-Werte

def plot_particle(sk,positions,elt,r,g,b):
    el_time = time.time()-start
    fig, (ax1, ax2) = plt.subplots(2, 1, sharey=False,figsize=(8, 16))
        
    for j in range(0,PARTICLE_NO):
        x=positions[j]["x"]
        y=positions[j]["y"]
        c=positions[j]["c"]
        s = 5**2  #Partikelgröße
        ax1.scatter(x, y, s, c, marker="o")
    ax1.set_xlim([MIN_X, MAX_X])
    ax1.set_ylim([MIN_Y, MAX_Y])
    ax1.set_xlabel("x")
    ax1.set_ylabel("y")
    ax1.set_title("{:.2f}:InfectionRate;{:.2f} %".format(el_time,(PARTICLE_NO-b[-1])/PARTICLE_NO*100)) #Kumulative Infektionsrate
    ind = np.arange(len(elt))  # the x locations for the groups
    width = 0.3       # the width of the bars
    ax2.set_ylim([0, PARTICLE_NO])
    ax2.set_title("{:.2f}:red_{} green_{} blue_{}".format(el_time,r[-1],g[-1],b[-1]))
    rect1 = ax2.bar(ind, b,width, color="b")
    rect2 = ax2.bar(ind+width, g, width, color="g")
    rect3 = ax2.bar(ind+2*width, r,width, color="r")
    plt.pause(0.1)
    plt.savefig('./fig/fig{}_.png'.format(sk)) 
    plt.close()

Die Hauptlogik wurde diesmal in die Funktion zur Aktualisierung der Partikelpositionsinformationen verschoben. Das heißt, die Attribute des Partikelobjekts sind wie folgt definiert.

Attribut Wert
Standortinformationen; (x,y)
Infektiöses Attribut; (blue,red,green)
Zeitpunkt der Infektion (verstrichen vom Anfangswert); t_time
Infektionsverlaufsflagge; s (1 infiziert, 0 nicht infiziert)
position.append({"x": new_x, "y": new_y, "c": p_color, "t": t_time,"flag":s})

Verwenden Sie die folgende Funktion, um die Zeitänderung der oben genannten Variablen zu ermitteln. Die Infektion wird nach der folgenden Formel beurteilt. Wenn Sie einen Kreis mit einem Radius von 20 eingeben, wird dieser so ausgewertet, als wären Sie mit einer bestimmten Wahrscheinlichkeit p infiziert. Mit anderen Worten, ** dieser Radius und die Infektionswahrscheinlichkeit p bestimmen die Stärke der Infektion **.

if (x-x0[k])**2+(y-y0[k])**2 < 400 and random.uniform(0,1)<p:

Nachdem wir das Partikelobjekt wie oben definiert haben, extrahieren und weisen wir jede Variable zu. Eine andere Sache ist der Einfachheit halber, dass die Heilung nach einer bestimmten Zeit automatisch geheilt wird. Es ist in Ordnung, auch hier zu heilen, aber es muss hier nicht detailliert beschrieben werden, da es das Ereignis nur kompliziert. Außerdem wurde die ** Partikelbewegung (Bewegung von Personen) im Durchschnitt auf zufälliges Gehen ** eingestellt. Es ist eine Annäherung, dass sich Menschen nicht so viel bewegen. Andererseits ist es möglich, es wie eine Simulation der molekularen Bewegung frei bewegen zu lassen, aber ich habe es nicht getan. Und ** die Annahme, dass eine Infektion eine geheilte Person nicht infiziert **.

#Funktion zur Aktualisierung der Partikelposition
def update_position(positions):
    x0 = []
    y0 = []
    for i in range(PARTICLE_NO):
        c=positions[i]["c"]
        t_time = positions[i]["t"]  #Anfangswert 0, Infektionszeit zum Zeitpunkt der Infektion
        k_time = time.time()-start  #verstrichene Zeit
        s = positions[i]["flag"]    #Keine Infektion 0, Infektion: 1
        if s == 1 and c == "red":   #Wenn infiziert
            if k_time-t_time>recovery:  #Nach einer gewissen Zeit geheilt
                c = "blue"
                positions[i]["c"] = "green"
                positions[i]["flag"] = 1   #Die Infektionsgeschichte bleibt jedoch bestehen
        if c == "red":  #Erhalten Sie Standortinformationen, wenn Sie rot infiziert sind
            x0.append(positions[i]["x"])
            y0.append(positions[i]["y"])
    position = []
    for j in range(PARTICLE_NO):
        x=positions[j]["x"]
        y=positions[j]["y"]
        c=positions[j]["c"]
        s = positions[j]["flag"]
        t_time = positions[j]["t"]
        for k in range(len(x0)):
            if (x-x0[k])**2+(y-y0[k])**2 < 400 and random.uniform(0,1)<p:
                if s ==0:
                    c = "red"
                    t_time = time.time()-start
                    s = 1
                    positions[j]["flag"]=s
                else:
                    continue
        vx = 1*random.uniform(-1, 1)
        vy = 1*random.uniform(-1, 1)
        new_x = x + vx
        new_y = y + vy
        p_color = c
        s=s
        
        position.append({"x": new_x, "y": new_y, "c": p_color, "t": t_time,"flag":s})
    return position, x0

Die Hauptfunktion ist wie folgt Der Punkt ist, dass ein Partikel durch den Anfangswert infiziert ist: rot, Flagge, 1 usw. Andere Partikel sind zufällig ohne Infektion angeordnet. Es gibt eine Idee, die Position des ersten Partikels in der Mitte zu platzieren, aber ich wollte die Übertragung der Infektion von verschiedenen Positionen aus sehen, also habe ich eine beliebige Position gewählt. Die Funktion count_brg () zählt einfach.

def main():
    #Anfangsposition jedes Partikels,Geschwindigkeit, 
    position = []
    velocity = []  #Ich benutze diesmal keine Geschwindigkeit
    #Ausgangsposition,Anfangsgeschwindigkeit
    position.append({"x": random.uniform(MIN_X, MAX_X), "y": random.uniform(MIN_Y, MAX_Y), "c": "red", "t":0, "flag":1})
    for s in range(1,PARTICLE_NO):
        position.append({"x": random.uniform(MIN_X, MAX_X), "y": random.uniform(MIN_Y, MAX_Y), "c": "blue", "t": 0, "flag":0})
    sk = 0    
    red=[]
    green=[]
    blue=[]
    elapsed_time = []
    while sk < ITERATION:
        position, x0 = update_position(position)
        r,g,b = count_brg(position)
        red.append(r)
        green.append(g)
        blue.append(b)
        el_time=time.time()-start
        elapsed_time.append(el_time)
        plot_particle(sk,position,elapsed_time,red,green,blue)
        if x0==[]:
            break
        sk += 1

・ Abhängigkeit von der Infektionsrate

Erstens, wie ändert sich der Zustand der Infektionsübertragung und die kumulative Infektionsrate insgesamt, wenn die Infektionsrate p geändert wird? Im obigen Beispiel beträgt die Infektionsrate p = 30%, die kumulative Infektionsrate 100% und es ist ersichtlich, dass die Übertragung definitiv stattgefunden hat und wie ein Tsunami übertragen wird. Die Spitzeninfektionen betrugen 404 und 67,5 Sekunden. In diesem Fall scheint es, dass eine Gruppenrate wie die Übertragungsrate definiert werden kann, aber ich habe sie irgendwie gestoppt. Wenn andererseits die Infektionsrate p = 5% war, fiel die kumulative Infektionsrate auf 92,20%, und der Zustand der Infektionsübertragung wurde wie unten gezeigt blau auffällig, unterdrückt auf den Infektionspeak 235 und die Peakposition wurde auf 178 Sekunden verlängert. pNo1000_R30sec_IP5%.gif Wenn die kritische Infektionsrate, ob eine Infektionsübertragung auftritt oder nicht, = 3% ist, sind die Ergebnisse wie folgt. Mit anderen Worten, es ist ein Bild, dass die Übertragung von Infektionen wie Tsunami verschwindet und sich schrecklich ausbreitet. Die Spitzeninfektion betrug nur 117 und 260 Sekunden. Die kumulative Infektionsrate verringerte sich auf 52%. Bei dieser Infektionsrate endete dieses Berechnungsergebnis ebenfalls in der Mitte, verschwand jedoch manchmal im Anfangsstadium fast ohne Infektion. Mit anderen Worten: ** Wenn Sie die Infektionsrate durch Händewaschen oder Masken auf unter ein bestimmtes Niveau (3% oder weniger in dieser Simulation) senken können, ist es möglich, die Übertragung von Infektionen zu verhindern. ** ** ** pNo1000_R30sec_IP5%.gif

Es wird angenommen, dass diese Ergebnisse ** darauf hinweisen, dass durch die Kontrolle von Kommunikationsmethoden wie Masken, Umarmungen, Küssen und Hustenetikette die kumulative Infektionsrate in gewissem Maße verringert werden kann, obwohl sie verlängert werden kann. es kann. Und wenn Sie sich diese Simulation genau ansehen, ** sind die blauen Partikel (nicht infizierte Personen) in dem Bereich, in dem sich eine Person befindet, die einmal geheilt ist, vor einer Infektion geschützt **, und die Übertragung der Infektion breitet sich nicht nach innen aus. Das heißt, ** die Bevölkerung in diesem Gebiet ist robust gegenüber Infektionen und vermeidet selten das Infektionsrisiko. ** Das heißt, es kann gesagt werden, dass ** Massenimmunität erworben hat **. Diese Massenimmunität kann einfach umformuliert werden, um die Übertragung von Infektionen zu verhindern, da der Heiler die Dichte nicht infizierter Personen in der Bevölkerung erheblich verringert.

・ Abhängigkeit von der Partikeldichte

Ein weiteres Interesse ist, ob die allgemeine Weisheit, nicht zu sammeln, was normalerweise zu Absagen von Veranstaltungen oder Versammlungen von Rallyes führt, die richtige Antwort ist. Hier wurde unter den Bedingungen einer Infektionswahrscheinlichkeit von 30% und einer Erholungszeit von 30 Sekunden die Teilchendichte geändert, um den Unterschied im Verhalten zu sehen. Die Ergebnisse sind wie folgt, wenn die Partikeldichteabhängigkeit der Infektionsrate in der Tabelle gezeigt ist.

Teilchendichte 30 40 60 80 100 120 140 160 180 200
Kumulative Infektionsrate% 3.33 27.5 8.33 40 33 49.17 67.86 70 91.67 96.5

Das heißt, bei einer Dichte von 60 oder weniger tritt keine Infektionsübertragung auf, und die Infektionsübertragung beginnt ab etwa 80 / 200X200, so dass die kumulative Infektionsrate zu steigen beginnt und bei etwa 200 etwa 100% erreicht. Als Beispiel ist die Simulation gezeigt, wenn der Übergangsbereich 140 ist. pNo140_R30sec_IP30%.gif Das Merkmal war ein einzelner Peak, wenn die obige Dichte ausreichend hoch war, aber bei diesem Dichtegrad ist der Peak der infizierten Person sanfter und einige Peaks werden reflektiert, was die Dichteschwankung der Partikelverteilung widerspiegelt. Zeigen. Und der Zustand der Infektionsübertragung kämpft darum, den Bereich zu überwinden, in dem die Dichte niedrig ist, und es ist ersichtlich, dass ** manchmal die Infektion nicht übertragen werden kann, wenn zu viel Platz vorhanden ist **. Mit anderen Worten, die Politik, nicht zu sammeln, hat nicht nur den Effekt, die kumulative Infektionsrate zu senken, indem die Gesamtdichte gesenkt wird **, sondern auch **, indem mit der Politik gehandelt wird, nicht lokal zu sammeln, ist die Wahrscheinlichkeit einer Infektion Dies bedeutet, dass es abgesenkt werden kann **.

・ Abhängigkeit der Partikelbewegung

Als nächstes überprüfen wir, ob ** nicht ausgehen ** korrekt ist. Vorerst haben wir untersucht, wie sich dieser Effekt auf die Infektionsübertragung und die kumulative Infektionsrate auswirkt, wenn die Partikelbewegung groß ist. Wenn die Teilchendichte 120 beträgt, sind die Ergebnisse in der folgenden Tabelle gezeigt.

Partikelbewegung 0 1 2 3 4 8 16
Kumulative Infektionsrate% 10 49.17 54.17 83.33 79.17 65.83 74.17

Nach dieser Bewertung gibt es bei dieser Dichte im stationären Zustand fast keine Infektion. Andererseits ist zu sehen, dass die kumulative Infektionsrate bei Partikelbewegung zunimmt und die kumulative Infektionsrate mit zunehmender Intensität tendenziell zunimmt. Man kann sich vorstellen, dass dies einfach die Lücke überwindet, die die Übertragung von Infektionen durch körperliche Betätigung behindert, wie oben beschrieben. Ein typisches Beispiel für eine tatsächliche Simulation ist wie folgt. pNo1203_R30sec_IP30%.gif Wie Sie sich aus dieser Simulation vorstellen können, können Sie sehen, dass sich die Infektion über einen etwas großen Raum ausgebreitet hat. Mit anderen Worten, es ist ersichtlich, dass ** nicht ausgehen ** auch das Infektionsrisiko senkt. Dieses sich bewegende Teilchenmodell kann auch simuliert werden, indem verschiedene Situationen betrachtet werden, die die reale Welt imitieren, aber diesmal ist es bis zu diesem Punkt.

Zusammenfassung

・ Ich habe versucht zu spielen, indem ich eine Koronainfektion simuliert habe ・ ** Die Schlussfolgerung ist, dass, wenn sich Menschen nicht versammeln und die Infektionsrate durch gutes Händewaschen und Masken auf ein bestimmtes Niveau (3% oder weniger in dieser Simulation) gesenkt werden kann, die Übertragung der Infektion selbst verhindert werden kann ** Erhalten ・ Es wurde festgestellt, dass es einige Zeit dauert, bis die Infektion beendet ist, wenn die Infektionsrate verringert wird, indem nicht gesammelt, maskiert, Hände gewaschen usw. wird. Die kumulative Infektionsrate kann jedoch verringert werden. ・ Als Überprüfung der Auswirkung des Nichtausgehens wurde festgestellt, dass die kumulative Infektionsrate beim Training zunimmt. ・ Bei hoher Dichte ähnelt die Transmission der Ausbreitung von Wellen, durch die Wassertropfen fallen. ・ Wenn es eine geringe Dichte, aber eine Übertragung von Infektionen gibt, wird sich der Bereich, in dem geheilte und nicht infizierte Personen koexistieren, ausdehnen. Dieser Bereich ist jedoch robust gegen Infektionen und kann als Massenimmunzustand bezeichnet werden.

・ Wenn diese Simulation in größerem Maßstab durchgeführt wird, kann sie erweitert werden, um eine tatsächliche Stadt zu imitieren. Daher werde ich versuchen, mit etwas höherer Feuerkraft zu rechnen. Übrigens habe ich diesmal Jetson-nano verwendet, aber ich konnte problemlos bis zu 1000 berechnen.

Recommended Posts

[Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬
[Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬ Teil 2
[Einführung in AWS] Ich habe versucht, mit der Sprach-Text-Konvertierung zu spielen ♪
[Einführung in Pandas] Ich habe versucht, die Austauschdaten durch Dateninterpolation zu erhöhen ♬
[Einführung in das Modell der Infektionskrankheiten] Ich habe versucht, zu passen und zu spielen ♬
Ich habe versucht, die Blasensortierung nach Sprache zu programmieren
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich habe versucht, Drachenkugeln nach Adalin zu klassifizieren
[Einführung in PID] Ich habe versucht, ♬ zu steuern und zu spielen
[Einführung in AWS] Ich habe versucht, eine Konversations-App zu portieren und mit text2speech @ AWS playing zu spielen
[Einführung in Docker] Ich habe versucht, verschiedene Docker-Kenntnisse zusammenzufassen, die durch das Studium gewonnen wurden (Windows / Python).
Ich habe versucht zu debuggen.
[Einführung in Pytorch] Ich habe versucht, Cifar10 mit VGG16 ♬ zu kategorisieren
[Einführung] Ich habe versucht, es selbst zu implementieren, während ich den Dichotomiebaum erklärte
[Einführung] Ich habe versucht, es selbst zu implementieren, während ich erklärte, um die Dichotomie zu verstehen
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, PredNet zu lernen
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, die Videoerstellung durch parallele Verarbeitung zu beschleunigen
Ich habe versucht, PCANet zu implementieren
Einführung in die nichtlineare Optimierung (I)
[Django] Ich habe versucht, Zugriffsbeschränkungen durch Klassenvererbung zu implementieren.
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Ich habe versucht, MNIST nach GNN zu klassifizieren (mit PyTorch-Geometrie).
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
Mongodb Kürzeste Einführung (3) Ich habe versucht, sogar Millionen zu beschleunigen
Ich habe versucht, SparseMatrix zusammenzufassen
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
Aktienkurs mit "neuer Corona" gesunken? Ich habe versucht, den durchschnittlichen Aktienkurs von Nikkei durch Web-Scraping zu ermitteln
Ich habe versucht, einen einfachen Kredit-Score mit logistischer Regression zu erstellen.
[Systemhandel] Ich habe versucht, mit dem zerlegten stochastischen Oszillator mit Python ♬ zu spielen
Ich habe versucht, den Getränkepräferenzdatensatz durch Tensorzerlegung zu visualisieren.
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe versucht, die Satzklassifizierung durch Self Attention mit PyTorch zu implementieren
Ich habe versucht, die Befehle zusammenzufassen, die Anfängeringenieure heute verwenden
Ich ließ RNN Sin Wave lernen und versuchte vorherzusagen
Ich habe versucht, Boeing die Geigenleistung durch Posenschätzung vorzustellen
Ich habe versucht, das Schichtplanungsproblem mit verschiedenen Methoden zu lösen
Ich habe versucht, Deep VQE zu implementieren
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, Python zu berühren (Installation)
Einführung in verallgemeinerte Schätzungsgleichungen durch Statistikmodelle
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe versucht, Pytorchs Datensatz zu erklären
Ich habe Watson Voice Authentication (Speech to Text) ausprobiert.
Ich habe Teslas API berührt
Ich habe versucht, mich über MCMC zu organisieren.
Ich habe versucht, Realness GAN zu implementieren
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
[Einführung in das Modell für Infektionskrankheiten] Globaler Infektionsstatus aus Sicht von MACD ♬
Ich habe versucht, das Bild durch Klicken mit der rechten und linken Maustaste in den angegebenen Ordner zu verschieben