元胞自动机模拟病毒传染(SEIR模型)(Python代码实现)

 👨‍🎓个人主页:研学社的博客 

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🌈3 Python代码实现

🎉4 参考文献


💥1 概述

病毒在人群中的流行以及在信息网络上的蔓延都已经给人们带来了巨大的损失,因此研究病毒的传播机理进而采取措施来有效控制其传播具有重要现实意义。另外,现实生活中大量的社会、生物以及通讯等系统,都可以适当利用复杂网络来描述,复杂网络理论的发展为人们理解病毒的传播特征以及防御其传播提供了新的方法。近年来,借助于复杂网络理论研究病毒传播动力学行为越来越受到人们的关注。随着复杂网络传播动力学研究的逐步深入,在取得丰硕研究成果的同时人们也发现病毒的传播特性将会受到传播延迟、传染媒介、不完全免疫以及网络交通流等传播因素的影响。

本文设置一定大小的人数、四种人群(四种状态)、传染概率、潜伏时间、治愈时间、免疫时间,即可对其进行模拟也可以更改规则和人数、人群,实现自己想要的模拟。

参考文献:

[1]张丽娟,王福昌,李振刚.基于元胞自动机的病毒传播和系统仿真模型[J].系统仿真学报,2021,33(10):2449-2459.DOI:10.16182/j.issn1004731x.joss.21-0131.

根据病毒传播特点及城市空间地图模式,建立了一类易感者,潜伏者,患病者,治愈者,免疫者,病毒传播模型,将环境中的个体看作Agent智能体,根据元胞自动机原理构建病毒传播机制。依据病毒的不同传播特点、不同防控策略对病毒的时空传播进行了仿真,讨论了关键因素对病毒扩散的影响。

📚2 运行结果

部分代码:

# 定义规则
    def next_iter(self):
        # 规则1,易感者
        if self.stage==0:
            probability=random.random()#生成0到1的随机数
            s1_01 = self.s1_0 * k + self.s1_1 * l

            if (s1_01>probability) and (s1_01!=0):
                p1 = random.random()
                if p1>c1:
                    self.stage=1
                else:
                    self.stage=3
            else:
                self.stage = 0
        # 规则2,感染者
        elif self.stage == 1:
            if self.t_ >= t_max:
                self.stage = 2
            else:
                self.t_ = self.t_ + 1
        # 规则3,治愈者(永久免疫规则)
        elif self.stage == 2:
            if self.T_ >= T_max:
                self.stage = 0
            else:
                self.T_ = self.T_ + 1
        # 规则4,潜伏者
        elif self.stage == 3:
            if self.t1_ >= t1_max:
                self.stage = 1  # 转变为感染者
            else:
                self.t1_ += 1

"""细胞网格类,处在一个长cx,宽cy的网格中"""
class CellGrid:

    cells = []
    cx = 0
    cy = 0

    # 初始化
    def __init__(self, cx, cy):
        CellGrid.cx = cx
        CellGrid.cy = cy
        for i in range(cx):
            cell_list = []
            for j in range(cy):
                cell = Cell(i, j, 0)            #首先默认为全是易感者
                if (i == cx/2 and j ==cy/2) or (i==cx/2+1 and j==cy/2) or (i==cx/2+1 and j==cy/2+1):#看26行就可以了
                    cell_list.append(Cell(i,j,1))
                else:
                    cell_list.append(cell)
            CellGrid.cells.append(cell_list)
# 定义规则
    def next_iter(self):
        # 规则1,易感者
        if self.stage==0:
            probability=random.random()#生成0到1的随机数
            s1_01 = self.s1_0 * k + self.s1_1 * l

            if (s1_01>probability) and (s1_01!=0):
                p1 = random.random()
                if p1>c1:
                    self.stage=1
                else:
                    self.stage=3
            else:
                self.stage = 0
        # 规则2,感染者
        elif self.stage == 1:
            if self.t_ >= t_max:
                self.stage = 2
            else:
                self.t_ = self.t_ + 1
        # 规则3,治愈者(永久免疫规则)
        elif self.stage == 2:
            if self.T_ >= T_max:
                self.stage = 0
            else:
                self.T_ = self.T_ + 1
        # 规则4,潜伏者
        elif self.stage == 3:
            if self.t1_ >= t1_max:
                self.stage = 1  # 转变为感染者
            else:
                self.t1_ += 1

"""细胞网格类,处在一个长cx,宽cy的网格中"""
class CellGrid:

    cells = []
    cx = 0
    cy = 0

    # 初始化
    def __init__(self, cx, cy):
        CellGrid.cx = cx
        CellGrid.cy = cy
        for i in range(cx):
            cell_list = []
            for j in range(cy):
                cell = Cell(i, j, 0)            #首先默认为全是易感者
                if (i == cx/2 and j ==cy/2) or (i==cx/2+1 and j==cy/2) or (i==cx/2+1 and j==cy/2+1):#看26行就可以了
                    cell_list.append(Cell(i,j,1))
                else:
                    cell_list.append(cell)
            CellGrid.cells.append(cell_list)

🌈3 Python代码实现

🎉4 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]张丽娟,王福昌,李振刚.基于元胞自动机的病毒传播和系统仿真模型[J].系统仿真学报,2021,33(10):2449-2459.DOI:10.16182/j.issn1004731x.joss.21-0131.

[2]王亚奇. 多传播因素的复杂网络病毒传播及免疫策略研究[D].南京邮电大学,2011. 

传染模型是一种数学模型,通常用于研究疾病如何在人口中传播。在Python中,我们可以使用诸如SimPy、NetworkX等库来模拟这类动态过程。下面是一个简单的SIR(Susceptible-Infected-Recovered)模型Python代码示例: ```python import numpy as np import matplotlib.pyplot as plt import simpy # 定义模型参数 beta = 0.5 # 疾病传播率 gamma = 1 # 治愈率 N = 1000 # 总人数 I0 = 1 # 初始感染者数 def infect(env, infected): while True: with env.timeout(gamma): yield env.timeout infected.recover() def susceptible(env, susceptible, infected): while True: if susceptible == 0: break rate = beta * infected / N delay = env.timeout(np.random.exponential(1/rate)) yield env.timeout, delay susceptible -= 1 infected += 1 # 创建环境并初始化变量 env = simpy.Environment() susceptible_list = [i for i in range(N)] # 易感人群 infected = 0 # 创建感染者进程 infected_process = env.process(infect(env, infected)) # 创建易感人群转换成感染者的过程 for s in susceptible_list: env.process(susceptible(env, s, infected)) # 启动模拟 env.run(until=50) # 运行50个时间单位 # 绘制结果 plt.plot([i for i in range(len(susceptible_list))], susceptible_list) plt.plot([i for i in range(len(susceptible_list), len(susceptible_list)+infected*50, 50], [0] + [i for _ in range(infected)], 'ro') plt.xlabel('Time (days)') plt.ylabel('Number of individuals') plt.title('SIR Model Simulation') plt.legend(['Susceptible', 'Infected']) plt.show()
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值