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

Diesmal ist es eine Fortsetzung von Simulation zusammengefasst am 18. März. Eigentlich fühlte ich mich fertig, aber als ich darüber nachdachte, musste ich mich eingehender mit den folgenden zwei Punkten befassen. ① Infektionsübertragung, die vom SIR-Modell nicht erklärt werden kann ② Ausbreitung, wenn sie in einem Cluster auftritt Mit anderen Worten, in (1) wird bei Betrachtung des Übergangs der Anzahl von Infektionen in dem vorherigen partikeldichteabhängigen Übergangsbereich der Peak der Anzahl von Infektionen in mehrere unterteilt, was durch das SIR-Modell nicht erklärt werden kann. Außerdem treten reale Infektionen häufig in Clustern auf und scheinen irgendwie nicht monoton übertragen zu werden. Diesmal haben wir also Folgendes implementiert. ・ Übertragung der Infektion im Bereich der kritischen Dichte ・ Übertragung, wenn die Verteilung der Suszeptibilitätsträger in Clustern verteilt ist Der Code ist fast derselbe wie der vorherige, wurde jedoch erweitert, um die Verteilung und die Anfangswerte der Anfälligkeitsinhaber zu beschleunigen. Ich werde den Code als Bonus setzen.

・ Übertragung der Infektion im Bereich der kritischen Dichte

Wenn die Suszeptibilitätsinhaber wie in der vorherigen Zeit zufällig und gleichmäßig verteilt sind ① Infektionsbereich; Rc ② Infektionswahrscheinlichkeit; p ③ Dichte der Anfälligkeitsinhaber, d ④ Bewegungsgeschwindigkeit des Suszeptibilitätshalters; mr Kann geändert werden, um die Übertragungsübertragung und die Infektionsrate zu steuern.

Typische Übertragung

Die Abbildung rechts ist blau, Anzahl anfälliger Träger, rot, infiziert, grün, Heiler, und diese Grafik ist ein bekanntes Bild im SIR-Modell, das Sie häufig sehen. Parameter: ①Rc = 20 × 20, ②p = 0,05, ③d = 1000/200 × 200, ④mr = 1,0 rc=400p=0.05_600.gif

Kritische Übertragung

Wenn die Infektionswahrscheinlichkeit wie folgt verringert wird, erfolgt die Übertragung der Infektion nicht bald. Die Übertragung von Infektionen kurz davor kann mit den folgenden Parametern realisiert werden. Dies entspricht der folgenden Gif-Animation.

Parameter: ①Rc = 20 × 20, ②p = 0,0075, ③d = 1000/200 × 200, ④mr = 1,0

rc=400p=0.0075_2_600.gif Wie aus dieser Figur ersichtlich ist, befindet sich diese Ausbreitung, wie in der Abbildung rechts gezeigt, in einem Bereich, der vom SIR-Modell nicht mehr dargestellt werden kann, und es ist ersichtlich, dass die Ausbreitung wahrscheinlich auftritt. In dieser Figur steigt der Anstieg exponentiell an, aber danach erfolgt die Übertragung und Heilung durch langsames Ziehen am Schwanz.

Parameter: ①Rc = 13 × 13, ②p = 0,03, ③d = 1000/200 × 200, ④mr = 1,0

Eine kritische Übertragung der Infektion konnte erreicht werden, selbst wenn der Infektionsbereich verringert wurde, und die Ergebnisse waren wie folgt. rc=169p=0.03_600.gif In dieser Gif-Animation verschwindet der exponentielle Anstieg bereits zu Beginn, steigt langsam an, nimmt schäbig ab und nimmt wieder zu. Die Übertragung der Infektion in dieser Region hängt daher von der Verteilung der anfälligen Träger ab und kann als nahezu probabilistischer Prozess bezeichnet werden.

・ Übertragung bei Verteilung in Clustern

Bei der tatsächlichen Verteilung wird angenommen, dass die Bevölkerungsdichte normalerweise in jedem Dorf oder jeder Stadt schwankt oder dass die Verteilung bei jeder Versammlung oder Versammlung von Menschen schwankt. Also habe ich versucht, die Infektion zu verbreiten, wenn die Verteilung der Suszeptibilitätsträger in einem Cluster verteilt ist.

Wenn Cluster dicht vorhanden sind

Dieses Mal haben wir der Einfachheit halber zunächst die Übertragung von Infektionen in Clustern untersucht, die auf einem 10x10-Gitter verteilt sind.

Parameter: ①Rc = 20x20, ②p = 0,5, ③d = 100x10 / 200x200, ④mr = 1,5

Die Bedeutung von d = 100x10 / 100x100 bedeutet, dass 100 Cluster im Bereich von 200x200 platziert werden und 10 Empfindlichkeitshalter an jedem Punkt des Gitters platziert werden, wie in der folgenden Abbildung gezeigt. cluster_1.5_600.gif Mit diesem Parameter ist die Infektionsübertragung eine Region, die durch das SIR-Modell ausgedrückt werden kann, das der gleichmäßigen Verteilung entspricht.

Parameter: ①Rc = 20x20, ②p = 0,5, ③d = 100x10 / 200x200, ④mr = 1,25

Wenn die Geschwindigkeit des zufälligen Gehens des Anfälligkeitsinhabers abnimmt, nimmt die Kontaktwahrscheinlichkeit mit der infizierten Person ab, und die Übertragung zwischen Clustern erfolgt abhängig von der Infektion durch den Anfälligkeitsinhaber wie folgt, und das Folgende ist nicht möglich. Regelmäßige Ausbreitung erfolgt. c1.25_600.gif

Parameter: ①Rc = 20x20, ②p = 0,5, ③d = 100x10 / 200x200, ④mr = 1,09

Und die Geschwindigkeit um 1,09 ist die Grenze dafür, ob sie kritisch ist und sich ausbreitet. c1.09_600.gif Und wenn die Geschwindigkeit niedriger ist, verschwindet die Ausbreitung. Mit anderen Worten, es wird nicht infiziert. Vor der Infektion stoppt die Übertragung bei der ersten infizierten Person oder mindestens einem der benachbarten Cluster.

Wenn Cluster spärlich sind

Was ist, wenn die Cluster größer und getrennt sind? Das heißt, das Bild ist, wenn große Dörfer verstreut sind.

Parameter: ①Rc = 20x20, ②p = 0,5, ③d = 4x250 / 200x200, ④mr = 10

Die Bedeutung von d = 4x250 / 100x100 bedeutet, dass 200x200 mit Clustern gepunktet ist, die jeweils vier 250 Suszeptibilitätsträger enthalten. rc=400p=0.5mr=10_600_1.gif In diesem Fall kollabiert es aufgrund der Verteilung der Cluster ein wenig, wird jedoch vorerst zu einem einzelnen Peak.

Parameter: ①Rc = 20x20, ②p = 0,5, ③d = 4x250 / 200x200, ④mr = 7,5

Bei dieser Clusterverteilung ergibt dieser Parameterbereich eine kritische Ausbreitung im Sinne einer Ausbreitung zwischen Clustern. rc=400p=0.5mr=7.5_600_1.gif

Wenn der Cluster dünn ist und die anfänglich infizierte Person auf der unteren Seite ungleichmäßig verteilt ist und die Geschwindigkeitsverteilung ungleichmäßig ist

Es sieht aus wie eine komplizierte Einstellung, wenn es in Buchstaben geschrieben ist, aber es scheint in der Realität möglich zu sein.

Parameter: ①Rc = 20x20, ②p = 0,5, ③d = 4x250 / 200x200, ④mr = 7,5, ⑤mx = 1, my = 0,5

Im letzten Parameter (5) wird die Geschwindigkeit in x-Richtung erhöht und die Geschwindigkeit in y-Richtung halbiert. rc=400p=0.5mc=0,-50,mr=7.5vx=1vy=0.5_600_1.gif

Parameter: ①Rc = 20x20, ②p = 0,0075, ③d = 4x250 / 200x200, ④mr = 7,5, ⑤mx = 1, my = 0,75

Wenn Sie die früh infizierte Person von Anfang an in das untere linke Dorf bringen, ist dies wie folgt. Die Infektionswahrscheinlichkeit wird ebenfalls auf einen kleinen Wert von 0,0075 eingestellt (der Wert der kritischen Übertragung einer gleichmäßigen Verteilung). Selbst wenn die Geschwindigkeit in y-Richtung 0,75 beträgt, ist ersichtlich, dass die zum oberen Dorf gehörenden Anfälligkeitsträger kaum infiziert sind. rc=400p=0.0075mc=0,-50,mr=10vx=1vy=0.75_2_600_1.gif In diesem Bereich ist ersichtlich, dass der Übergang der Anzahl der Infektionen sehr strukturiert und kompliziert ist.

Diskussion

Wichtig ist, dass es Bereiche gibt, in denen die Anzahl der schönen Infektionen nicht zunimmt oder abnimmt, wie im SIR-Modell zu sehen ist. Und im Falle einer kritischen Ausbreitung (1) Wenn die Bewegungsgeschwindigkeit infizierter Personen und Anfälligkeitsträger gering ist, wird keine Infektion übertragen. ② Wenn die Infektionsrate gesenkt wird, tritt keine Übertragung der Infektion auf. ③ Wenn die Dichte der Anfälligkeitsinhaber gering ist, wird sie nicht infiziert. Daher ist es gefährlich, infizierte Personen mit anfälligen Trägern zu vermischen. Die Infektionsrate kann durch Verwendung einer Maske (für infizierte Personen) oder Händewaschen (für Anfälligkeitsinhaber) auf 0 reduziert werden. Nun, manche Menschen sind asymptomatisch, daher müssen alle Masken getragen werden. Üben Sie vor allem Maßnahmen, um drei Honige (überfüllt, eng, geschlossen) zu vermeiden, z. B. das Nichtansammeln, da eine Infektion verhindert werden kann, indem die Dichte einfach unter ein bestimmtes Niveau gesenkt wird. Es scheint, dass eine Infektion vermieden werden kann, indem die auf den Straßen genannten Maßnahmen angewendet werden. Schließlich verstehe ich, obwohl in den Berechnungen nicht gezeigt, dass das Konzept der sogenannten Massenimmunität fast bedeutungslos ist, weil es sich ändert, wenn die Dichte und die Infektionswahrscheinlichkeit in diesen Berechnungen einfach geändert werden.

Zusammenfassung

・ Das SIR-Modell scheint nicht im kritischen Ausbreitungsbereich zu gelten ・ Clusterartige Verteilung von Suszeptibilitätsträgern führt zu strukturellen Infektionen ・ Wenn Cluster in Dörfern verteilt sind, ist es unwahrscheinlich, dass eine Übertragung von Infektionen zwischen Dörfern auftritt. ・ Bei kritischer Ausbreitung breitet sie sich nicht aus, wenn die Geschwindigkeit niedrig ist. ・ Das Konzept der Massenimmunität ist bedeutungslos (Änderungen in Abhängigkeit von Infektionswahrscheinlichkeit, Infektionsbereich, Verteilung der Anfälligkeitsträger usw.).

・ Wenn die infizierte Person eine Geschwindigkeit hat, steigt die Infektionsrate natürlich an, aber die Simulation wurde noch nicht abgeschlossen.

Bonus

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import random
import time

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.5 #0.03 #probability of infecion
rc=100 #121 #169 #225 Infektionsbereich Kreisradius^2

start = time.time()

def plot_particle(sk,positions,elt,r,g,b):
    #fig, ax = plt.subplots()
    el_time = time.time()-start
    fig, (ax1, ax2) = plt.subplots(1, 2, sharey=False,figsize=(8*2, 8))
        
    for j in range(0,PARTICLE_NO):
        x=positions[j]["x"]
        y=positions[j]["y"]
        c=positions[j]["c"]
        s = 5**2
        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))
    
    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") #, bottom=b)
    rect3 = ax2.bar(ind+2*width, r,width, color="r") #, bottom=b)
    plt.pause(0.1)
    plt.savefig('./fig/fig{}_.png'.format(sk)) 
    plt.close()
    
#Funktion zur Aktualisierung der Partikelposition
def update_position(positions,velocity):
    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
                #print("inside",i,s,c,k_time-t_time)
                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"])
            #print("4",i,s,c,t_time)
    #print(x0,y0)   
    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 < rc 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 = velocity[j]["x"]+1.085*random.uniform(-1, 1) #Der Koeffizient ist die Größe der Partikelmotilität
        vy = velocity[j]["y"]+1.085*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})
        velocity.append({"x": vx, "y": vy})

    return position, velocity, x0

def count_brg(position):
    r=0
    g=0
    b=0
    for j in range(len(position)):
        if position[j]["c"] == "red":
            r += 1
        elif position[j]["c"] == "green":
            g += 1
        else:
            b += 1
    return r,g,b        

def main():
    #Startzeitmessung
    #start = time.time()
    xy_min, xy_max = -32, 32
    #Anfangsposition jedes Partikels,Geschwindigkeit, personal best,globale Best- und Suchraumeinstellungen
    position = []
    velocity = []  #Erhöhte Nutzungsgeschwindigkeit
    
    #Ausgangsposition,Anfangsgeschwindigkeit
    #position.append({"x": random.uniform(MIN_X, MAX_X), "y": random.uniform(MIN_Y, MAX_Y), "c": "red", "t":0, "flag":1})
    position.append({"x": 0, "y": 0, "c": "red", "t":0, "flag":1}) #Platziere eine infizierte Person in der Mitte (0,0)
    velocity.append({"x": 0, "y": 0}) #Die Anfangsgeschwindigkeit der infizierten Person beträgt 0
    for i in range(0,10): #Ordne 10 Dörfer in x-Richtung an
        for j in range(0,10): #Ordne die Dörfer mit Masche 10 in xy-Richtung an
            for k in range(0,10): #Verteilung von 10 Anfälligkeitsinhabern pro Dorf
                s=k+j*10+i*100;
                position.append({"x": 10+(-100+i*20)+random.uniform(MIN_X/100, MAX_X/100), "y":10+(-100+j*20)+ random.uniform(MIN_Y/100, MAX_Y/100), "c": "blue", "t": 0, "flag":0})
                velocity.append({"x": 0, "y": 0})
    print(len(position))
    sk = 0
    red=[]
    green=[]
    blue=[]
    elapsed_time = []
    while sk < ITERATION:
        position,velocity, x0 = update_position(position,velocity) ######
        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)
        #print("{:.2f}:red_{} green_{} blue_{}".format(el_time,r,g,b))
        plot_particle(sk,position,elapsed_time,red,green,blue)
        if x0==[]:
            break
        sk += 1

    #Zeitmessung beendet
    process_time = time.time() - start
    print("time:", process_time)
    
if __name__ == '__main__':
    main()    

Recommended Posts

[Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬ Teil 2
[Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬
[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 ♬
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
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
Ich habe versucht, die Blasensortierung nach Sprache zu programmieren
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
Ich habe versucht, Hanana Oba und Emiri Otani durch tiefes Lernen zu klassifizieren (Teil 2)
[Einführung in Docker] Ich habe versucht, verschiedene Docker-Kenntnisse zusammenzufassen, die durch das Studium gewonnen wurden (Windows / Python).
[Einführung] Ich habe versucht, es selbst zu implementieren, während ich den Dichotomiebaum erklärte
Ich habe versucht zu debuggen.
Einführung in PyQt4 Teil 1
[Einführung in Pytorch] Ich habe versucht, Cifar10 mit VGG16 ♬ zu kategorisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
[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 1 Ich habe versucht, eine HTML-Seite anzuzeigen, auf der nur "Hallo Welt" steht.
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
Ich habe versucht, die Videoerstellung durch parallele Verarbeitung zu beschleunigen
[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).
Mongodb Kürzeste Einführung (3) Ich habe versucht, sogar Millionen zu beschleunigen
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.
Ich habe versucht, PredNet zu lernen
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, SVM zu organisieren.
Ich habe versucht, PCANet zu implementieren
Einführung in die nichtlineare Optimierung (I)
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, SparseMatrix zusammenzufassen
Einführung in Ansible Teil In'Inventory '
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
Einführung in Ansible Teil ④'Variable '
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, Kanas handschriftliche Zeichenerkennung Teil 1/3 zuerst von MNIST zu machen
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
Einführung in Ansible Teil 2 'Grundlegende Grammatik'
Einführung in Python Hands On Teil 1
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.