任务
单部电梯的逻辑运行,在实现简单的功能后,需要建立完整的控制流程以顺利完成测试。通过一段时间的思考、程序编写和测试,做一个阶段性的总结。
状态分配
工作状态
floorUnknown | 楼层未知,需要进行初始化 |
isReady | 初始化完成,就绪状态 |
receiveSignal | 接收楼层选层信号,就绪后持续接收 |
findTarget | 寻找到下一个最优目标楼层 |
towardTarget | 在向目标楼层运行中,期间停止目标寻找 |
offerLift | 在前往目标楼层过程中中途同方向楼层呼选,停层顺风车 |
运行状态
isRunning | 正常运行 |
isSlow | 制动 |
isStop | 抱闸停车 |
goUp | 向上行进 |
goDown | 向下行进 |
调度算法
参考文章电梯调度算法,有下列分类:
1.1 先来先服务算法(FCFS)
随即服务算法,它不仅仅没有对寻找楼层进行优化,也没有实时性的特征,它是一种最简单的电梯调度算法。
人们之所以研究这种在载荷较大的情况下几乎不可用的算法,有两个原因:
- 任何调度算法在请求队列长度为1时,请求速率极低或相邻请求的间隔为无穷大时使用先来先服务算法既对调度效率不会产生影响,而且实现这种算法极其简单。
- 先来先服务算法可以作为衡量其他算法的标准。
1.2 最短寻找楼层时间优先算法(SSTF)
最短寻找楼层时间优先算法选择下一个服务对象的原则是最短寻找楼层的时间,请求队列中距当前能够最先到达的楼层的请求信号就是下一个服务对象。
在重载荷的情况下,最短寻找楼层时间优先算法的平均响应时间较短,但响应时间的方差较大,原因是队列中的某些请求可能长时间得不到响应,出现所谓的“饿死”现象。
1.3 扫描算法(SCAN)
电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处在于电梯运行方向相同的各楼层上的请求的非实时算法。扫描算法较好地解决了电梯移动的问题,在这个算法中,每个电梯响应乘客请求使乘客获得服务的次序是由其发出请求的乘客的位置与当前电梯位置之间的距离来决定的。
扫描算法的平均响应时间比最短寻找楼层时间优先算法长,但是响应时间方差比最短寻找楼层时间优先算法小,从统计学角度来讲,扫描算法要比最短寻找楼层时间优先算法稳定。
1.4 LOOK 算法
LOOK 算法是扫描算法(SCAN)的一种改进。对LOOK算法而言,电梯同样在最底层和最顶层之间运行。
但当 LOOK 算法发现电梯所移动的方向上不再有请求时立即改变运行方向,而扫描算法则需要移动到最底层或者最顶层时才改变运行方向。
个人工作
最初在利用梯形图编写程序并非熟悉,对于循环判断有进行尝试,但觉得不太稳定,首先使用的是SCAN算法,即简单控制楼梯在底层和顶层间来回往复,在经过呼选楼层时停下。
这样的算法对于只有6层的电梯,且实验文件客流数据分布较为均匀的情况下还是能进行测试工作,但评分依然有10+/70的乘客差距,因此之后进行LOOK算法的编写,即不再前往没有呼选信号的楼层。那么要确定的是抵达楼层目标后下一个最优目标楼层,并在抵达后利用停层时间进行更新。
最优目标楼层
- 首先根据运行方向确定在前进方向是否有相同方向的呼选信号,若有,则samePos=True
- 若samePos=False,则继续判定在前进方向是否有相反方向的呼选信号,若有,则sameNeg=True
- 若samePos=False&&sameNeg=False,则直到抵达当前最优目标楼层换向,重新进行1.2的判定
优化相关
根据同学经验,对于提高得分的有效优化方向是制动参数以及开门延迟时间。而开门时间除了对整体时间的影响之外,主要影响了人员是否能够出去。
起初使用固定的延时时间,但通过录屏观察可见,有空白期较长的开门,也有被困于电梯的人员。之后,根据日常生活经验,通过判定光幕信号(当人员进出电梯时传感器响应)在一段时间没有产生时关门。而延时的时间可以进一步细化:
- 当只有外呼信号时,乘客一次量涌入,时间短
- 当有内选信号时,乘客分批出梯,可以根据停车前载重量的大小进一步对延时时间分级