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.
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.
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
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.
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.
Eine kritische Übertragung der Infektion konnte erreicht werden, selbst wenn der Infektionsbereich verringert wurde, und die Ergebnisse waren wie folgt. 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.
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.
Dieses Mal haben wir der Einfachheit halber zunächst die Übertragung von Infektionen in Clustern untersucht, die auf einem 10x10-Gitter verteilt sind.
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. Mit diesem Parameter ist die Infektionsübertragung eine Region, die durch das SIR-Modell ausgedrückt werden kann, das der gleichmäßigen Verteilung entspricht.
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.
Und die Geschwindigkeit um 1,09 ist die Grenze dafür, ob sie kritisch ist und sich ausbreitet. 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.
Was ist, wenn die Cluster größer und getrennt sind? Das heißt, das Bild ist, wenn große Dörfer verstreut sind.
Die Bedeutung von d = 4x250 / 100x100 bedeutet, dass 200x200 mit Clustern gepunktet ist, die jeweils vier 250 Suszeptibilitätsträger enthalten. In diesem Fall kollabiert es aufgrund der Verteilung der Cluster ein wenig, wird jedoch vorerst zu einem einzelnen Peak.
Bei dieser Clusterverteilung ergibt dieser Parameterbereich eine kritische Ausbreitung im Sinne einer Ausbreitung zwischen Clustern.
Es sieht aus wie eine komplizierte Einstellung, wenn es in Buchstaben geschrieben ist, aber es scheint in der Realität möglich zu sein.
Im letzten Parameter (5) wird die Geschwindigkeit in x-Richtung erhöht und die Geschwindigkeit in y-Richtung halbiert.
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. In diesem Bereich ist ersichtlich, dass der Übergang der Anzahl der Infektionen sehr strukturiert und kompliziert ist.
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.
・ 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.
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()