我们的算法里,定义了_PassengerQueue专门用于存储乘客发出的方向请求,还定义了一个ArrayList数组_targetOfElev用于存储每个电梯的目标楼层。把每个楼层里发出的方向请求相同的那些请求只存储一个,因为一个乘客如果进入不了一个电梯里的话,那么他就会再发出一次方向请求,这样又会对这个方向请求进行赋值,这样,只要还没有完成将所有的乘客都送到他们要到的楼层,那么_PassengerQueue这个队列就不是空的,那么,电梯调度算法就会继续去完成它。当有乘客进入一个电梯时,就会发出一个目标请求,我们算法里就把这个目标请求加入到数组数组_targetOfElev里该电梯对应的ArrayList里面并且按从大到小排好序,方便后面调用。
在每一个ticks,我们把停靠的电梯和运行中的电梯分开处理:
(1)停靠电梯的处理,这种情形比较多。如果电梯是到达了一个目标楼层后,就在数组_targetOfElev里该电梯对应的ArrayList里面去掉当前电梯所在的楼层。这时候,如果数组_targetOfElev里该电梯对应的ArrayList不为空,就是说电梯的还有目标楼层没有到达,那么就将电梯的下一个目标设为数组_targetOfElev里该电梯对应的ArrayList里面最近的那个目标楼层(这里,向上运行的电梯和向下运行的电梯情况不同);如果数组_targetOfElev里该电梯对应的ArrayList为空,即电梯已经完成了之前数组_targetOfElev里该电梯对应的ArrayList里面的所有任务,那么如果这个时候所有楼层里都没有人发出请求了,那么电梯就往第零层和第一层走,如果有请求,那么电梯就去发出请求的地方接人。
(2)运行电梯的处理,又分为向上运行的电梯和向下运行的电梯,但这是一个对称的过程。如果电梯和电梯目前要前往的目标楼层之间楼层有和电梯运行方向一样的的方向请求时,并且电梯的剩余重量还大于所有人统计平均质量(这里是70)时,就可以使电梯在这一层里停靠一下,接上发出请求的乘客。接上乘客之后,乘客就会发出目标请求,目标请求会加入到数组_targetOfElev里该电梯对应的ArrayList里面。