数据结构电梯模拟 100梯1000层 不限梯数"/>
数据结构电梯模拟 100梯1000层 不限梯数
电梯模拟 不限电梯数 不限楼层数 100梯1000层!源码见文末
- 电梯模拟
- 实验要求
- 设计思路
- 设计要求
- 设计实现
- 类和对象
- 模拟方法
- 有限状态机
- 电梯调度优化
- 综合
- 输出展示
- 源码
电梯模拟
实验要求
【问题描述】
设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是乘客和电梯等 “活动体” 构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的。在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一时刻。
【基本要求】
-
模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层,其中第一层是大楼的迸出层,即是电梯的 “本垒层”,电梯 “空闲” 时,将来到该层候命。
-
乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
-
模拟时钟从 0 开始,时间单位为 0.1 秒。人和电梯的各种动作均要耗费一定的时间单位 ( 简记为 t ),比如:
- 有人进出时,电梯每隔 40t 测试一次,若无人进出,则关门;
- 关门和开门各需要 20t;
- 每个人进出电梯均需要 25t;
- 如果电梯在某层静止时间超过 300t,则驶回 1 层候命。
- 电梯加速需要 15t,向上移动需要 51t,向上减速需要 14t,向下移动需要 61t,向下减速需要 23t ( 电梯下降比上升慢 )
-
按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。
【测试数据】
模拟时钟 Time 的初值为 0,终值可在 500~10000 范围内逐步增加。
【选做内容】
- 增加电梯数量,模拟多梯系统。
- 某高校的一座 30 层住宅楼有三部自动电梯,每梯最多载客 15 人。大楼每层八户,每户平均 3.5 人,每天早晨平均每户有 3 人必须在 7 时之前离开大楼去上班或上学。模拟该电梯系统,并分析分别在一梯、二梯和三梯运行情况下,下楼高峰期间各层的住户应提前多少时间候梯下楼?研究多梯运行最佳策略。
【输入】
自行设定输入格式,要求至少能在 500~10000 范围内自由输入电梯系统运行时间,可以适度拓展,如根据输入的楼层数和电梯数来确定电梯模拟时的总楼层数和总电梯数
【输出】
按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。
可以适度拓展,如图形化界面等。
设计思路
设计要求
设计出的电梯系统需满足如下要求:
- 满足题目所有基本要求
- 电梯数量 和 楼层总数 由用户输入设定,即 任意电梯数与楼层数
- 电梯系统运行时间由用户输入设定
- 电梯容量有上限,且由用户输入设定
- 电梯本垒层需根据用户输入的楼层总数决定,即当楼层总数较少时本垒层设置为第一层,当楼层总数较多时本垒层设置为楼的中间层
- 电梯调度优化,减少电梯资源浪费
最终,设计出的电梯系统满足上述所有要求。
设计实现
类和对象
在电梯模拟系统中,有电梯和乘客两个对象,需要模拟的也就是它们各自发生的事件与其之间的交互。
更细致地划分,可分为如下几个对象:
- 电梯:有楼层总数、当前楼层、按钮等属性,有状态转换、判断是否需要停在下一层等方法,需要注意的是,在代码实现中,每部电梯内都有对应楼层的按钮,但每一层楼只有一个上升按钮和一个下降按钮,即在每一层所有电梯共用一对上升下降按钮(为了问题的简化)
- 乘客栈:为了模拟 “先进入的乘客后出去” 这一实际情况,需对每一部电梯在每一层设置一个乘客栈,且应封装在电梯类内
- 乘客:有出现楼层、目标楼层、编号、放弃时间等属性,有出现、放弃等方法
- 等待队列:为了模拟人排队等候电梯,需在每一层设置一个上升队列和下降队列
模拟方法
离散事件模拟一般有两种可选方法,一种是事件表推进法,另一种是时间递增法。本实验采用时间递增法,即设定一个记录当前时间的变量 time,每次循环使 time++,并处理当前时间下所发生的事情。
有限状态机
一台电梯实际上是一个 FSM,有 Opening、Opened、Closing 等状态,每种状态有一定的持续时间,当时间到时,就要判断是否需要改变状态、改变成什么状态
电梯调度优化
为每一层的上升下降按钮设置四个属性:
- 0:未被按下
- 1:按下但尚未有电梯响应该请求
- -1:按下且有电梯响应该请求,但电梯未到达该层
- -2:电梯已到达该层未该层的上升或下降请求工作
从而当考察某一台处于闲置状态状态的电梯是否需要去响应某一层的请求时,只需要看该层对应按钮是否变为负值,若变为负值则无需调度该电梯,否则需要
且在设置了这四个属性之后,绝大多数情况下不会出现两台及以上的电梯同时在某一层一起为该层的上升队列(或下降队列)服务的情况,只有当该层本来就有一台电梯在工作且另一台电梯内有人需要到该层才会出现这样的情况,从而很好地减少电梯资源的浪费
综合
综合而言,设计思路即主程序里主要是一个大循环,每次循环使 time++,并完成当前时间要干的事情。而当前时间要干的事情分为 两类:人的出现入队按按钮放弃(不以 FSM 为主动者)和各个电梯的状态的考察与改变(以 FSM 为主动者)
。实际实现中,将各个电梯的状态的考察与改变划分为对 Waiting 状态的电梯的唤醒与对其他状态下的电梯的考察与改变。
输出展示
- 时间 50000,一台电梯,容量 12,总层数 10:
- 时间 30000,三台电梯,容量 12,总层数 25:
- 时间 20000,八台电梯,容量 12,总层数 40:
源码
点此移步 github 查看源码
更多推荐
数据结构电梯模拟 100梯1000层 不限梯数
发布评论