2020年爆发新型冠状病毒,让大家在见证中国的团结也让大家感受到疫情传播的骇人

在这里先道一声“武汉加油、中国加油”

那么现在我们尝试制作一个模拟疫情爆发的模型,以数字的形式展现疫情爆发点恐怖。

(1)模型设计

解释人类模型,每个人属性分为编号、状态、保护措施、外出情况。

编号:作为区分每个人类模型的标识;

状态:分为两部分,0为健康,1为感染;

保护措施:参考状态也份为两部分,0为未采取保护措施,1为保护措施

外出情况:外出情况为1的将会选择外出寻友,而为0则不会外出。

程序初期,将会生成一定数量的人类模型,然后随机选择百分之五(感染人数>1)的人作为感染体。

模拟开始,将会开始记录每天的感染人数,然后随机选择一定数量的人外出,每个外出的人都会选择一个人进行交流。

交流过程中,若两个人均感染或均为感染则无问题,若一人感染则根据瘟疫感染几率和防护措施进行随机判定是否感染。

结束条件为全部模型的98%的人被感染,记录天数。

效果如下图所示:

(2)程序设计

首先,要获取实验信息,所以先创建获取信息函数(get_info)

其次,要通过获取的信息来创建对应模型,所以要有创模函数(creat_mod)

然后,就是模拟实验发生的感染函数(experiment)

最后,为方便判断是否发生了感染,创建了感染函数(contagion)

由于实际情况需要所以还要制作选择函数来实现概率随机。

根据之前的需求和实际情况考虑创建了全局变量。

(3)程序实现

项目名称:瘟疫实验室

开发工具:sublime_text

开发模块:random

1.前期准备

在这一部分中,将要根据情况,创建好全局变量并声明函数。

个人推荐前期赋初值的时候设置为实验数据,这样可以避免前期调试程序频繁输入。

代码如下所示:

import random as r
#实验模型
human=[]
#实验人数
hunman_number=-1
#感染概率
infected=0
#保护措施
protect=0
#采取保护措施
human_protect=0
#每天外出人数
human_out=0
#保护者id
protect_id=[]
#外出者id
out_id=[]
#所有人id
human_id=[]
#感染者id
virus_id=[]
#函数,收集信息
def get_info():
pass#函数,创建模型
def creat_mod():
pass
#函数,实验
def experiment():
pass#函数,判断是否感染
def contagion(id_1,id_2) :
pass#函数,选择函数
def pick(contagion_p):
pass#主函数
def main():
get_info()
creat_mod()
experiment()
#程序入口
if __name__ == '__main__':
main()

2.收集信息实现

在收集信息函数中,将要实现收集实验参数的作用,而实验参数为全局变量,要想实现收集信息就需要通过关键字global。

关键字global的作用可以在函数内对全局变量进行修改。

函数内操作就是通过input函数来实现数据的接收,难度比较低只需要需要注意两方面即可。

一方面是数据类型,input函数所接受的数据默认为字符串类型,所以要对数据进行类型转化,可以考虑eval()函数

考虑到数据的限制,所以最后采用强转int() 和float()

另一方面则是数据的合理性,比如感染几率为0~1,所以超过1即为数据错误,又或者外出人数超过实验总人数等等。

为避免这一情况,所以输入一个数据就对进行判断。

实现代码如下:

#函数,收集信息
def get_info():
print("*********************")
#global改变全局变量
global hunman_number,infected,protect,quarantine,human_out,human_protect
#实验人数
hunman_number=int(input("实验人数:"))
#感染概率
infected=float(input("疾病感染概率(0~1):"))
if infected>1 or infected<0:
print("感染概率在0到1之间")
get_info()
#保护措施有效性
protect=float(input("保护有效性(0~1):"))
if protect>1 or protect<0:
print("保护概率在0到1之间")
get_info()
#采取保护措施人数
human_protect=int(input("采取保护措施人数:"))
if human_protect>hunman_number or human_protect<0:
print("采取措施人数不可超过实验人数")
get_info()
#外出人数
human_out=int(input("每天外出人数:"))
if human_out>hunman_number or human_protect<0:
print("外出人数不可超过实验人数")
get_info()

3.创建模型实现

模型也需要修改一部分全局变量,所以先调用关键字global

第一步:模型的创建先通过循环来创建实验模型,循环条件为实验人数,数据(先设为0)为[id,0,0,0]。

第二步:添加保护措施,原理为随机选择设定的人数的模型,让模型中代表采取保护措施的数值更改为1

随机选择的实现考虑许久,最后选择通过random库中的sample()函数来实现,sample函数的作用为将指定序列进行重新随机排列

其中有两个参数,一个为重排序序列名,另一个代表输出序列的前几个,默认为全部输出。

所以只需要将实验人数的列表传入进行重排序,然后输出前指定人数个即可。

最后通过循环,访问选出的个体,将代表是否采取保护措施的数据更改为1(采取保护措施)

第三步:采用同样的原理选择5%的实验个体作为传染源。注意,感染人数为int类型整数,为保证感染个体不为0,采取5%人+1。

代码实现如下所示:

#函数,创建模型
def creat_mod():
global human,human_id,protect_id,virus_id
#循环创建指定人数的实验个体,并将id存储。
for id in range(0,hunman_number):
#id、state、protect、out
human.append([id,0,0,0])
human_id.append(id)
#采取保护措施人数id的集合,数据为对实验总体进行随机重排列,再选择一定量输出。
protect_id=r.sample(human_id,human_protect)
#循环更改实验个体
for id in protect_id:
#0为未采取保护措施,1为采取保护措施
human[id][2]=1
#原理同上
virus_id=r.sample(human_id,int(human_protect*0.05)+1)
for id in virus_id:
#0为健康,1为感染
human[id][1]=1

4.实验实现

实验的开始要确定结束条件,我们以百分之九十八的人感染视为结束。

确定之后,记录天数要创建一个计数器来存代表天数的变量。

实验采用死循环的方式进行,跳出条件只有一个实验感染人数超过了结束人数,所以需要加入计数器来存感染人数

代表日期的计数器与代表感染人数的计数器不同,日期计数器在程序开始运行的时候,开始计数直到程序结束。

而感染人数计数器每一次循环都要清零重新开始计算,所以日期计数器的声明在死循环外,而感染人数计数器在死循环内。

实验分为两部分,一部分为对之前的总结,另一部分为新的一天开始。

总结当中第一件事情便是清零计数器。

然后通过统计感染人数,原理为for循环所有人的id,加入判断若该id中代表状态的数据为1则代表感染,计数器加一。

最后输出之前一天的情况,第x天,感染人数为x人。

新的一天开始,先判断统计人数有没有超过失败条件,再开始一天的操作。

随机选择指定人数进行外出,参考之前保护措施的原理,根据外出人数随机选择人进行外出,将其数据更改为1。

然后考虑到实际情况,每个人外出都是要去寻找朋友,寻找朋友则是通过random库的choice()函数。

实现代码如下所示:

#函数,实验
def experiment():
global out_id
fail=int(hunman_number*0.98)
print("*****************************")
print("实验开始,失败条件感染人数:",fail)
day=0
while True:
#计数器清零
count=0
#统计感染人数
for i in human_id:
if human[i][1]==1:
count+=1
#外出人数
out_id=r.sample(human_id,human_out)
for id in out_id:
human[id][3]=1
#统计结果
print(day,"天感染人数",count)
#新的一天开始
day+=1
#判断是否继续实验
##实验结束
if count>=fail:
print("gameover->",day)
break
#循环找朋友
for id in out_id:
#随机选择朋友
friend_id=r.choice(human_id)
#若均感染,则跳过
if human[id][1]==1 and human[friend_id][1]==1:
pass
#一方感染
else:
#判断感染
         contagion(id,friend_id)

5.感染判断实现

若发生感染事件,则需要更改实验体数据,所以在这一函数中可以对实验题进行修改,需要引用关键字global。

然后根据情况进行分类,先寻找是哪位感染,哪位健康。然后针对健康的人是否采用保护措施进行分类讨论讨论。

在本模型中,计算感染方式为概率性,由疾病感染概率和保护措施有效性决定。

以0.8感染几率0.7保护措施为例子,保护有效性为0.7所以保护失败的几率为0.3

所以感染疾病几率为0.8感染几率的情况下0.3的保护失效,结果为0.8*0.3。

根据不同的情况变动概率进行概率抽取即可,代码实现如下

#函数,判断是否感染
def contagion(id_1,id_2) :
global human
#感染概率
contagion_p=0
#第一个id为健康
if human[id_1][1]==0:
#采取保护措施
if human[id_1][2]==1:
contagion_p=infected*(1-protect)
#未采取保护措施
else:
contagion_p=infected
#是否感染
human[id_1][1]=pick(contagion_p)
#第二个id为健康的人
else:
if human[id_2][2]==1:
contagion_p=infected*(1-protect)
else:
contagion_p=infected
human[id_2][1]=pick(contagion_p)

但是在random中没有找到合适的方法,所以只能自制一定概率随机抽取函数pick。

6.pick函数实现

一定概率随机抽取函数的实现基于一点:

random.uniform(0,1)->生成0.0到1.0之间的伪随机数,之后循环元素及其概率,计算累积概率.

如:random_pick([1,2,3,4],[0.1,0.2,0.3,0.4])

当x处于0.0到0.1之间,则输出1

当x处于0.1到0.3之间,则输出2

所以实现过程可以利用这一点,通过两个列表将数据一一对应,然后通过zio改为字典。

在通过uniform函数来实现概率选择。实现代码如下所示:

#函数,选择函数
def pick(contagion_p):
#选择
select=[1,0]
#概率
choose=[contagion_p,1-contagion_p]
x = r.uniform(0 ,1)
cumprob = 0.0
for item , item_pro in zip(select , choose):
cumprob += item_pro
if x < cumprob:
break
return item

在主函数中桉顺序调用以上函数即可,这样就初步实现了。

(4)改进与推荐

这个程序是个人处于兴趣创建的小型程序,还有许多可以改进的地方。

1.加入治愈因素,比如每天可以治愈多少人,又或者感染者过多少天可以治愈等情况。

2.加入经济因素,比如治愈者需要成本等等,包括医院体系等等。

3.保护措施丰富化,可以采取不同的措施来更改感染几率。

4.可视化,比如通过更改角色颜色等方式以更加直接的方法显示这一过程。

5.加入大量实验数据,进行数据分析将结果制为图表,然后根据数学方式为抗疫提出有效建议。

Python实战之制作瘟疫传播实验的更多相关文章

  1. python实战--数据结构二叉树

    此文将讲述如何用python实战解决二叉树实验 前面已经讲述了python语言的基本用法,现在让我们实战一下具体明确python的用法 点击我进入python速成笔记 先看一下最终效果图: 首先我们要 ...

  2. 再一波Python实战项目列表

    前言: 近几年Python可谓是大热啊,很多人都纷纷投入Python的学习中,以前我们实验楼总结过多篇Python实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...

  3. 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程

    点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...

  4. zeromq 学习和python实战

    参考文档: 官网 http://zeromq.org/ http://www.cnblogs.com/rainbowzc/p/3357594.html   原理解读 zeromq只是一层针对socke ...

  5. Python实战:美女图片下载器,海量图片任你下载

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  6. Python实战:Python爬虫学习教程,获取电影排行榜

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  7. python实战:用70行代码写了一个山炮计算器!

    python实战训练:用70行代码写了个山炮计算器! 好了...好了...各位因为我是三年级而发牢骚的各位伙伴们,我第一次为大家插播了python的基础实战训练.这个,我是想给,那些python基础一 ...

  8. python实战博客

    2018-10-31 更新Logging日志记录以及异常捕获 感谢廖大教程.Python实战 直接在闲置的服务器上开发.阿里云Centos 6.8 64位. 1 搭建开发环境 Python 环境是Py ...

  9. python实战提升--1

    #python实战提升 1. 如何在列表.字典.集合中根据条件筛选数据? python中for _ in range(10)与for i in range(10)有何区别 下划线表示 临时变量, 仅用 ...

随机推荐

  1. 用@font-face应用自定义字体

    @font-face格式 @font-face { font-family: <YourWebFontName>; src: <source> [<format>] ...

  2. windows cmd下netstat查看占用端口号的进程和程序

    其实很简单,大家可以在cmd窗口 C:\Documents and Settings\Administrator>netstat -help 显示协议统计信息和当前 TCP/IP 网络连接. N ...

  3. SpringBoot项目后台对接微信支付开发——微信统一下单接口开发

    开始没找到微信支付的sdk.自己根据官方给的接口文档纯手写,各种xml转JSON,JSON转xml,加密解密,签名....整个人都是崩溃的 开发的第三天,发现有官方的sdk.心情一下子豁然开朗,整个人 ...

  4. springboot学习笔记:6.内置tomcat启动和外部tomcat部署总结

    springboot的web项目的启动主要分为: 一.使用内置tomcat启动 启动方式: 1.IDEA中main函数启动 2.mvn springboot-run 命令 3.java -jar XX ...

  5. [LC] 318. Maximum Product of Word Lengths

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  6. WebFilter 在springBoot工程中不起作用

    [1]@ServletComponentScan 必须有一个注解将带有@WebFilter的类包含进去. [2]自定义 FiltersConfig extends WebMvcConfigurerAd ...

  7. string删除与查找erase,find

    s.erase( 指针位置 , 删除长度 ) 返回值修改后的string对象引用 find(string, int):第一个参数用来指示要查找的字符,第二个参数用来表示从字符串的何处开始查找子串(默认 ...

  8. maven工程项目依赖爆红,手动导入依然缺少依赖

    1.新建一个工程 2.把依赖添加到新建工程的pom文件 神奇的事情发生了,依赖自动补全!!! 3.点击install 安装一下可能有些依赖会有其他依赖 建议:不要在自己原来的工程上浪费时间,新建工程. ...

  9. [rope大法好] STL里面的可持久化平衡树--rope

    简单用法: #include <ext/rope> using namespace __gnu_cxx; int a[1000]; rope<int> x; rope<i ...

  10. Vuex安装使用

    vuex是以插件的方式存在的. 安装:打开项目的根目录,即package.json所在目录,执行以下命令: npm install vuex --save-dev 背景:小型应用里的每个组件维护着自有 ...