这周一老师给我们留的作业是关于“电梯调度”的算法设计,我们两个人结组一同设计这个问题,最终有了我们自己的思路,下面将进行介绍:
首先,先说明一下这个问题,该题目的要求为:试想一下,我们正在构建一个高大的办公楼,它有大约电梯配置如下:大厦有21层, 4部电梯,很多乘客使用这些电梯的日常(旅客重量:平均70公斤最大120公斤,最小45公斤)。其他常量数据:电梯速度,开/关门时间,乘客的时间要在/走出电梯。另外,从地面0 , 1 , ... 20 。地板0是地下停车场水平, 1楼是大堂的水平。大多数人都在/走出大楼通过这些2层。另外,还有一些基本要求:
电梯名称 |
停靠层数 |
乘客限制 |
重量限制 |
1 |
所有楼层 |
10 |
800 kg |
2 |
所有楼层 |
10 |
800 kg |
3 |
所有楼层 |
20 |
1600 kg |
4 |
所有楼层 |
20 |
2000 kg |
其次,我们先设想一下现实生活中的整个流程,从一个想要乘电梯的人的角度出发,他需要确定几个问题:
①乘客是上电梯还是下电梯。对于这个问题,我们把每个人以button控件来表示,且每一层有个小文本框来记录该层是第几层,同时还要做一个电梯外部的显示窗口,该窗口有一个窗口记录电梯目前所在楼层数,一个向上的按键和一个向下的按键。
②电梯的运行问题。我们可以用两个数值来表示电梯的运行,比如0和1。假设设置一个变量a,当a=1时说明电梯正在向上行驶,当a=0时说明电梯正在向下行驶。如果电梯目前所在楼层数高于乘客所在楼层数,那么电梯还要进行判断自己所在楼层以上是否还有其他乘客,如果有则a的值仍为1,反之a的值变为0。当电梯到达乘客所在楼层数时,电梯停止行驶,等待乘客,这里可以再假设一个变量c,当c=1时代表电梯正在行驶,当c=0时代表电梯停止行驶。
③4个电梯哪个最先到达的问题。设想一下,当电梯外部按下楼层上或下键时,相当于同时按下4个电梯,这个时候从4个电梯中调度一部进行响应,具体算法是,选择当前没有在运行,或者运行方向与按钮方向相同的并且要经过此楼层的电梯,如有,便调这个电梯,若有多个,那么就选择在满足上面条件下与所处楼层最接近的一部电梯,若没有,那么就将这个楼层存放在等待队列中,等待资源。这里我们可以采用队列的存储方式来进行存储,把计算时间最短(能让乘客所爬楼梯数最少)的电梯进行调用。
④乘客进出电梯。此时需要设计一个电梯内部的窗口,正如现实生活中一样,电梯内部窗口包括一个显示窗口,用来记录电梯所在的实际楼层数;同时,还有相应的0~20层楼的按键,开关门的按键和一个紧急报警按钮。当电梯外部有乘客按下楼层上下键按钮时,用一个二维数组记录下按键所在层数的坐标,若电梯所在楼层坐标与二维数组中的坐标相等时,电梯停下,打开电梯门,等待乘客进入。经过系统规定开关门时间再关闭电梯门。
⑤电梯超载问题。对于每个电梯所能承受的最大重量不同,于是可以采用简单求和的方式,设置一个变量,电梯内部每进来一名乘客就加上他的体重,每走出一名乘客就减去他的体重。如果此时该变量值已超电梯最大承载量,那么电梯将自动启动紧急报警按钮,停止运行,一直保持开门状态,直到载客数减少。
以上便是我们所考虑到的问题,可能有些说的不是很详细,有些存在遗漏和缺陷,但是我们会加以完善。考虑完这些,我们在学校春晖楼对电梯运行情况进行了考察,我们发现:
电梯平均运行速度 | 2.3秒/层 |
电梯开关门间隔 | 9.6秒 |
乘客走进出电梯的时间间隔 |
(人流量多时)20秒 (人流量少时)9.6秒 |
注意:当有乘客阻止电梯门的关闭超过1秒时,电梯会再次启动一个开关门的时间间隔。
以上便是我们小组自己的思路,现在还没有具体的算法实现,由于是第一次接触如此复杂的问题,我们的思路会存在一些不足,这还需要我们以后在实际编程中发现问题,解决问题。
信1205班
董文轩 刘权毅