仿真思路
为了对疫情进行模拟,我们需要从实际情况出发,考虑病毒、人、社会等多方面因素对疫情的影响。
病毒的传播途径:
病毒的传播途径为疫情发展的根本,若传播途径受到阻碍则疫情现状会逐渐向人为可控的方向发展,反之疫情将逐步恶化。
- 患者喷嚏、咳嗽、说话的飞沫,呼出的气体近距离直接吸入导致的感染;
- 气溶胶传播是指飞沫混合在空气中,形成气溶胶吸入后导致感染;
- 接触传播是指飞沫沉积在物品表面,接触污染手后,再接触口腔、鼻腔、眼睛等粘膜,导致的感染。
病毒的性质:
病毒的性质将影响人们感染后的状况。
- 病毒的平均潜伏期是 14 天
- 它可以在物体-如金属,玻璃或塑料-的表面存活长达9天
有效的阻断病毒传播物资:
充足的物资可以提升当前的医疗状况,使得医院能够正常运行;同时充足的物资可以给人们带来保障,有效预防病毒通过部分传播途径的传播。
- 口罩
- 酒精
- 消毒液
- 防护服
人自身:
-
免疫力
人的免疫力通常与人的年龄等因素直接关联,一般幼儿与老龄人群的免疫力较差。 -
身份
这里的身份指的是社会身份,在这里可分为两种,包括医生、警察等因工作需求必须外出的人与学生,白领等工作非必须外出者。
同时考虑到家庭因素,在此也许考虑到家庭中需要去菜场或超市中买菜的人。 -
习惯
洗手、戴口罩等个人习惯直接对病毒的传播产生影响,若是没有好的习惯则可能恶化疫情,随着疫情的发展,这些习惯可能会被广泛普及,因而习惯逐渐变好。 -
是否患病状态
患病状态是每个人的个人属性,作为标记。 -
是否发现患病
若在患病情况发现自己已经患病则有可能会减少自身与他人的接触,并做好自己的防护工作避免传染给他人。
社会:
目前我们看到的一些措施
- 测体温
- 推荐自我隔离
- 社会资助
- 封城
- 通行证
- 医护资源调度
- 谣言
- 企业学校延迟开工、线上会议教学等
类图设计
在思路的基础上进行类设计:
全局设定
-
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