一、仿真目标
目标系统:每天早上第一节课,学生从宿舍到教室的时间消耗系统
主要研究目标:给出疫情防控常态化场景下的时间开销预估和优化建议
二、 已知条件
- 结合作业一可得表1中不同地点状态下的时间消耗拟合函数。
- 校园地图如图1所示
三、实现过程
该系统目标为实现学生群体日常从宿舍到教室之间时间统筹消耗仿真系统,构建过程采用反推方法。整体流程如图2所示:
以动态图展示整体仿真效果较为清晰,并可视为每个时间点在不同位置的人数是固定的,不同位置状态地点如表2所设。
以7:00~10:00为时间范围,每分钟为间隔,共180分钟,设公寓五、七为初始地点,人数固定(设为2000)。单独个体经历完整过程中,到达不同地点时的时间点加1,离开的时间点减1人,设置总时间线变量Timeline(左侧1表示7:01,180表示10:00)。
针对时间开销预估问题以及不同性别等,将学生设定为包含id、StartTime、sex、floor、leaveTime、allSpendTime等属性的类。以起床时间为StartTime,离开不同地点时间为leaveTime,最终将allSpendTime所有数据求和取平均计算可得学生在整个流程中的平均消耗时间。
最后将Timeline中数据依次传递给图像可展现出动态仿真图。
四、 实验结果
最终每个分钟时间点不同地点状态下的Timeline人数如图3所示。
最终时间开销预估取五次平均如表3所示(单位:分钟)
五次取平均得每天早上第一节课,学生从宿舍到教室的时间平均花费38.82分钟。
五、建议
在疫情防控常态化的场景下,可以尽量采用错高峰就餐外出的方式,减少学生的聚众数量,同时,在疫情严重的时间段,可以采用线上教学,不堂食的策略,减少人员走动,在极端条件下,学生可以足不出户,采用志愿者送餐模式。
附录
Main.m
clc;clear;
close all;
variableInit();
generateStudentNum = 2700;
global studentNum;
global timeFrame;
%1、公寓内男女起床、洗漱时间
wakeupTimeBoy = normrnd(7.633,0.7822,1,generateStudentNum);
wakeupTimeGirl = normrnd(7.567,0.4761,1,generateStudentNum);
washTimeBoy = gamrnd(0.05682,0.05188,1,generateStudentNum);
washTimeGirl = normrnd(0.2886,0.1428,1,generateStudentNum);
timeBoy = sort(wakeupTimeBoy+washTimeBoy);
timeBoy = timeBoy(timeBoy>=7&timeBoy<=10);
timeBoy = timeBoy(1:studentNum);
timeGirl = sort(wakeupTimeGirl+washTimeGirl);
timeGirl = timeGirl(timeGirl>=7&timeGirl<=10);
timeGirl = timeGirl(1:studentNum);
Timeline = zeros(timeFrame,10);%总时间线
for n=1:timeFrame
Timeline(n,5)=studentNum;
Timeline(n,7)=studentNum;
end
for n=1:studentNum
stu(n) = student;
stu(n).id = n;
stu(n).sex = 0;
stu(n).StartTime = timeBoy(n);
stu(studentNum+n) = student;
stu(studentNum+n).id = studentNum+n;
stu(studentNum+n).sex = 1;
stu(studentNum+n).StartTime = timeGirl(n);
end
%2、乘坐电梯
stu = elevator(stu,studentNum);
for n=1:studentNum
[Timeline] = manageTimeline(stu(n),Timeline,5,-1);
[Timeline] = manageTimeline(stu(studentNum+n),Timeline,7,-1);
end
%3、食堂,超市,邮局,路程时间消耗
for n=1:studentNum*2 %食堂直接使用的第一次拟合函数
proba = round(rand());%去1,2食堂概率各为50%
if proba == 0 %先去食堂一
Timeline = manageTimeline(stu(n),Timeline,1,1);
stu(n) = canteenFit(stu(n));
Timeline = manageTimeline(stu(n),Timeline,1,-1);
if unifrnd(0,1)<0.03
Timeline = manageTimeline(stu(n),Timeline,3,1);
stu(n) = marketOrExpress(stu(n));
Timeline = manageTimeline(stu(n),Timeline,3,-1);
end
if unifrnd(0,1)<0.01
Timeline = manageTimeline(stu(n),Timeline,4,1);
stu(n) = marketOrExpress(stu(n));
Timeline = manageTimeline(stu(n),Timeline,4,-1);
end
Timeline = manageTimeline(stu(n),Timeline,6,1);
stu(n) = road(stu(n),6);
Timeline = manageTimeline(stu(n),Timeline,6,-1);
else
if unifrnd(0,1)<0.03
Timeline = manageTimeline(stu(n),Timeline,3,1);
stu(n) = marketOrExpress(stu(n));
Timeline = manageTimeline(stu(n),Timeline,3,-1);
end
if unifrnd(0,1)<0.01
Timeline = manageTimeline(stu(n),Timeline,4,1);
stu(n) = marketOrExpress(stu(n));
Timeline = manageTimeline(stu(n),Timeline,4,-1);
end
Timeline = manageTimeline(stu(n),Timeline,8,1);
stu(n) = road(stu(n),8);
Timeline = manageTimeline(stu(n),Timeline,8,-1);
Timeline = manageTimeline(stu(n),Timeline,2,1);
stu(n) = canteenFit(stu(n));
Timeline = manageTimeline(stu(n),Timeline,2,-1);
Timeline = manageTimeline(stu(n),Timeline,9,1);
stu(n) = road(stu(n),9);
Timeline = manageTimeline(stu(n),Timeline,9,-1);
end
Timeline = manageTimeline(stu(n),Timeline,10,1);
Timeline = manageTimeline(stu(n),Timeline,10,1);
stu(n).allSpendTime = stu(n).leaveTime-stu(n).StartTime;
allTime = allTime + stu(n).allSpendTime;
end
averageSpendTime = (allTime/(studentNum*2))*60
canteenFit.m
function student = canteenFit(student)
canteenWaitingTime = gamrnd(12.2526,3.825)/60;%拟合的等待时间
if student.sex == 0
consumeTime = canteenWaitingTime + 8.25;
else
consumeTime = canteenWaitingTime + 8.45;%等待加上吃饭时间
student.leaveTime = student.leaveTime + consumeTime/60;
% end
End
elevator.m
function [stu] = elevator(stu,studentNum)%电梯函数返回一个总时间线的值 (时间、状态、人数)
Event_queue_boy = [];%事件队列
Event_queue_girl = [];
N=8;%楼层数
student_num = studentNum;
for n=1:student_num
stu(n).floor = unidrnd(N); %floor=1 2 3 4 5 6 7 8 9
stu(n+student_num).floor = unidrnd(N);
stu(n).leaveTime = 0;%离开电梯时间
stu(n+student_num).leaveTime = 0;%离开电梯时间
if stu(n).floor == 1
stu(n).leaveTime = stu(n).StartTime;
else
Event_queue_boy = insert_Event_queue(Event_queue_boy, stu(n).StartTime, 1,stu(n).id);
end
if stu(n+student_num).floor == 1
stu(n+student_num).leaveTime = stu(n+student_num).StartTime;
else
Event_queue_girl = insert_Event_queue(Event_queue_girl, stu(n+student_num).StartTime, 1,stu(n+student_num).id);
end
end
stuboy = stu(1:studentNum);
stugirl = stu(studentNum+1:2*studentNum);
stuboy = elevatorRun(stuboy,Event_queue_boy);
stugirl = elevatorRun(stugirl,Event_queue_girl);
stu = [stuboy,stugirl];
end
marketOrExpress.m
function student = marketOrExpress(student)
supermarketWaitingTime = exprnd(67.667)+normrnd(31.5185,12.6979);
%等待时间+结账时间/查找快递+取快递
student.leaveTime = student.leaveTime + supermarketWaitingTime/60;
end
manageTimeline.m
function [Timeline] = manageTimeline(student,Timeline,number,arriveOrLeave)
leaveTime = floor((student.leaveTime-7)*60);
timeFrame= 180;
for i = leaveTime:timeFrame-1
Timeline(i+1,number) = Timeline(i+1,number)+arriveOrLeave;
end
end