欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

疫情模拟——计算机仿真设计

程序员文章站 2024-03-17 09:52:52
...

仿真思路

为了对疫情进行模拟,我们需要从实际情况出发,考虑病毒、人、社会等多方面因素对疫情的影响。

病毒的传播途径:
病毒的传播途径为疫情发展的根本,若传播途径受到阻碍则疫情现状会逐渐向人为可控的方向发展,反之疫情将逐步恶化。

  • 患者喷嚏、咳嗽、说话的飞沫,呼出的气体近距离直接吸入导致的感染;
  • 气溶胶传播是指飞沫混合在空气中,形成气溶胶吸入后导致感染;
  • 接触传播是指飞沫沉积在物品表面,接触污染手后,再接触口腔、鼻腔、眼睛等粘膜,导致的感染。

病毒的性质:
病毒的性质将影响人们感染后的状况。

  • 病毒的平均潜伏期是 14 天
  • 它可以在物体-如金属,玻璃或塑料-的表面存活长达9天

有效的阻断病毒传播物资:
充足的物资可以提升当前的医疗状况,使得医院能够正常运行;同时充足的物资可以给人们带来保障,有效预防病毒通过部分传播途径的传播。

  • 口罩
  • 酒精
  • 消毒液
  • 防护服

人自身:

  1. 免疫力
    人的免疫力通常与人的年龄等因素直接关联,一般幼儿与老龄人群的免疫力较差。

  2. 身份
    这里的身份指的是社会身份,在这里可分为两种,包括医生、警察等因工作需求必须外出的人与学生,白领等工作非必须外出者。
    同时考虑到家庭因素,在此也许考虑到家庭中需要去菜场或超市中买菜的人。

  3. 习惯
    洗手、戴口罩等个人习惯直接对病毒的传播产生影响,若是没有好的习惯则可能恶化疫情,随着疫情的发展,这些习惯可能会被广泛普及,因而习惯逐渐变好。

  4. 是否患病状态
    患病状态是每个人的个人属性,作为标记。

  5. 是否发现患病
    若在患病情况发现自己已经患病则有可能会减少自身与他人的接触,并做好自己的防护工作避免传染给他人。

社会:
目前我们看到的一些措施

  • 测体温
  • 推荐自我隔离
  • 社会资助
  • 封城
  • 通行证
  • 医护资源调度
  • 谣言
  • 企业学校延迟开工、线上会议教学等

类图设计

在思路的基础上进行类设计:
疫情模拟——计算机仿真设计

全局设定

  • restrainRate表示对人出行的抑制率,抑制率越高表示人们出门工作、买菜的次数与概率越小。

  • nationState表示当前的国家状态,包括1)返乡高峰;2)返工高峰;3)正常工作。
    若为返乡高峰则人们更有可能从GDP高城市向GDP低城市流动,若为返工高峰则人们更有可能从GDP低城市向GDP高城市流动。

  • medicalResource表示医疗资源情况

  • cities存放City对象所有城市的信息

  • hospitals存放Hospital对象所有城市的信息

  • stations存放Station对象所有城市的信息

  • crosses存放Cross对象所有城市的信息

  • markets存放Market对象所有城市的信息

  • people存放People对象所有人的信息

  • safeDis表示人与人之间的安全距离
    若感染者与健康人在安全距离以内则有更大概率感染。

  • incubationProb与diseaseProb分别表示潜伏未发现"IIU"-潜伏发现"IIF"概率发病未发现"IAU"-发病发现"IAF"概率

  • hospitalCureProb表示发病去过医院治愈概率

  • deHospitalCureProb表示发病没去过医院治愈概率

  • dead记录死亡人数

  • timeRate表示时间倍数

  • dayTime表示时间循环

人的模拟移动

在仿真模拟中我们构建规划了由6个城市组成的网状结构。
疫情模拟——计算机仿真设计

人的模拟运动通过People类与一些关键类实现,其中Hospital Station Cross Market Home分别表示医院、车站、路口、市场、家,均继承自Place地点类。为了使模拟更加贴合实际情况,医院、车站、路口、市场、家在模拟中代表着一些关键地标,用于模拟人的工作、看病、居住、生活情况。

由于人会在特定时期进行城间移动,因此通过车站将城市相连。

人的状态转换

在这里我们选用SIRD作为基础模型,并在此基础上进行扩展。

  • “SH”:未患病且完全健康(绿)
  • “SI”:未患病有疑似状况(黄)
  • “IIU”:感染者潜伏期未发现(黄)
  • “IIF”:感染者潜伏期发现(红)
  • “IAU”:感染者发病期未发现(黄)
  • “IAF”:感染者发病期发现(红)
  • “R”:移出者:不会二次感染(绿)
  • “D”:死亡
def state_s(self):
    """
    未患病者状态转换,包含:
        # "SH":未患病且完全健康(绿)
        # "SI":未患病有疑似状况(黄)
    未患病"SH""SI"到感染"IIU":此时剩余发病天数self.restDay随机更新[7,13]间一个值
        在距离条件self.omg,根据健康指数self.health,医疗资源(全局)和接触的患病者是否发现self.whetherFind是否发现(发现则概率低,未发现则概率高)等判断是否感染,感染就到潜伏期未发现。
    完全健康"SH"到疑似状况"SI":
        根据健康指数计算容易生病概率。
    :return:None
    """
    pass

def state_ii(self):
    """
    感染者状态转换,包含:
        # "IIU":感染者潜伏期未发现(黄)
        # "IIF":感染者潜伏期发现(红)
    潜伏到发病变化:根据剩余天数self.restDay转换
        潜伏未发现"IIU"-发病未发现"IAU"
        潜伏发现"IIF"-发病发现"IAF"
    :return:None
    """
    pass

def state_iu(self):
    """
    感染者状态转换,包含:
        # "IIU":感染者潜伏期未发现(黄)
        # "IAU":感染者发病期未发现(黄)
    未发现到发现变化:通过全局概率计算(每隔一定时间计算一次)
        潜伏未发现"IIU"-潜伏发现"IIF"
        发病未发现"IAU"-发病发现"IAF"
        全局incubationProb = None  # float:潜伏未发现"IIU"-潜伏发现"IIF"概率
        全局diseaseProb = None     # float:发病未发现"IAU"-发病发现"IAF"概率
    :return: None
    """


def state_l(self):
    """
    发病者到移出转换,可死亡包含:
    # "IAU":感染者发病期未发现(黄)
    # "IAF":感染者发病期发现(红)
    根据未去医院情况治愈天数self.cureDay与是否去过医院self.whetherHospital进行更新

    # "R":移出者:不会二次感染(绿)
    # "D":死亡

    :return:None
    """
    pass


def state_switch(self):
    """
    状态转换总控制函数,结合state_s,state_ii,state_iu,state_l
    :return:None
    """
    pass
相关标签: 艺工交叉