问题描述:
某大楼共有20层,现安装4个电梯参数如下:
1号电梯 全楼层 最大负载800kg
2号电梯 单数层 最大负载800kg
3号电梯 双数层 最大负载1600kg
4号电梯 全楼层 最大负载2000kg
分析:
4个电梯是相互独立工作的,那么分为4个相互独立的调度模块。1号电梯与4号电梯均服务于全楼层且仅有最大负载不同,而2号和3号电梯 服务模式类似。那么1、4号电梯调度模块可合并为一个。同样地,2、3号模块也可以合并。电梯调度的核心功能是接受不同楼层用户的请求并相应,而同一部电梯某时刻只能相应向上移动或者向下移动的请求,那么我们要做的就是设计一个决策算法来完成电梯对不同用户的请求的筛选。
这里我采用的是一个较为简便的决策方式,先到优先,后异忽略。
首先定义几个概念:
1.合法请求:前往目标楼层合法的请求;
2.请求队列:电梯需要按顺序执行的用户请求的队列,从队首取出,从队尾加入;
3.空闲状态:电梯当前的请求队列为空;
4.上行状态:电梯当前请求队列里至少有一条向上层运行的请求;
5.下行状态:电梯当前请求队列里至少有一条向下层运行的请求;
6.等待超时:当电梯请求队列为空且现行楼层高于第一层,空闲时间超过某一值之后称为等待超时;
7.初始楼层:全楼层或单数层服务为第一层,双数层服务为第二层。
先到优先,后异忽略:假设某时刻电梯的请求队列为空,此时检测到一个合法请求则以其目标楼层来确定电梯当前的状态是上行还是下行,此后获得的请求如果与运行状态一致则添加到队列,否则忽略请求。
当然,当电梯长时间空闲并且不在初始楼层时为使得电梯运行的高效率性应该使其自动移动至初始层并且在此期间允许接受运行请求。
明确了任务需求之后就需要设计程序结构了。对于不同的I/O方式程序结构也是不同的,之前说过由于4部电梯是相互独立运行的,那么便可以在主程序中采用切换I/O的方式,并且切换后不能丢失之前调度模拟的数据,这样一来可以考虑将调度分装成一个类,既便于设计也便于调用。
设计:
电梯的运行区间为1~20的楼层,还有作为限制参数的负载。无论乘客们从那一层乘坐电梯和到那一层下电梯,当电梯到达某一层时,只需要让目标为该层的乘客下去并将其质量从现行载荷中减去即可,当现行载荷为0时即代表电梯空闲了。之前定义了电梯的运行状态,由当前的运行状态决定电梯执行一个上行或下行动作,在此之前首先检查现行载荷是否为0,非0即代表还有上行或下行请求的乘客在电梯内,那么执行一个动作,否则就进入空闲状态,而等待超时之后便可执行复位动作。
实现:
用一个C++控制台来实现,采用多级程序结构:切换程序->调度模拟程序->I/O程序。
本次程序中共设计两个类,分别为用于存放请求数据的元组的队列(RQ)和电梯基本功能类(Elevator)。
具体内容详见Coding项目。
测试:
主程序,输入对应键进入子程序。
选择电梯1,在第一层输入请求5 100、8 100,分别代表前往5楼乘客重100kg,前往8楼乘客重100kg。
每移动一层都需要检测是否有欲加入的请求。
当队列为空后电梯为空闲状态。
超时后的复位状态,每移动一层检测是否有请求。
这里返回主程序,输入非n字符有效。
以上就是本次作业完成的描述。