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. 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)
・ Codeerklärung ・ Abhängigkeit von der Infektionsrate ・ Abhängigkeit von der Partikeldichte ・ Abhängigkeit der Partikelbewegung
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
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. 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. ** ** **
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.
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. 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 **.
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. 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.
・ 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.