Skip to content

Bink98/Elevator_simulation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

电梯调度模拟

简介

实现了多部电梯的调度算法和可视化图形界面。单部电梯调度采用LOOK算法,多部电梯之间的调度根据启发式的开销函数来选择合适的电梯。另外,可实时计算乘客的平均周转时间,用以指导优化调度算法。

问题分析

单部电梯运行策略

在仅考虑一部电梯的运行的情况下,电梯应尽可能地无差别地对待每个乘客并尽可能地减少所有乘客地平均等待时间。因此当电梯在朝一个方向运行时,应满足该方向后续楼层的所有请求使用电梯的乘客需求,并满足当前电梯乘客在该方向的所有到达需求。当电梯运行到满足这些需求后的最高/低楼层后,并且在准备更改电梯运行方向前,电梯里所有乘客需求应全部完成,并且外部乘客在该方向后续楼层再无请求。这样保证电梯在一个方向上的一次运行,能尽可能满足更多该方向上乘客的需求,来防止出现某些乘客等待时间过长(饥饿效应)的情况。此外,电梯应在仅和外部乘客请求方向(上/下)相同的楼层停靠,比如电梯在向上运行时,不会在请求使用电梯向下的乘客楼层停靠来接该乘客。

多部电梯调度策略

当考虑多部电梯的调度时,应选择调度能满足乘客需求“时间开销”最小的电梯。因此,需要实现一个启发式的开销估计:由于在乘客需求实时产生的系统中,真实的时间开销无法精确计算,故用一个可行解来估计,即若楼层在电梯运行方向后续楼层上且请求方向和电梯运行方向相同,则开销为两者楼层之差;若楼层不在电梯运行方向后续楼层上或者请求方向和电梯运行方向相反,则开销为电梯运行到该方向上的最后一个楼层(顶层或底层)后,再折返到该楼层所经过的楼层数。当一个新的乘客请求发生时,同时计算该乘客需求和三个电梯之间的时间开销,并把该乘客分配给预计开销最小的电梯,加入到其请求列表中。

可视化图形界面

wxpython是python里一个可以实现GUI的库,利用该库可以实现本项目的可视化需求。由于电梯调度模拟是一个实时的过程,需要在后台长时间运行,若把电梯调度和GUI更 新放在一起,会导致GUI的不稳定甚至崩溃,因此需要引入多线程的机制,即电梯调度模拟在工作线程中运行,仅在需要更新GUI的时候发送信号量给主线程(GUI线程),来更新图形界面。

程序运行

所需环境包含在requirements.txt文件中,在anaconda的环境下,命令行输入以下命令安装环境:
conda install -r requirements.txt
命令行输入下面命令即可执行程序:
python elevator.py

程序演示

查看elevator_demo.mp4获取演示视频。

About

电梯调度仿真程序

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages