一、 实验背景

 根据第一次作业时间分布,实现电梯仿真系统,检验不同场景下学生到达一楼的时间开销性能。电梯系统是离散系统,由事件驱动,状态在离散时间点上变化,使用先叫先服务方式运行。

二、 已知条件

  1. 到达电梯时间即开始时间 = 起床时间分布+洗漱时间分布。起床时间分布为 N ( 7.633 , 0.7822 ) N(7.633,0.7822) N(7.633,0.7822) ,洗漱时间分布为 N ( 0.17689 , 0.00235 ) N(0.17689,0.00235) N(0.17689,0.00235) 。
  2. 电梯运行速度1.58s/每层。
  3. 每层停留时间服从 U ( 10 , 60 ) U(10,60) U(10,60)秒。
  4. 电梯运行策略:先呼叫先服务+运行方向楼层排序策略

三、 实现过程

 电梯共存在三种状态空闲、运行未满载(人数<10)、运行且满载(人数=10)。设Event_queue为事件序列,第一行为开始时间及消耗时间,第二行为当前状态,1为到达,0为在电梯中,-1判断是否到达1层或出电梯状态。设queue为等待序列,每一行代表漏乘第一位为人数,第二位及以后为ID号
设queue_in_elevator记录在电梯中的ID。
电梯运行分三种情况:

  1. 学生到达呼叫电梯①有且正开着门③是否满员②是否在一层。
  2. 电梯正在运行中,到达呼叫楼层,依次判断低于呼叫层是否有人排队, 若有并在电梯未满情况下在向下运行的时候同时加入到电梯队列。
  3. 电梯关门等待呼叫。

情况1 type=1

图1 情况1学生到达流程图

情况2 type=0

图2 情况2电梯移动过程流程图

情况3 type = -1

图3 情况3电梯关门等待过程流程图

四、 效果检验

运行过程:


……

图4 运行过程

图5 消耗时间折线图

场景组对比
①设每层20个学生

表1 (5,9)层下平均消耗时间表

楼层数 5 6 7 8 9
总人数 100 120 140 160 180
平均消耗时间 1 43.511s 41.365 67.589 52.908 65.652
2 44.179s 48.702 53.102 61.904 86.502
3 41.515 53.731 60.289 59.374 64.415
4 41.056 49.858 60.929 53.575 71.541
5 38.552 67.702 40.739 64.393 74.349
总平均 41.762 52.271 56.5296 58.4308 72.4918


图5 不同楼层平均消耗时间对比图
② 根据作者宿舍楼实际情况数据9层,每层64人可得平均使用时间是261.192s.
表2 9层64人下平均消耗时间表

1 2 3 4 5 平均
376.576 196.350 267.617 266.110 199.309 261.192s

五、结论

对比平均时间性能可知,随着楼层数的增加,总人数的增加,平均时间开销也相应增加。

附录:

Main.m

clc;clear;
close all;
%***********************
Event_queue= [];%事件队列
N=6;%楼层数
student_num = 20*N;
queue = zeros(N,20);
elevator_loc = 1;%电梯所在楼层
elevator_num_threshold = 10;%电梯人数上限
num_in_elevator = 0;%在电梯中的人数
time_every_floor = 0.0004388; %2.1361/3600s
elevator_dst = 0;
queue_in_elevator = [];
elevator_door = 0;%电梯门的状态wakeup_time=normrnd(7.633,0.7822,1,student_num);
wash_time=normrnd(0.17689,0.00235,1,student_num);
t=wakeup_time+wash_time;
time=sort(t);for t=1:student_nums(t)=student;s(t).id = t;s(t).StartTime = time(t);s(t).floor = unidrnd(N); %floor=1 2 3 4 5 6 7 8 9s(t).left_elevator = 0;%离开电梯时间if s(t).floor == 1s(t).left_elevator = s(t).StartTime;elseEvent_queue = insert_Event_queue(Event_queue, s(t).StartTime, 1,s(t).id);end
end
t_floor = []; %打印生成同学对应的楼层
for i = 1:student_numt_floor = [t_floor s(i).floor];
end
t_floor;
t_start=[]; %打印生成同学进入电梯系统对应的开始时间
for i =1:student_numt_start = [t_start s(i).StartTime];
end
t_start;t=0;
mid = 0;
while(~isempty(Event_queue))[t,type,id,Event_queue]=pop_Event_queue(Event_queue);
%**********************************************************************************************if type == -1 %电梯关门elevator_door = 0;if elevator_loc == 1 for i = N:-1:1if queue(i,1) ~= 0elevator_dst = i;break;endendif i == 1elevator_dst = 0;elseEvent_queue = insert_Event_queue(Event_queue,t+time_every_floor*(elevator_dst-1), 0, elevator_dst);endelsetime_arrive_next_floor = t + time_every_floor;%去下一层Event_queue = insert_Event_queue(Event_queue,time_arrive_next_floor, 0, elevator_loc-1);%insert change eventend
%**********************************************************************************************         elseif type == 0 %电梯运行elevator_loc = id;%电梯楼层elevator_door = 1;if elevator_loc == 1%出电梯while(num_in_elevator ~= 0)temp_id = queue_in_elevator(1);s(temp_id).left_elevator = t;%记录下时间queue_in_elevator = queue_in_elevator(2:length(queue_in_elevator));num_in_elevator = num_in_elevator - 1;end
%            queue_in_elevator = [];elevator_dst = 0;time_elevator_close = t + (10 + 50 * rand())/3600;Event_queue = insert_Event_queue(Event_queue,time_elevator_close, -1, elevator_loc);%insert close eventelseif elevator_loc == elevator_dstelevator_dst = 1;time_elevator_close = t + (10 + 50 * rand())/3600;Event_queue = insert_Event_queue(Event_queue,time_elevator_close, -1, elevator_loc);%insert close eventif queue(elevator_loc,1) ~= 0[queue, pop_id] = pop_queue(queue,elevator_loc,elevator_num_threshold-num_in_elevator);while(~isempty(pop_id))temp_id = pop_id(1);queue_in_elevator = [queue_in_elevator temp_id];%ID放入电梯里num_in_elevator = num_in_elevator + 1;pop_id = pop_id(2:length(pop_id));endendelseif elevator_dst == 1 if queue(elevator_loc,1) ~= 0 && num_in_elevator < elevator_num_threshold%判断是否有人[queue, pop_id] = pop_queue(queue,elevator_loc,elevator_num_threshold-num_in_elevator);while(~isempty(pop_id))%挨层判断temp_id = pop_id(1);queue_in_elevator = [queue_in_elevator temp_id];num_in_elevator = num_in_elevator + 1;pop_id = pop_id(2:length(pop_id));endtime_elevator_close = t + (10 + 50 * rand())/3600;Event_queue = insert_Event_queue(Event_queue,time_elevator_close, -1, elevator_loc);%insert close eventelseEvent_queue = insert_Event_queue(Event_queue,t+time_every_floor, 0, elevator_loc-1);%insert change eventendend%**********************************************************************************************   elseif type == 1% 电梯if elevator_loc == s(id).floor && elevator_door == 1%刚好电梯在并且门开queue_in_elevator = [queue_in_elevator id];num_in_elevator = num_in_elevator + 1;elseif queue(s(id).floor,1) == 0 %判断当前楼层队列是否为空temp_num_in_queue = queue(s(id).floor,1);%这一楼层的人数queue(s(id).floor,temp_num_in_queue+2) = id;queue(s(id).floor,1) = queue(s(id).floor,1) + 1;if elevator_loc == 1 && elevator_dst == 0 %刚开始的时候,电梯在一层for i = N:-1:1if queue(i,1) ~= 0elevator_dst = i;break;endendEvent_queue = insert_Event_queue(Event_queue,t+time_every_floor*(elevator_dst-1), 0, elevator_dst);%把id换成了楼层endelse %else, join the queuetemp_num_in_queue = queue(s(id).floor,1);queue(s(id).floor,temp_num_in_queue+2) = id;queue(s(id).floor,1) = queue(s(id).floor,1) + 1;endendend
% 结果图形可视化
t_cost=[];
t_left=[];
for i =1:student_numt_cost = [t_cost (s(i).left_elevator-s(i).StartTime)*3600];
end
for i =1:student_numt_left = [t_left s(i).left_elevator];
endx=(1:student_num);
figure
plot(x,t_cost,'LineWidth',1.5);
xlabel('ID');
ylabel('耗费时长(单位:秒)');
grid on;%结果值输出
fprintf('楼层数: %d  学生总数:%d\n',N,student_num);
fprintf('-----------------------------------------------------------\n')
t_start_hour=floor(t_start);
t_start_middle = (t_start-floor(t_start))*60;
t_start_min=floor(t_start_middle);
t_start_second=(t_start_middle-floor(t_start_middle))*60;t_left_hour=floor(t_left);
t_left_middle = (t_left-floor(t_left))*60;
t_left_min=floor(t_left_middle);
t_left_second=(t_left_middle-floor(t_left_middle))*60;for k=1:student_numfprintf('ID号为 %d 的学生在第 %d 层出发的时间为 %d:%d:%0.1f,离开时间为 %d:%d:%0.1f,耗时%0.1fs\n',s(k).id,s(k).floor,t_start_hour(k),t_start_min(k),t_start_second(k),t_left_hour(k),t_left_min(k),t_left_second(k),t_cost(k));
end
fprintf('-----------------------------------------------------------\n')
fprintf('学生乘坐电梯平均消耗时长= %f 秒\n',mean(t_cost));

pop_queuw.m

function [ queue, pop_id ] = pop_queue( queue, index ,num_to_pop )pop_id = [];num_pop = 0;if queue(index,1) <= num_to_pop %想取出的学生数少于当前层排队人数num_pop = queue(index,1); %排队的人都取出for i = 2:(num_pop+1)pop_id = [pop_id queue(index,i)];if queue(index,i) == 0bb = 1;endendqueue(index,:) = 0;else %想取出的学生数多于当前层排队人数num_pop = num_to_pop;queue(index,1) = queue(index,1) - num_pop;for i = 2:(num_pop +1)pop_id = [pop_id queue(index,i)];if queue(index,i) == 0bb = 1;endqueue(index,i) = 0; %将被取出的学生 位置处 置0endfor i = 2:(queue(index,1)+1)queue(index,i) = queue(index,i+num_pop); %将后面没被取出的同学 排队前移queue(index,i+num_pop) = 0; %被前移的学生位置处 置0endend
end

insert_Event_queue.m

function event_queue=insert_Event_queue(event_queue,time, type,id)if isempty(event_queue)event_queue = [time type id]';
elses = size(event_queue);%check the start and end if event_queue(1,1) >= time%add to the startevent_queue = [[time type id]' event_queue(:,1:s(2))];elseif event_queue(1,s(2)) <= time%add to the endevent_queue = [event_queue(:,1:s(2)) [time type id]'];elsefor n = 1:s(2) %go through the event queue and find the right place to insertif event_queue(1,n)<time%insert the time and typeevent_queue = [event_queue(:,1:n) [time type id]' event_queue(:,n+1:s(2))];break;endendend
end

pop_Event_queue.m

function [time, type, id, event_queue]=pop_Event_queue(event_queue)
time= event_queue(1,1);% move the timer
type = event_queue(2,1);
id = event_queue(3,1);
s = size(event_queue);
if s == [3 1]% only one event existedevent_queue = [];
else %more than one event existed%push the fisrt event out.event_queue=event_queue(:,2:s(2));%取出前一个
end

参考
[1]. Liuss 升升小屋

系统仿真(四):电梯系统的仿真实现相关推荐

  1. matlab电梯速度,基于Matlab的多速度模式电梯群控系统模型仿真

    Vol. 17 No. 8 系 统 仿 真 学 报 Aug. 2005 JOURNAL OF SYSTEM SIMULATION ·1997· 基于 Matlab 的多速度模式电梯群控系统模型仿真 李 ...

  2. 基于matlab的跳频系统的仿真,基于MATLAB的跳频通信系统仿真

    科技信息. 计算机与网络 基于MATLABIIJ3=IB频通信系统仿宜 莱芜职业技术学院 山东大学 赵守彬 [摘要]跳频通信是目前常见的扩频通信方式,广泛应用于民用和军事领域.本文通过MATLAB,对 ...

  3. mm1排队系统仿真matlab实验报告,matlab仿真实验报告_mm1排队系统仿真matlab实验报告资料...

    M/M/1排队系统实验报告 一.实验目的 本次实验要求实现M/M/1单窗口无限排队系统的系统仿真,利用事件调度法实现离散事件系统仿真,并统计平均队列长度以及平均等待时间等值,以与理论分析结果进行对比. ...

  4. 直流双闭环pwm调速系统matlab仿真,双闭环可逆直流脉宽调速系统的设计和仿真

    内容简介: 毕业设计 双闭环可逆直流脉宽调速系统的设计和仿真,共45页,17890字 摘要 直流调速系统具有调速范围广.精度高.动态性能好和易于控制等优点,所以在电气传动中获得了广泛应用.本文从直流电 ...

  5. matlab设计二进制波形,二进制调制系统的仿真与分析

    二进制调制系统的仿真与分析 内容包括:一 设计内容与技术要求1.设计内容:对二进制数字信源进行数字调制(2ASK ) ,画出信号波形及功率谱.并分析其性能.2.技术要求①. 掌握二进制数字信号调制系统 ...

  6. 同步电机调速matlab,基于matlab的永磁同步电机调速系统的仿真word格式

    基于matlab的永磁同步电机调速系统的仿真word格式 摘 要本文首先介绍了永磁同步电机的国内外发展状况,然后介绍了永磁同步电机的结构及原理,接着建立了永磁同步电机的数学模型,并在此基础上用MATL ...

  7. 天津理工计算机通信工程学院,2018年天津理工大学计算机与通信工程学院811信号与系统考研仿真模拟五套题...

    一.解答题 1. 绘出下列系统的仿真框图: (1): (2) . [答案](1)取中间变量q(t),使 激励信号e(t)与中间变量q(t)的关系,如图1所示. 图1 将①代入原方程,得 对比等式两边, ...

  8. 电梯java_基于Java的电梯系统

    一.思路 写一个简单的电梯系统,首先根据老师提供的需求,写一下基础思路: 电梯有最高层和最低层,输入数字选择正确楼层数 输入数字大于当前楼层,则为上行:小于当前楼层,则为下行 每次输入数字的时候,需要 ...

  9. 51开发实例 基于51单片机的模拟电梯系统

    一.系统设计 电梯的控制对于我们来说既陌生又显得格外亲切,本次基于52单片机开发的模拟电梯系统,系统没有通过电机模拟电梯运转,按键可以设置楼层,一共设置了3个楼层按键,按下对应的楼层按键就会直接向指定 ...

最新文章

  1. 年赚百万烤肉店老板嘲讽程序员:你们拼死拼活也挣不到100万
  2. python-函数进阶
  3. 容联CTO许志强:AI、5G让通讯更智能、更高效
  4. 汉诺塔问题 hdu 2064 hdu1997
  5. MYSQL第一章 创建表 修改表名 删除字段 添加字段 修改地段名
  6. python 微信数据_python 处理微信对账单数据的实例代码
  7. 包/logging模块/hashlib模块/openpyxl模块/深浅拷贝
  8. opencv各种小程序代码
  9. 深度竞品分析:阿里旗下闲鱼与58旗下转转
  10. Qimage像素级操作
  11. android 取消选中状态,Android:显示/隐藏偏好检查/取消选中其他CheckBoxPreference
  12. ccccccccccc
  13. 百度竞价该如何选择关键词?
  14. 两年开发工作总结及未来展望
  15. 2021-09-07 照书码——_——
  16. 80psi等于多少kpa_1公斤的气压是多少KPA?
  17. 全景krpano相关问题解答
  18. Android 手机灭屏流程分析详解
  19. 引入时间轴:动态图模型的共性与特征
  20. 《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法

热门文章

  1. python画出AUC曲线
  2. ExtJS 4 组件详解
  3. DoDataExchange(CDataExchange *pDX)
  4. 风压和功率计算公式轴流式_轴流风机的安置及风压的计算
  5. matplotlib绘制双柱状图
  6. 2021.1.4--我的20岁生日感悟
  7. easyui+themeleaf 分页查询实现
  8. 冰河KS2:革新数字货币挖矿,引领Kaspa(KAS)矿机新纪元
  9. 沉痛悼念恩师程开甲院士“改革子先锋”(修改稿)
  10. java表单验证手机号码位数_正则手机号码验证(一)