最近在通勤过程中发现电梯系统也是一个有趣的项目,独控电梯也许没有那么大的吸引力,但在群控电梯中的系统设计似乎有趣了起来,如何有效的利用电梯系统内所有电梯将楼宇候梯层的所有乘客准确、省时、舒适的接送至目标层成为了一个可供思考的方向。
设计平台
- windows 10
- python 3.8
独立控制电梯系统设计
群控电梯各电梯间的运行本质来讲就是单个电梯独立运行,从而先设计出独立电梯运行系统,简单来画下流程图:
图片
通过程序扫描楼宇的所有楼层的上下楼请求,并驱动电梯抵达,完成乘客从请求层到目标层的需求。主要代码贴图:
def take_elevator(self, elevator_data):
"""进电梯"""
if not elevator_data:
return elevator_data
elevator_data = pd.DataFrame(elevator_data, dtype='int')
data = elevator_data[elevator_data['up'] == self.up].copy()
data2 = elevator_data[elevator_data['up'] != self.up].copy()
while data['weight'].sum() > self.weight and not data.empty: # 超重
weight_max = data[data['weight'] == data['weight'].max()].index
data2 = data2.append(data.loc[weight_max, :])
data.drop(weight_max, inplace=True)
while len(data) > self.persons and not data.empty: # 超载
weight_min = data[data['weight'] == data['weight'].min()].index
data2 = data2.append(data.loc[weight_min, :])
data.drop(weight_min, inplace=True)
self.person_data = self.person_data.append(data)
self.update_person_data(data, 'sub')
return data2.to_dict(orient='records')
为了更好的模拟现实电梯的请求受理状态,构造楼宇类、人物模型类、电梯类、随机生成人物类。当电梯内的乘客数大于指定数或者载重大于限定数时,电梯不乘载当前层的乘客。
人物模型类
传入所在楼层,去往楼层范围,返回乘坐电梯的人物属性。
class PeopleRandom:
"""
构造随机人物模型
返回各人物属性值,包含:所在楼层,体重,是否上楼,去往楼层
"""
def __init__(self, floor: int, floors: tuple = (1, 30), people: int = 1):
self.floor = floor
self.floor_min, self.floor_max = floors
self.people = people
self.weight = self.set_weight()
self.up = random.randint(0, 1)
self.floor_go = self.go()
随机楼层生成类
传入楼层范围及该层最大生成人数,返回楼宇所有楼层乘客情况。
class FloorsRandom:
"""
随机楼层生成,楼层随机人数生成。
"""
def __init__(self, floor_min: int, floor_max: int, people: int = 6):
"""
输入的楼层是不存在0层,故而在floor_min进行加1后进行随机取数,如果小于等于0则减去1还原最低楼层。
:param floor_min: 最低楼层
:param floor_max: 最高楼层
"""
电梯类
电梯往返楼层的范围、限重限载、运行方向、电梯内乘客状况。
class Elevator:
"""
电梯模型:
能够运行到的最低楼层,最高楼层及当前楼层
"""
def __init__(self, floor_min, floor_max, floor: int = 1):
self.floor = floor
self.go_max = self.floor
self.floor_min = floor_min
self.floor_max = floor_max
self.up = 1 # 1: 电梯上行,0:电梯下行
self.weight = 1000 # 电梯限重
self.persons = 12 # 电梯限制人员数量
self.person_data = pd.DataFrame(columns=['floor', 'weight', 'up', 'floor_go'])
楼宇类
楼宇间电梯运行的楼层范围及候梯乘客情况。
class BuildingList:
"""
楼宇模型:
最低楼层,最高楼层
"""
def __init__(self, floor_min: int = -1, floor_max: int = 30):
self.floor_min = floor_min
self.floor_max = floor_max
self.data = pd.DataFrame(columns=['floor', 'weight', 'up', 'floor_go'])
self.set_data_all('simple')
为了简化运算,简化了部分模型的设计,通过随机生成人物模型,电梯在楼宇最高层至最低层往返能够将所有候梯乘客运送至各个指定层。
设计模型代码已开源:https://github.com/lk20200413/FunnyCodeRepository/tree/main/预约式电梯任务系统
群控电梯系统设计
群控电梯系统的设计可以有效的缓解各层楼乘客的等待时间及提高电梯内乘客的舒适度。
就以我自己为例,小区的电梯是独立控制电梯,为了自身能够更早的乘坐电梯,会按下每个电梯的请求按键,就造成了电梯内不同程度的拥挤或延长了其他乘客的等候时间。
在此次设计前没有查阅相关资料,在整体设计上肯定不如现有的成熟的算法设计,我把这个系统称之为任务系统,应该是有与之对应的更专业的算法。简单来讲,把楼层间请求当做任务,系统整理任务并分发给各个电梯,每过一段时间,系统再次扫描楼宇中的请求,直至没有请求,将每个电梯转换为独立电梯模式,完成电梯内乘客的目的层请求。
任务系统设计流程图:
图片
各个电梯执行流程图:
图片
流程图画得比较粗糙,烦请各位将就着看。任务系统采用距离优先进行代码设计,限于文章篇幅设计不方便展示有关代码部分,可移步至https://github.com/lk20200413/FunnyCodeRepository/tree/main/预约式电梯任务系统
此处或联系作者索取代码,TaskSystem.py为任务系统设计模块,相关类的调用均沿用独立电梯设计。