前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你使用Python构建一种预约式电梯调控系统

手把手教你使用Python构建一种预约式电梯调控系统

作者头像
Python进阶者
发布2022-01-13 18:42:02
5470
发布2022-01-13 18:42:02
举报
文章被收录于专栏:Python爬虫与数据挖掘

大家好,我是【🌑(这是月亮的背面)】。

今天给大家介绍使用Python构建一种预约式电梯调控系统,目录如下:

  • 设计平台
  • 独立控制电梯系统设计
    • 人物模型类
    • 随机楼层生成类
    • 电梯类
    • 楼宇类
  • 群控电梯系统设计
  • 总结

最近在通勤过程中发现电梯系统也是一个有趣的项目,独控电梯也许没有那么大的吸引力,但在群控电梯中的系统设计似乎有趣了起来,如何有效的利用电梯系统内所有电梯将楼宇候梯层的所有乘客准确、省时、舒适的接送至目标层成为了一个可供思考的方向。

设计平台

  • windows 10
  • python 3.8

独立控制电梯系统设计

群控电梯各电梯间的运行本质来讲就是单个电梯独立运行,从而先设计出独立电梯运行系统,简单来画下流程图:

通过程序扫描楼宇的所有楼层的上下楼请求,并驱动电梯抵达,完成乘客从请求层到目标层的需求。主要代码贴图:

代码语言:javascript
复制
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')

为了更好的模拟现实电梯的请求受理状态,构造楼宇类、人物模型类、电梯类、随机生成人物类。 当电梯内的乘客数大于指定数或者载重大于限定数时,电梯不乘载当前层的乘客。

人物模型类

传入所在楼层,去往楼层范围,返回乘坐电梯的人物属性。

代码语言:javascript
复制
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()

随机楼层生成类

传入楼层范围及该层最大生成人数,返回楼宇所有楼层乘客情况。

代码语言:javascript
复制
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: 最高楼层
        """

电梯类

电梯往返楼层的范围、限重限载、运行方向、电梯内乘客状况。

代码语言:javascript
复制
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'])

楼宇类

楼宇间电梯运行的楼层范围及候梯乘客情况。

代码语言:javascript
复制
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为任务系统设计模块,相关类的调用均沿用独立电梯设计。

总结

大家好,我是【🌑(这是月亮的背面)】。本文通过用Python设计一种任务型预约电梯系统,更深刻地理解了独立电梯转换为群控电梯不单单是电梯的简单组合,整个电梯系统设计因素应该以时间运行为主,将各个电梯拆分为多线程运行,在本设计中简化了时间因素,用跳过楼层替代各电梯间的运行差异。

世界上任何美好的事物都值得我们去留恋,不应该因为当下的不堪而放弃了追逐梦想的权利!

于二零二一年十二月二十九日作

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计平台
  • 独立控制电梯系统设计
    • 人物模型类
      • 随机楼层生成类
        • 电梯类
          • 楼宇类
          • 群控电梯系统设计
          • 总结
          相关产品与服务
          对象存储
          对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档