网络传播模型Python代码实现

⽹络传播模型Python代码实现SI模型
import numpy as np
import matplotlib.pyplot as plt
import smallworld as sw
#邻接矩阵
a = sw.a
# 感染
beta = sw.beta
#初始患者
origin = sw.origin
def si_(a, beta, origin):
#总⼈数
n = a.shape[0]
#控制符
judge = 1
#未感染⼈
s = np.arange(n)
s = np.delete(s, origin)
#上⼀轮或原先感染⼈
i = origin
r = []
#感染时间记录
t = []
#感染⼈数记录
speed = []
#计时器
h = 0
#总感染者
infected = i
#开始传播
while judge == 1:
temp_i = []
#感染⼈数
m = len(infected)
for j in range(0, m):
node = int(infected[j])
asd = []
for k in range(0, n):
if a[node, k] == 1:
asd.append(k)
#感染者邻接的未感染者
asd2 = np.intersect1d(asd, s)
#随机⽣成被感染率
num = np.random.rand(len(asd2)) - beta
#该感染者传播的新感染者
asd_final =[]
for k in range(0, len(asd2)):
if num[k] <= 0:
asd_final.append(asd2[k])
#这⼀轮总的新感染者
temp_i = np.union1d(temp_i, asd_final)
s = np.setdiff1d(s, asd_final)
if len(i) > 0:
for k in range(0, len(i)):
r.append(i[k])
t.append(h)
#新⼀轮感染⼈
i = temp_i
infected = np.union1d(infected, i)
#所有⼈都被感染则跳出循环
if len(s) == 0:
judge = 0
if len(i) > 0:
for k in range(0, len(i)):
r.append(i[k])
t.append(h)
speed.append(len(r))
天下第一大火锅
h = h+1
coverage = r
for j in range(h, 2*h):
speed.append(speed[j-1])
print(speed)
plt.plot(speed, "-ro", label='Infectious')
plt.title('SI')
plt.legend()
si_(a, beta, origin)
效果图:
SIR模型
import numpy as np
import matplotlib.pyplot as plt import smallworld as sw
#邻接矩阵
a = sw.a
#感染率
浙江省湖州市织里镇beta = sw.beta
#复原率
gama = sw.gama
生产性活动#初始患者
origin = sw.origin
def sir_(a, origin, beta, gama): #总⼈数
n = a.shape[0]
#控制符
judge = 1
#未感染⼈
s = np.arange(n)
s = np.delete(s, origin)
# 未感染⼈数记录
snum = list()
snum.append(len(s))
#感染⼈
i = origin
#感染⼈数记录
inum = list()
inum.append(len(i))
#复原⼈
r = []
#复原⼈数记录
rnum = list()
rnum.append(0)
#计时器
h = 1
冠名
#开始传播
while judge ==1:
#新⼀轮感染者
temp_i = []
m = len(i)
for j in range(0, m):
#感染者
node = int(i[j])
asd = []
for k in range(0, n):
if a[node, k] == 1:
asd.append(k)
#未被感染者且不为复原者
asd2 = np.intersect1d(asd, s)
asd2 = np.setdiff1d(asd2, r)
num = np.random.rand(len(asd2)) - beta #新感染者
asd_final = []
for k in range(0, len(asd2)):
if num[k] <= 0:
asd_final.append(asd2[k])
temp_i = np.union1d(temp_i, asd_final)            s = np.setdiff1d(s, asd_final)
#复原
num = np.random.rand(m) - gama
asd = []
asd_final = []
for k in range(0, m):
if num[k] <= 0:
asd.append(k)
asd_final.append(i[k])
中国青年创业国际计划
#原感染者部分复原
r = np.union1d(r, asd_final)
i = np.delete(i, asd)
#这⼀轮后总感染者
i = np.union1d(i, temp_i)
snum.append(len(s))
inum.append(len(i))
rnum.append(len(r))
h = h + 1
if len(i) == 0:
judge = 0
for j in range(h, h*2):
snum.append(snum[j-1])
inum.append(inum[j - 1])
rnum.append(rnum[j - 1])
plt.plot(snum, "-bo", label='Susceptibles')
plt.plot(inum, "-ro", label='Infectious')
plt.plot(rnum, "-go", label='Recovereds')
plt.title('SIR')
plt.legend()
plt.show()
sir_(a, origin, beta, gama)
效果图:
SIS模型
import numpy as np
import matplotlib.pyplot as plt
import BA
import random
#邻接矩阵
a = BA.a
#感染率
beta = 0.6
#复原率
gama = 0.3
#初始感染者
origin = random.sample(range(0, a.shape[0]), 5) def sis_(a, origin, beta, gama):
#总⼈数
n = a.shape[0]
#未感染⼈
s = np.arange(n)
s = np.delete(s, origin)
#感染⼈
i = origin
#感染⼈数记录
speed = []
speed.append(len(i))
#计时器
h = 1
while h < 70:
temp_i = []
m = len(i)
for j in range(0, m):
node = int(i[j])
asd = []
for k in range(0, n):
if a[node, k] == 1:
asd.append(k)
asd2 = np.intersect1d(asd, s)
num = np.random.rand(len(asd2)) - beta            asd_final = []
for k in range(0, len(asd2)):
if num[k] <= 0:
asd_final.append(asd2[k])
temp_i = np.union1d(temp_i, asd_final)            s = np.setdiff1d(s, asd_final)
num = np.random.rand(m) - gama
asd = []
asd_final = []
for j in range(0, m):
if num[j] <= 0:
asd.append(j)
asd_final.append(i[j])
s = np.union1d(s, asd_final)
i = np.delete(i, asd)
i = np.union1d(i, temp_i)
speed.append(len(i))
基础教育论坛h = h + 1
snum = []
for j in range(0, h):
snum.append(n - speed[j])
plt.plot(speed, "-ro", label='Infectious')
plt.plot(snum, "-bo", label='Susceptibles')
plt.title('SIS')
plt.legend()
plt.show()
sis_(a, origin, beta, gama)
效果图:
LT模型
import numpy as np
import smallworld as sw
import networkx as nx
import matplotlib.pyplot as plt
#邻接矩阵
a = sw.a
#节点度数, 1/b是其他节点对该节点的影响⼒
b = sw.b
#节点阀值
beta = sw.beta
#原激活节点
origin = sw.origin
#超过beta(如50%)的邻接节点处于激活状态,该节点才会进⼊激活状态def lt_(a, b, origin, beta):
#节点数
n = a.shape[0]
#控制符
judge = 1
#未激活节点
s = np.arange(n)
s = np.delete(s, origin)
#激活节点
i = origin
while judge == 1:
#该轮激活节点
temp_i = []
#激活节点个数
m = len(i)
for j in range(0, m):
node = int(i[j])
asd = []
for k in range(0, n):
if a[node, k] == 1:
asd.append(k)
#到相邻的未激活节点
asd2 = np.intersect1d(asd, s)
asd_final = []
for k in range(0,len(asd2)):
num = 0
#该未激活节点相邻的激活节点个数
for t in range(0, m):
if a[int(i[t]), asd2[k]] == 1:
num = num + 1
if 1 / b[asd2[k]] * num >= beta:
asd_final.append(asd2[k])

本文发布于:2024-09-23 16:23:03,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/369888.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:节点   感染者   感染   记录   传播
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议