系统仿真(四):电梯系统的仿真实现
一、 实验背景
根据第一次作业时间分布,实现电梯仿真系统,检验不同场景下学生到达一楼的时间开销性能。电梯系统是离散系统,由事件驱动,状态在离散时间点上变化,使用先叫先服务方式运行。
二、 已知条件
- 到达电梯时间即开始时间 = 起床时间分布+洗漱时间分布。起床时间分布为 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) 。
- 电梯运行速度1.58s/每层。
- 每层停留时间服从 U ( 10 , 60 ) U(10,60) U(10,60)秒。
- 电梯运行策略:先呼叫先服务+运行方向楼层排序策略
三、 实现过程
电梯共存在三种状态空闲、运行未满载(人数<10)、运行且满载(人数=10)。设Event_queue为事件序列,第一行为开始时间及消耗时间,第二行为当前状态,1为到达,0为在电梯中,-1判断是否到达1层或出电梯状态。设queue为等待序列,每一行代表漏乘第一位为人数,第二位及以后为ID号
设queue_in_elevator记录在电梯中的ID。
电梯运行分三种情况:
- 学生到达呼叫电梯①有且正开着门③是否满员②是否在一层。
- 电梯正在运行中,到达呼叫楼层,依次判断低于呼叫层是否有人排队, 若有并在电梯未满情况下在向下运行的时候同时加入到电梯队列。
- 电梯关门等待呼叫。
情况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 升升小屋
系统仿真(四):电梯系统的仿真实现相关推荐
- matlab电梯速度,基于Matlab的多速度模式电梯群控系统模型仿真
Vol. 17 No. 8 系 统 仿 真 学 报 Aug. 2005 JOURNAL OF SYSTEM SIMULATION ·1997· 基于 Matlab 的多速度模式电梯群控系统模型仿真 李 ...
- 基于matlab的跳频系统的仿真,基于MATLAB的跳频通信系统仿真
科技信息. 计算机与网络 基于MATLABIIJ3=IB频通信系统仿宜 莱芜职业技术学院 山东大学 赵守彬 [摘要]跳频通信是目前常见的扩频通信方式,广泛应用于民用和军事领域.本文通过MATLAB,对 ...
- mm1排队系统仿真matlab实验报告,matlab仿真实验报告_mm1排队系统仿真matlab实验报告资料...
M/M/1排队系统实验报告 一.实验目的 本次实验要求实现M/M/1单窗口无限排队系统的系统仿真,利用事件调度法实现离散事件系统仿真,并统计平均队列长度以及平均等待时间等值,以与理论分析结果进行对比. ...
- 直流双闭环pwm调速系统matlab仿真,双闭环可逆直流脉宽调速系统的设计和仿真
内容简介: 毕业设计 双闭环可逆直流脉宽调速系统的设计和仿真,共45页,17890字 摘要 直流调速系统具有调速范围广.精度高.动态性能好和易于控制等优点,所以在电气传动中获得了广泛应用.本文从直流电 ...
- matlab设计二进制波形,二进制调制系统的仿真与分析
二进制调制系统的仿真与分析 内容包括:一 设计内容与技术要求1.设计内容:对二进制数字信源进行数字调制(2ASK ) ,画出信号波形及功率谱.并分析其性能.2.技术要求①. 掌握二进制数字信号调制系统 ...
- 同步电机调速matlab,基于matlab的永磁同步电机调速系统的仿真word格式
基于matlab的永磁同步电机调速系统的仿真word格式 摘 要本文首先介绍了永磁同步电机的国内外发展状况,然后介绍了永磁同步电机的结构及原理,接着建立了永磁同步电机的数学模型,并在此基础上用MATL ...
- 天津理工计算机通信工程学院,2018年天津理工大学计算机与通信工程学院811信号与系统考研仿真模拟五套题...
一.解答题 1. 绘出下列系统的仿真框图: (1): (2) . [答案](1)取中间变量q(t),使 激励信号e(t)与中间变量q(t)的关系,如图1所示. 图1 将①代入原方程,得 对比等式两边, ...
- 电梯java_基于Java的电梯系统
一.思路 写一个简单的电梯系统,首先根据老师提供的需求,写一下基础思路: 电梯有最高层和最低层,输入数字选择正确楼层数 输入数字大于当前楼层,则为上行:小于当前楼层,则为下行 每次输入数字的时候,需要 ...
- 51开发实例 基于51单片机的模拟电梯系统
一.系统设计 电梯的控制对于我们来说既陌生又显得格外亲切,本次基于52单片机开发的模拟电梯系统,系统没有通过电机模拟电梯运转,按键可以设置楼层,一共设置了3个楼层按键,按下对应的楼层按键就会直接向指定 ...
最新文章
- 年赚百万烤肉店老板嘲讽程序员:你们拼死拼活也挣不到100万
- python-函数进阶
- 容联CTO许志强:AI、5G让通讯更智能、更高效
- 汉诺塔问题 hdu 2064 hdu1997
- MYSQL第一章 创建表 修改表名 删除字段 添加字段 修改地段名
- python 微信数据_python 处理微信对账单数据的实例代码
- 包/logging模块/hashlib模块/openpyxl模块/深浅拷贝
- opencv各种小程序代码
- 深度竞品分析:阿里旗下闲鱼与58旗下转转
- Qimage像素级操作
- android 取消选中状态,Android:显示/隐藏偏好检查/取消选中其他CheckBoxPreference
- ccccccccccc
- 百度竞价该如何选择关键词?
- 两年开发工作总结及未来展望
- 2021-09-07 照书码——_——
- 80psi等于多少kpa_1公斤的气压是多少KPA?
- 全景krpano相关问题解答
- Android 手机灭屏流程分析详解
- 引入时间轴:动态图模型的共性与特征
- 《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
热门文章
- python画出AUC曲线
- ExtJS 4 组件详解
- DoDataExchange(CDataExchange *pDX)
- 风压和功率计算公式轴流式_轴流风机的安置及风压的计算
- matplotlib绘制双柱状图
- 2021.1.4--我的20岁生日感悟
- easyui+themeleaf 分页查询实现
- 冰河KS2:革新数字货币挖矿,引领Kaspa(KAS)矿机新纪元
- 沉痛悼念恩师程开甲院士“改革子先锋”(修改稿)
- java表单验证手机号码位数_正则手机号码验证(一)