Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

纠错,完善———by Df #36

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
*.iml
out/
*.class
/bin/
6 changes: 0 additions & 6 deletions .idea/vcs.xml

This file was deleted.

20 changes: 19 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,24 @@
# VirusBroadcast
一个基于java的模拟仿真程序,由于启动的时候时间仓促,数据不足,所以模型和推演过程过于简单,如果有好的想法或者能提供相关数据支持的朋友请提issues。
如果您也是一名java程序员,可以直接修改并给我提交pr,我之前已经启动每日疫情数据的每日抓取工作,希望在疫情结束后有机会通过这些精准的的数据做一个复盘
如果您也是一名java程序员,可以直接修改并给我提交pr,我之前已经启动每日疫情数据的每日抓取工作,希望在疫情结束后有机会通过这些精准的数据做一个复盘

2020.2.6:
病毒变异过程是一个不断适应的过程,可以尝试简单的DNN对病毒进行建模,已经开始着手实施。






*介绍*
- 正常:灰;潜伏:黄;确诊:红;隔离:蓝;死亡:黑;
- 医院:医院左上角坐标,第一个床位的坐标,每列100个床,根据总床位生成列数及总宽度,给每个床位设置好坐标,不会超过最大床位数。获取医院宽度
- 窗体:设置窗体基本参数,用多线程来加载画布。画布:每秒10次的频率进行图像绘制,画出医院方框,医院标题,设置城市中心坐标,根据总人数对人群进行随机分布,所有人的初始状态都是正常,返回人群数组,对所有人依据状态进行上色,给所有人注入灵魂,然后以小点的形式呈现出来
- 注入灵魂:已经隔离或死亡的不再干预,已经确诊的根据死亡率设置死亡时间及死里逃生,根据染病到确诊的时间是否大于医院响应时间来收入医院或者不管,确诊和隔离的人达到死亡时间就判定死亡并归还床位(一直没有住院的则不考虑床位),以平均发病时间随机生成个体发病时间,潜伏期的个体达到这个时间就被确诊,未被隔离的人会正态移动(潜伏和确诊之后来不及隔离的人也在活动),正常及疑似的人在与疑似、潜伏、确诊的人近距离接触会有比较大的概率染病
- 描述区域:总人数,各种状态的人数,总病床,空余病床,急需病床(确诊数-隔离数=?),死亡人数,世界时间
- 设置传染源:添加一个传染源(吃野味中招的人,吃蝙蝠、穿山甲,国家应该把吃野味列入刑法),由于一开始政府没有采取重视,导致海鲜市场及周边群体都成为了传染源



*效果展示*
![Image text](img/0.png)
Binary file added img/0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/City.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
/**
* 城市描述对象
*<hr>
*设置城市的坐标
*
*只包含了坐标
* @ClassName: City
* @Description: 城市描述对象
* @author: Bruce Young
Expand Down
50 changes: 29 additions & 21 deletions src/Constants.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import java.util.Timer;

/**
* 模拟参数
*
Expand All @@ -8,26 +10,32 @@
*/
public class Constants {

public static int ORIGINAL_COUNT = 50;//初始感染数量
public static float BROAD_RATE = 0.8f;//传播率
public static float SHADOW_TIME = 140;//潜伏时间,14天为140
public static int HOSPITAL_RECEIVE_TIME = 10;//医院收治响应时间
public static int BED_COUNT = 1000;//医院床位
/**
* 流动意向平均值,建议调整范围:[-0.99,0.99]
* <p>
* -0.99 人群流动最慢速率,甚至完全控制疫情传播
* 0.99为人群流动最快速率, 可导致全城感染
*/
public static float u = 0.99f;
public static int CITY_PERSON_SIZE = 5000;//城市总人口数量
public static float FATALITY_RATE = 0.50f;//fatality_rate病死率,根据2月6日数据估算(病死数/确诊数)为0.02
public static int DIE_TIME = 100;//死亡时间均值,30天,从发病(确诊)时开始计时
public static double DIE_VARIANCE = 1;//死亡时间方差
/**
* 城市大小即窗口边界,限制不允许出城
*/
public static final int CITY_WIDTH = 700;
public static final int CITY_HEIGHT = 800;
public static int ORIGINAL_COUNT = 50;// 初始感染数量
public static float BROAD_RATE = 0.8f;// 传播率
public static float SHADOW_TIME = 140;// 潜伏时间,14天为140
public static int HOSPITAL_RECEIVE_TIME = 10;// 医院收治响应时间,1天
public static int BED_COUNT = 1000;// 医院床位

// public static int NEED_BED_COUNT = 0;// 急需医院床位
/**
* 流动意向平均值,建议调整范围:[-0.99,0.99]
* <p>
* -0.99 人群流动最慢速率,甚至完全控制疫情传播 0.99为人群流动最快速率, 可导致全城感染
*/
public static float u = -0.99f;
public static int CITY_PERSON_SIZE = 5000;// 城市总人口数量
public static float FATALITY_RATE = 0.50f;// fatality_rate病死率,根据2月6日数据估算(病死数/确诊数)为0.02
public static int DIE_TIME = 100;// 死亡时间均值,10天,从发病(确诊)时开始计时
public static double DIE_VARIANCE = 1;// 死亡时间方差
/**
* 城市大小即窗口边界,限制不允许出城
*
*
*/
public static final int CITY_WIDTH = 700;
public static final int CITY_HEIGHT = 800;//整个窗体的高度


public static Timer timer = new Timer();

}
152 changes: 79 additions & 73 deletions src/Hospital.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,90 +13,96 @@
* @date: 2020年02月02日 20:58
*/
public class Hospital extends Point {
public static final int HOSPITAL_X = 720;
public static final int HOSPITAL_Y = 80;
private int width;
private int height = 600;
public static final int HOSPITAL_X = 720;
public static final int HOSPITAL_Y = 80;
private int width;
private int height = 600;

public int getWidth() {
return width;
}
public int getWidth() {
return width;
}

public int getHeight() {
return height;
}

public int getHeight() {
return height;
}
private static Hospital hospital = new Hospital();

public static Hospital getInstance() {
return hospital;
}

private static Hospital hospital = new Hospital();
private Point point = new Point(HOSPITAL_X, HOSPITAL_Y);// 医院坐标
private List<Bed> beds = new ArrayList<>();

public static Hospital getInstance() {
return hospital;
}
/**
* 获取所有床位
*
* @return
*/
public List<Bed> getBeds() {
return beds;
}

private Point point = new Point(HOSPITAL_X, HOSPITAL_Y);//第一个床位所在坐标,用于给其他床位定绝对坐标
private List<Bed> beds = new ArrayList<>();
// 初始化医院各项参数
private Hospital() {

/**
* 获取所有床位
*
* @return
*/
public List<Bed> getBeds() {
return beds;
}
// 医院矩形所在坐标
// 设置Point
// 第一个床位所在坐标,用于给其他床位定绝对坐标
super(HOSPITAL_X, HOSPITAL_Y + 10);
// 根据床位数量调整医院矩形的大小
// 床位数为0则医院长、宽为0
if (Constants.BED_COUNT == 0) {
width = 0;
height = 0;
}
// 根据医院床位数量计算医院宽度
// 因为高度定了只能装载100个床位
int column = Constants.BED_COUNT / 100;
// 一列的宽度占6个像素
width = column * 6;
// 根据第一个床位坐标初始化其他床位的坐标
// 根据列数,每列100个床位,生成每个床位的坐标
for (int i = 0; i < column; i++) {

private Hospital() {
//医院矩形所在坐标
super(HOSPITAL_X, HOSPITAL_Y + 10);
//根据床位数量调整医院矩形的大小
if (Constants.BED_COUNT == 0) {
width = 0;
height = 0;
}
//根据医院床位数量计算医院宽度
//因为高度定了只能装载100个床位
int column = Constants.BED_COUNT / 100;
width = column * 6;
//根据第一个床位坐标初始化其他床位的坐标
for (int i = 0; i < column; i++) {
for (int j = 10; j <= 606; j += 6) {

for (int j = 10; j <= 606; j += 6) {
Bed bed = new Bed(point.getX() + i * 6, point.getY() + j);
beds.add(bed);
// 超出最大床位数就停止添加
if (beds.size() >= Constants.BED_COUNT) {// 确定医院床位承载数量
break;
}
}

Bed bed = new Bed(point.getX() + i * 6, point.getY() + j);
beds.add(bed);
if (beds.size() >= Constants.BED_COUNT) {//确定医院床位承载数量
break;
}
}
}
}

}
}
/**
* 使用床位
*
* @return
*/
public Bed pickBed() {
for (Bed bed : beds) {
if (bed.isEmpty()) {
return bed;
}
}
return null;
}

/**
* 使用床位
*
* @return
*/
public Bed pickBed() {
for (Bed bed : beds) {
if (bed.isEmpty()) {
return bed;
}
}
return null;
}

/**
* 死亡或痊愈出院空出床位
*
* @param bed
* @return
*/
public Bed returnBed(Bed bed) {
if (bed != null) {
bed.setEmpty(true);
}
return bed;
}
/**
* 死亡或痊愈出院空出床位
*
* @param bed
* @return
*/
public Bed returnBed(Bed bed) {
if (bed != null) {
bed.setEmpty(true);
}
return bed;
}
}
Loading