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

仿真思路

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

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

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

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

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

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

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

人自身:

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

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

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

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

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

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

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

类图设计

在思路的基础上进行类设计:
疫情模拟——计算机仿真设计_第1张图片

全局设定

  • 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个城市组成的网状结构。
疫情模拟——计算机仿真设计_第2张图片

人的模拟运动通过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

你可能感兴趣的:(艺工交叉)