问题描述

现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示,其使用规定如下:
楼层号为0~20,其中0号为地下一层
1.有楼层限制的电梯不在相应楼层停靠,如单双层
2.所有电梯采用统一按钮控制
3.请根据上述要求设计并实现一个电梯控制程序,使得用户平均等待时间尽可能小,如果有图形显示就更好了。

电梯编号 可服务楼层 最大乘客数量 最大载重量
1 全部楼层 10 800KG
2 单层 10 800KG
3 双层 10 800KG
4 全部楼层 20 200KG

项目分工

本次项目由我担任驾驶员,同伴马司雨完成领航员的工作
同伴博客地址

设计原理

设想过很多种类的电梯,最后确定的类型是,乘客在外面按下呼叫电梯的按钮,然后调度代价最小的电梯进行接应,之后在电梯内按自己的需要去往想去的楼层。由于四部电梯需要同时运行,就要采用多线程。

计算最小代价

我计算的方法就是计算一下产生响应的楼层和四部电梯当前所在楼层的距离,与简单的加减不同的是,如果电梯当前楼层比你所在的楼层高,而且电梯还是向上运行的,这时的距离就是电梯运行到顶层再下到你所在的位置的距离。下降时亦是如此。当乘客与电梯方向同向时,只需要计算楼层的加减就行了。

关于乘客的进出

对于呼叫电梯的楼层,该层用随机数生成进入和离开的乘客。当要进入的人数很多时,电梯可能会装不下,这时视作这层仍有需要,电梯中仍要有一个最小代价的电梯来拉上这层的乘客。

输入与结果的说明

添加了几个默认的楼层,便于观察结果。对下图的输出进行简单的说明

输入 : 每隔一段时间产生一个需求,输入要去的楼层
details:列表中的值分别代表四个电梯要去的楼层 ,该电梯是响应该层楼最小代价的电梯
ds:每个电梯当前所在楼层
为了便于观察和验证,在输出中我就将他们保留了,这样也能对过程有一个了解

不足

这个项目会继续改进下去的(立下了flag)

最大的不足就是没有图形界面了,不能清晰的体现出过程。TKinter简单的了解过但是都忘了。其次就是总觉得跟现实中的电梯有差距,有的方案在构思的时候就把自己绕蒙了,现在做完了再想想,也能理清一些了。还有就是面向对象的思想还不够熟练,或者可以说因为太久没用而生疏了,具体就是写了一半的时候,突然想到可以建立一个乘客类,属性中有要去的楼层和各种细节 考虑到各种输入的复杂性,就抛之脑后了(现在想到可以属性用随机数生成不用输入)。还有线程同步问题,目前测试的数据还没出现问题,但当数据量很大请求频繁时,如果不进行线程同步,对其加锁,可能会出现数据不同步的错误。
其实最大的问题就是时间,在假期前构思了这个项目,简单的了解了一下,想着回来再做,之后的五一假期,玩的飞起,结果回来开始着手开始做的时候就觉得时间很紧,虽然完成了,但是离自己想要的的差了很多。

(这个已经可以称为罪过了-.-)

可改进之处

1.增加图形界面
2.实现线程同步
3.增加功能(如电梯上下按键),添加新的对象
4.优化计算代价的函数(考虑到到达时间等因素)

运行结果

代码地址

flag

团队工作总结

首先感谢我的队友,能很耐心的等我把代码写完。在我编写代码时,不喜欢写注释,给他带来很大的阅读难度。他也很耐心的我交流意见,对我的代码的反复阅读,也给出了更多指导性意见,代码的完善很大一部分也要归功于他。