/lift_test

Primary LanguagePython

调度算法

  • 实现:
    • 针对每一个电梯分别设置 数组request_persons存放所有呼梯的请求,数组carried_persons存放已经在电梯里的内部请求和target_floor 目标楼层。
    • 电梯每运行到一层,判断该层是否等于目标楼层target_floor,如果不等于则根据方向向上或向下运行;如果等于, 则说明有人要下电梯或上电梯,需要进行三步操作,
      • 先检查内外部乘客,检测内部乘客carried_persons是否有人下电梯,处理外部乘客request_persons是否有人下上电梯
      • 修改电梯目标楼层,根据更新后的内部乘客carried_persons和外部乘客request_persons,计算电梯下一个最近的楼层,更新target_floor 目标楼层
      • 判断电梯要不要调整方向, 根据更新后的target_floor 目标楼层,比较当前所在楼层,判断是不是要改变运行方向
    • 用户在外部请求对调度器指令的时候,调度器分配电梯的逻辑(每个电梯的calculate_cost方法)如下:
      • 若楼层在电梯运行方向后续楼层上且请求方向和电梯运行方向相同,则开销为两者楼层之差;
      • 若楼层不在电梯运行方向后续楼层上或者请求方向和电梯运行方向相反,则开销为电梯运行到该方向上的最后一个楼层(顶层或底层)后,再折返到该楼层所经过的楼层数。
      • 同时计算用户需求和调度器下面所有电梯之间的开销,并把用户分配给预计开销最小的电梯,把该用户加入到该电梯请求数组(request_persons)

程序演示

1. demo.py是个演示模拟程序,调度器采用多线程运行,同时随机生成用户电梯请求。最后调度器里面送完所有后,程序退出。
2. 直接运行python3 demo.py

运行结果

模拟了4部电梯,层高为10层,每隔一秒一个用户随机请求(总共30个)。四部电梯初始状态都在一层等候。

模拟了4部电梯,层高为10层,每隔一秒一个用户随机请求(总共30个)。四部电梯初始状态都在一层等候。

数据如下:

INFO: 调度结果:1楼用户(ID: 1)请求使用0号电梯(目前在1,在去None路上)到达3楼
INFO: 调度结果:3楼用户(ID: 2)请求使用0号电梯(目前在2,在去3路上)到达7楼
INFO: 调度结果:4楼用户(ID: 3)请求使用0号电梯(目前在3,在去7路上)到达5楼
INFO: 调度结果:3楼用户(ID: 4)请求使用0号电梯(目前在4,在去5路上)到达8楼
INFO: 调度结果:3楼用户(ID: 5)请求使用0号电梯(目前在5,在去7路上)到达6楼
INFO: 调度结果:9楼用户(ID: 6)请求使用1号电梯(目前在1,在去None路上)到达1楼
INFO: 调度结果:8楼用户(ID: 7)请求使用2号电梯(目前在1,在去None路上)到达2楼
INFO: 调度结果:7楼用户(ID: 8)请求使用1号电梯(目前在5,在去9路上)到达10楼
INFO: 调度结果:1楼用户(ID: 9)请求使用2号电梯(目前在5,在去8路上)到达6楼
INFO: 调度结果:3楼用户(ID: 10)请求使用3号电梯(目前在1,在去None路上)到达2楼
INFO: 调度结果:10楼用户(ID: 11)请求使用2号电梯(目前在8,在去2路上)到达7楼
INFO: 调度结果:1楼用户(ID: 12)请求使用3号电梯(目前在2,在去2路上)到达2楼
INFO: 调度结果:4楼用户(ID: 13)请求使用2号电梯(目前在4,在去2路上)到达3楼
INFO: 调度结果:6楼用户(ID: 14)请求使用2号电梯(目前在2,在去2路上)到达10楼
INFO: 调度结果:2楼用户(ID: 15)请求使用0号电梯(目前在3,在去6路上)到达7楼
INFO: 调度结果:9楼用户(ID: 16)请求使用1号电梯(目前在2,在去1路上)到达5楼
INFO: 调度结果:10楼用户(ID: 17)请求使用0号电梯(目前在6,在去2路上)到达4楼
INFO: 调度结果:7楼用户(ID: 18)请求使用2号电梯(目前在6,在去6路上)到达8楼
INFO: 调度结果:10楼用户(ID: 19)请求使用2号电梯(目前在7,在去7路上)到达7楼
INFO: 调度结果:4楼用户(ID: 20)请求使用1号电梯(目前在7,在去9路上)到达7楼
INFO: 调度结果:3楼用户(ID: 21)请求使用0号电梯(目前在5,在去7路上)到达5楼
INFO: 调度结果:1楼用户(ID: 22)请求使用0号电梯(目前在7,在去7路上)到达10楼
INFO: 调度结果:1楼用户(ID: 23)请求使用3号电梯(目前在2,在去2路上)到达3楼
INFO: 调度结果:6楼用户(ID: 24)请求使用1号电梯(目前在5,在去4路上)到达5楼
INFO: 调度结果:7楼用户(ID: 25)请求使用1号电梯(目前在4,在去6路上)到达10楼
INFO: 调度结果:9楼用户(ID: 26)请求使用2号电梯(目前在3,在去1路上)到达3楼
INFO: 调度结果:7楼用户(ID: 27)请求使用2号电梯(目前在1,在去1路上)到达6楼
INFO: 调度结果:10楼用户(ID: 28)请求使用0号电梯(目前在4,在去1路上)到达4楼
INFO: 调度结果:3楼用户(ID: 29)请求使用2号电梯(目前在5,在去7路上)到达8楼
INFO: 调度结果:10楼用户(ID: 30)请求使用1号电梯(目前在8,在去6路上)到达4楼
INFO: 0号电梯成功运载10人, 平均周转时间: 8.0417692184
INFO: 1号电梯成功运载7人, 平均周转时间: 6.8958047458
INFO: 2号电梯成功运载10人, 平均周转时间: 14.3565300703
INFO: 3号电梯成功运载3人, 平均周转时间: 3.0681095123