当前位置: 首页 > news >正文

疫情肆虐下,程序员用代码告诉你为什么千万不要出门!

这两天,一个视频火了起来。

视频地址:

https://www.bilibili.com/video/av86478875/

这是一个使用 Java 语言编写的肺炎仿真程序,从统计学的角度来说,能够从一定程度上模拟新冠肺炎病毒扩散及被控制的趋势。

现在,作者已经将代码开源到 GitHub 上,笔者特此 download 下来与诸君分享。

GitHub 地址:

https://github.com/KikiLetGo/VirusBroadcast

在代码中,我们假定一个城市是一个 600 x 600 的正方型。在这个城市中,每一个人为一个 3*3 大小的圆形的点。在每一个城市中,人口所在位置在统计学上都有相应的规律。在这里,假定城市中有 5000 个人,这 5000 个人以城市中心按照正态分布的方式,随机地分布在城市的各个角落。

城市中人口正态分布情况

代码如下:

Random random = new Random();
int x = (int) (100 * random.nextGaussian() + city.getCenterX());
int y = (int) (100 * random.nextGaussian() + city.getCenterY());
Person person = new Person(city, x, y);

在新型肺炎期间,根据肺炎的信息,我们可以知道,病毒存在潜伏期,医院会对患者进行收治。本文中我们对每一个人的状态进行简化,分为以下四个状态:

  • 正常

  • 潜伏期

  • 确诊

  • 在医院治疗中

其中三个状态中,人是可以自由活动的,当然,关于人的移动,此处的处理逻辑也是简化为一个正态分布的随机移动。以下代码为人随机移动到的目的地的位置:

// 根据流动意愿计算当前人是否需要流动
public boolean wantMove() {
   double value = sig * new Random().nextGaussian() + Constants.u;
   return value > 0;
}
// 计算人流动到的目标位置
double targetX = targetSig * new Random().nextGaussian() + targetXU;
double targetY = targetSig * new Random().nextGaussian() + targetYU;
moveTarget = new MoveTarget((int) targetX, (int) targetY);

除了处理分配位置和随机移动,还有一个被感染的函数。当我们在城市中移动的时候,当周围的人存在携带病毒的人,我们就有一定的概率被感染,以下代码描述了这个过程:

float random = new Random().nextFloat();
if (random < Constants.BROAD_RATE && distance(person) < SAFE_DIST) {
  this.beInfected();
}

当然,医院和国家的响应,会让我们在感染数上升的同时,避免外出,所以在计算人移动的过程中,添加一个辅助变量来表示人外出移动的意愿,随着感染数的上升,人们的移动意愿就会逐渐降低,为了简化程序,笔者在此添加了一个线性变化的流动意愿修改。随着床位被占据得越来越多,人们的流动意愿就越来越低。

public int usedBed() {
  int result = 0;
  for (Bed bed : beds) {
    if (!bed.isEmpty()) {
      result++;
    }
  }
  return result;
}

// 更新流动意向
public void updateU() {
  int subCount = Constants.BED_COUNT / 5;
  int used = usedBed();
  if (used > subCount) {
    Constants.u = -0.99f;
  }
  float mu = 1.98f * used / subCount;
  Constants.u = 0.99f - mu;
}

下列动图就是从最开始很小一部分感染群体在不断地流动中所带来的大规模扩散模拟,当政府进行管控,外出人员大幅减少之后,整个疫情得到了有效的控制的演示,我们可以明确地得出一个结论,那就是「不出门、不串门」是非常行之有效的举措。正如 UP 主在视频最后所说的那句话 —— 「对本次疫情起到主导作用的,恰恰就是我们普普通通的每一个人」。

推荐阅读 


《仿真建模与分析(原书第5版)》

本书对离散事件系统仿真的重要方面进行了阐述,主要内容包括仿真建模入门、复杂系统建模、仿真软件、基础概率知识、仿真模型的建立、输入概率分布的选择、随机数发生器、随机变数的产生、单系统输出数据的分析、不同系统配置的比较、方差的缩减、实验设计与优化,以及基于Agent的仿真和系统动力学等。本书适合作为工程、计算机科学等相关专业的仿真课程教材,也可以供相关专业人士使用。

《Python数据可视化:基于Bokeh的可视化绘图》

在数据分析这个领域,Python有着自身独特的优势,简单易用的特性与强大的开源模块的支持使其成为数据分析领域方便好用的利器。对数据的分析离不开数据的可视化,Bokeh在GitHub上的Stars已经超过了Matplotlib,成为最受欢迎的数据可视化工具。

Bokeh是一个基于D3.js的绘图库,所以其绘图结果可以与Web应用无缝衔接,在实现与读者交互的同时,便于分享、传播。

《Python数据可视化:基于Bokeh的可视化绘图》一书从图形绘制、数据动态展示、Web交互等维度全面讲解Bokeh功能和使用,不含复杂数据处理和算法,深入浅出,适合零基础入门,包含大量案例。

你点的每一个在看,我认真当成了喜欢

相关文章:

  • 双手奉上数据库技术书单,助你玩转数据库的各种技术!
  • TIOBE 2 月编程语言排行榜:Objective-C 的出路在何方?
  • “猿”宵佳节,“猿”来是你。
  • 数据科学家们会被 AutoML 代替吗?
  • 【新书速递】机器学习算法的数学解析与Python实现
  • 【直播预告 】2月10日 两场直播“Flutter技术入门+Linux从业方向扫盲及必读书籍推荐” 等你来!...
  • 柱状图、堆叠柱状图、瀑布图有什么区别?怎样用Python绘制?
  • 【直播预告】2月11日20:00-21:00 “引爆微信群 用社群倍增业绩”扫码即可进入直播间~...
  • 用python数据分析了北京积分落户名单,发现……
  • 中台辨析:架构的演进趋势
  • 【直播预告】2月12日“实体企业如何打造私域流量+企业级业务架构方法与工作”两场直播等你来!...
  • 【直播预告】2月13日 三场科技类大咖直播!带好小板凳,前排等你哦!
  • 只知道云计算很赚钱,但不知道怎么学?
  • 情人节快乐 | 请收下这份礼物
  • 笑死了,程序猿是这么过情人节的
  • 08.Android之View事件问题
  • 345-反转字符串中的元音字母
  • classpath对获取配置文件的影响
  • css的样式优先级
  • java第三方包学习之lombok
  • Linux快速复制或删除大量小文件
  • Objective-C 中关联引用的概念
  • quasar-framework cnodejs社区
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 漂亮刷新控件-iOS
  • 浅谈web中前端模板引擎的使用
  • 悄悄地说一个bug
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我从编程教室毕业
  • 我这样减少了26.5M Java内存!
  • 自制字幕遮挡器
  • Nginx实现动静分离
  • 函数计算新功能-----支持C#函数
  • 交换综合实验一
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • %@ page import=%的用法
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)程序员技术练级攻略
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • ;号自动换行
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @angular/cli项目构建--http(2)
  • @JsonFormat与@DateTimeFormat注解的使用