(3) 下层接触层采用SIR模型传播疾病。从2000个节点中随机选择2个节点作为初始感染源,将他们的疾病状态设置为I态(上层信息状态设置为A态),其余节点的疾病状态为S态(上层信息状态设置为U态)
时间: 2024-03-02 09:49:22 浏览: 12
好的,按照您的要求,我将在下层接触层使用SIR模型来模拟疾病传播。在这个模型中,每个节点可以处于三种状态之一:易感(S)、感染(I)或恢复(R)。
在开始模拟之前,我们需要将两个随机选择的节点设置为感染状态(I),其余节点设置为易感状态(S)。在信息层中,我们可以使用"A"和"U"表示节点的活跃状态和不活跃状态。
``` python
import random
# 定义节点个数和平均度
n = 2000
k_info = 20
k_contact = 10
# 计算连接概率
p_info = k_info / (n-1)
p_contact = k_contact / (n-1)
# 生成信息层ER网络
info_net = nx.Graph()
for i in range(n):
for j in range(i+1, n):
if random.random() < p_info:
info_net.add_edge(i, j)
info_net.nodes[i]['state'] = 'U' # 初始状态为不活跃
info_net.nodes[j]['state'] = 'U' # 初始状态为不活跃
# 生成接触层ER网络
contact_net = nx.Graph()
for i in range(n):
for j in range(i+1, n):
if random.random() < p_contact:
contact_net.add_edge(i, j)
contact_net.nodes[i]['state'] = 'S' # 初始状态为易感(S)
contact_net.nodes[j]['state'] = 'S' # 初始状态为易感(S)
# 随机选择两个节点作为初始感染源
init_infected = random.sample(range(n), 2)
for i in init_infected:
contact_net.nodes[i]['state'] = 'I' # 初始状态为感染(I)
```
现在,我们已经设置好了初始状态。接下来,我们可以开始模拟疾病传播。在SIR模型中,每个节点的状态会随着时间而改变,直到所有节点都处于恢复状态(R)。
``` python
# 定义SIR模型参数
beta = 0.3 # 感染率
gamma = 0.1 # 恢复率
t = 0 # 记录时间步数
# 开始模拟
while True:
# 记录当前状态
s_count = 0
i_count = 0
r_count = 0
for i in range(n):
if contact_net.nodes[i]['state'] == 'S':
s_count += 1
elif contact_net.nodes[i]['state'] == 'I':
i_count += 1
else:
r_count += 1
print(f"t={t}: S={s_count}, I={i_count}, R={r_count}")
# 检查是否所有人都已经恢复
if i_count == 0:
break
# 更新每个节点的状态
for i in range(n):
if contact_net.nodes[i]['state'] == 'S':
# 当前节点为易感状态,尝试感染它的邻居节点
neighbors = list(contact_net.neighbors(i))
for j in neighbors:
if contact_net.nodes[j]['state'] == 'I' and random.random() < beta:
contact_net.nodes[i]['state'] = 'I' # 节点被感染
break
elif contact_net.nodes[i]['state'] == 'I':
# 当前节点为感染状态,尝试让它恢复
if random.random() < gamma:
contact_net.nodes[i]['state'] = 'R' # 节点恢复
t += 1
```
在上面的代码中,我们使用了一个while循环来模拟疾病传播。每次循环中,我们首先记录当前时刻每个节点的状态,然后更新每个节点的状态。具体来说,我们首先检查每个易感节点的邻居节点是否处于感染状态,如果是,则尝试以一定概率感染当前节点。然后,我们检查每个感染节点是否恢复,如果是,则将其状态设置为恢复状态。最后,我们增加时间步数并继续循环,直到所有节点都处于恢复状态。
请注意,由于这是一个随机过程,每次运行的结果可能会有所不同。