自从1.2后还有几次修改代码的历程
修改的2.0版本:
主要是针对状态机的优化
Idle
遍历当前请求楼层,如果有楼层,则跑过去。
如果该楼层的请求是destination,进入状态drop
如果该楼层的请求是direction和运行方向相同,设置方向,进入状态drop
如果该楼层的请求时direction和运行方向相反,若当前没有乘客在里面,进入状态pick,否则进入Drop并且将运动方向设为任务方向
Drop 实际指的是顺行状态
根据方向,从当前楼层开始遍历剩余楼层
如果超重,则找到最近的destination楼层跑过去
如果未超重,则找到最近的destination或同方向direction楼层,跑过去
如果找不到需要停靠的楼层,则改变任务方向,同样寻找一次
如果依然找不到需要停靠的楼层,则进入Idle状态
Pick 实际指的是逆行状态
根据任务方向,从方向开始楼层向方将结束楼层遍历所有楼层
找到第一个符合自己任务方向的direction楼层作为自己的TaskFloor
向TaskFloor运动,途中不再停止。(因为进入Pick时没有乘客,确保该状态途中不会遇到Destination要求)
优化算法的2.1
调度算法依然是简单的和 Hurry Bus 相同的算法,Scheduler 每次寻找能 够最快响应要求楼层的电梯跑向预定楼层,但是修改了估计时间的算法使之 更精确。ElevatorTask 使用的状态机基本和 Auto Bus 相同,具有自主寻 地完成所有任务的能力,对某一些状态转换做了一些优化。 改进: 1.更精细的时间估计方法。Auto Bus x 估计电梯响应时间时计入已知的中 间停靠楼层所额外花费的时间。 2.修改了 Elevator Task 从空闲状态进入接乘时,确定启动方向的方法。 现在 Elevator Task 在同一时间接收到多个 Pick 呼叫时,会自动分析上 下行到开始释放乘客的时间,选择时间短的方向前进。 效率: 相对与 Auto Bus,平均时间改进略有进步,在下班高峰情况时的成绩提升 很多,但是同时在上班高峰情况时成绩有一定的下降。
优化算法2.2
改进: 1.再次改进了状态机从 Idle 状态进入 Pick 状态的检测条件和优先顺序, 使平均时间更短、表现更稳定。 2.上班高峰检测机制,关注记录当前0、1层上楼请求的频率,当其超过阈值时 将开启上班高峰优先模式,并且至少会持续一段时间。当0、1层上楼请求的频 率连续小于阈值一定时间之后将关闭上班优先模式。 上班高峰优先模式提供来自0、1层上楼请求的两种优先策略,半优先模式优先 将0、1层上层请求分配给所有电梯,但是电梯的状态机从空闲状态进入工作时 候并不强制处理它;全优先模式则是强制有限处理。实际的测试中我们发现全 优先模式能够取得更好的综合成绩,因此默认使用全优先模式。
优化2.1和2.2相比于2.0在效率上。
优化3.0和3.1
1.精简了状态机的工作状态,为了最大限度利用所有电梯的剩余空间,不再使用不能在中途上人的 Pick 状态,现在电梯在任何时候都能够响应需要中途停 靠上人的请求。
2.现在一半的电梯在空闲模式下接受多个请求时候会优先选择上行,另一半优 先选择下行。
3.收回请求机制,电梯在完成楼层的 Pick 请求后通知 Scheduler 和其他电梯,其他电梯自动消除该请求。CancelledReq 属性记录了收到其他电梯的完 成通知而移除请求的次数。
4.大量的测试表明宽松的时间估计方法(只关注相距楼层而不计入中途停靠)在统计和个例中都能比较精细的时间估计方法有更好的表现,因此 0.3 版本 的时间估计再次回到 0.20 版本中使用的宽松方法。修改了检测上班高峰的方法,现在上班高峰需要满足请求比例超过阈值和请求 频率超过阈值两个条件。
效果相比于2.0版本提高很多
转载于:https://www.cnblogs.com/lzplzp/archive/2012/10/22/2732946.html
相关资源:数据结构—成绩单生成器