系统仿真(五):校园时间消耗系统仿真报告

一、仿真目标

 目标系统:每天早上第一节课,学生从宿舍到教室的时间消耗系统
 主要研究目标:给出疫情防控常态化场景下的时间开销预估和优化建议

二、 已知条件

  1. 结合作业一可得表1中不同地点状态下的时间消耗拟合函数。
表1 已知拟合时间数据

在这里插入图片描述

  1. 校园地图如图1所示
    在这里插入图片描述
图1 校园地图

三、实现过程

  该系统目标为实现学生群体日常从宿舍到教室之间时间统筹消耗仿真系统,构建过程采用反推方法。整体流程如图2所示:
在这里插入图片描述在这里插入图片描述

图2 校园活动过程整体流程图

  以动态图展示整体仿真效果较为清晰,并可视为每个时间点在不同位置的人数是固定的,不同位置状态地点如表2所设。
  以7:00~10:00为时间范围,每分钟为间隔,共180分钟,设公寓五、七为初始地点,人数固定(设为2000)。单独个体经历完整过程中,到达不同地点时的时间点加1,离开的时间点减1人,设置总时间线变量Timeline(左侧1表示7:01,180表示10:00)。

表2 不同位置或状态下的代号标识

在这里插入图片描述

  针对时间开销预估问题以及不同性别等,将学生设定为包含id、StartTime、sex、floor、leaveTime、allSpendTime等属性的类。以起床时间为StartTime,离开不同地点时间为leaveTime,最终将allSpendTime所有数据求和取平均计算可得学生在整个流程中的平均消耗时间。
  最后将Timeline中数据依次传递给图像可展现出动态仿真图。

四、 实验结果

  最终每个分钟时间点不同地点状态下的Timeline人数如图3所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图3 取时间1~ 10,100~ 109,170~180三个时间段的人数展示为例

在这里插入图片描述

图4 动态可视化展示校园不同时间点人数
  图4中,绿色圆点代表五公寓、浅蓝色圆点代表七公寓、深蓝色圆点代表一食堂、黄色圆点代表超市、黑色圆点代表菜鸟驿站邮局、橘色圆点代表二食堂、红色圆点代表第一教学以及蓝色线条代表学生的路程。在这段时间内,五公寓和七公寓的人数越来越少,教学楼的人数越来也多,同时在这一段时间中,一食堂、二食堂、超市和菜鸟驿站的人数在慢慢变多然后稳定一段时间,最后变少。

  最终时间开销预估取五次平均如表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());%12食堂概率各为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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值