基于PyQt5+MySQL航班座位自动分配系统设计与实现
2021-10-29刘秋兰
张 静 刘秋兰
(山东电子职业技术学院计算机与软件工程系,山东 济南 250200)
目前民航旅客在预定航班后,一般都可以提前自助选择座位。如果不提前选择座位,旅客到达机场后,在柜台值机或自助设备上值机时,可以选择一个座位,或者由后台系统随机分配一个座位。如何正确选座,哪个区域最好,相信这是很多想乘坐飞机的人,都曾苦恼过的问题。因为飞机座位没选好,可能整个出行的计划就被打乱。然而,乘坐飞机出行前选好座位很多问题就可以避免。
因此,本系统利用Python3.6+Pycharm 2017.3+PyQt5+MySQL5.0平台,基于大数据平台,进行个人喜好数据分析,采用自搜索算法、动态求解算法、随机分配算法,实现了航班自动分配座位的功能。系统实现的主要目标如下所示。
第一,采用自搜索算法及随机分配算法,实现了对单一座位的自动分配。第二,采用动态求解算法、自搜索算法、随机分配算法,实现了以“组”为单位的座位以及整机座位自动分配。第三,实现查看座位分配时间与实际分配情况、分配座位的布局、导出分配结果。
一、系统整体概述
1.系统总体设计
结合实际生活场景应用,本系统实现的主要功能可划分为:选择航班信息、加载数据文件、开始自动分配座位、查看分配结果、导出报表、查看座位布局。两种角色:普通用户、管理员。两者的不同在于管理员的权限可以对用户进行有效管理,如添加用户、删除用户、修改用户等功能。
2.系统代码架构
系统代码架构主要分为三层:用户层、中间层、数据层。用户层主要提供数据展示和用户操作界面;中间层用于衔接用户层与数据层之间的数据传输;数据层用于存储数据,将数据存于数据库中、Json格式的文件中,具体流程如图1所示。
图1 系统代码架构图
3.系统性能需求
该系统主要从效率性、安全性、稳定性、兼容性等方面考虑了性能需求[1],具体包括:效率性:单一座位分配的处理时间不超过1秒,整机旅客重新分配座位的处理时间不超过10秒。安全性:该系统有较强的安全性,能对数据和顾客相关信息进行数据加密处理,能对数据进行有效防护,有较强的安全性。
二、系统详细设计
本系统主要包括系统登录模块、座位自动分配模块、用户管理模块。
1.系统登录模块
本模块属于系统的入口界面,通过输入用户名和密码进入座位自动分配系统。在登录界面中,可以以普通用户或管理员用户两种方式进行登录界面。
2.座位自动分配模块
该模块主要实现的功能包括:切换航班号功能,查看航班相关信息功能;航班座位自动分配功能;查看分配结果功能;导出报表功能;查看座位布局功能。模块界面设计如图2所示。在该界面中,查看座位布局界面设计,如图3所示。单击“查看座位布局”按钮,将会显示出该航班座位的具体分配情况,蓝色表示未分配的座位,带小锁的表示已分配的座位,橙色的表示未满足旅客需求的座位。同时,将鼠标移到某个座位上,将会显示出该座位的所有属性。最后,还可以把这个分配结果以Json格式的文件导出,单击“导出报表”按钮,选择文件存储位置,输入文件名,单击保存即可完成。
图2 座位自动分配界面
图3 查看座位布局界面
3.用户管理模块
对于普通用户,仅允许该用户修改自己的密码;对于管理员用户,可以实现修改所有用户的密码和权限、增加用户、删除用户、清空普通用户等操作。
三、座位自动分配算法
座位自动分配流程如下:
第一,选择需要分配的Json格式报表文件,该文件存储的是旅客历史购票信息。第二,对报表文件进行预处理,具体方法如下:①将旅客信息按照旅客数量进行分类,将旅客数量大于1的旅客放到一个旅客信息表1中;将其他旅客信息放到另外一个旅客信息表2中;②将旅客信息表1里的旅客信息按照旅客数量从大到小的顺序排序;③将旅客信息表2里的旅客信息按照座位属性值的个数从大到小排序。第三,采用动态优化算法,按照旅客信息表1里提供的座位属性实现自动分配,同时,将已分配到的座位从座位信息列表里删除。此时,将旅客相关信息存入旅客座位列表中。对于未满足需求的旅客信息放到变量旅客信息表2里。第四,采用自搜索算法,根据旅客信息表2里的旅客座位属性实现自动分配,同时,将已分配到的座位从座位信息列表里删除。此时,将旅客相关信息存入旅客座位列表中。将未满足需求的旅客信息放入临时变量tmp_passenger_info_dict内。第五,采用随机分配算法分配剩余旅客座位,同时,将已分配到的座位从座位信息列表里删除。此时,将旅客相关信息存入旅客座位列表。将该变量的信息写入旅客信息列表,同时更新座位属性表里的座位预定状态。第六,给出提示信息,座位自动分配完成。采用两组数据进行测试,第一组测试数据是单一座位的数据,其中80个靠窗的、80个靠过道的、20个无属性的、2个VIP的。第二组测试数据是支持以组为单位的座位数据,其中包含40组,30个单一靠窗、30个单一靠过道、10个单一无任何属性的。
一是单一座位的自动分配:首先单击“加载数据报表”按钮,选择第1组测试数据(这里仅支持加载Json格式的数据文件);然后,单击“开始分配座位”按钮,就实现自动分配座位的功能,同时可以查看分配座位所用的时间。单击“查看分配结果”按钮,查看本次座位分配的情况,在分配结果表格中,第一列表示用户ID(此处用的是按照顺序排列的),第二列是座位号,第三列是旅客所需座位数(如果座位数等于1,表示单个分配;如果座位数大于1,表示以组的形式进行分配的),最后一列表示是否满足旅客需求。二是以组为单位的自动分配:首先清空数据库中的数据,执行database.py。然后单击“加载数据报表”按钮,选择第2组测试数据;再单击“开始分配座位”按钮,就实现自动分配座位的功能,同时,可以查看分配座位所用的时间。
结语
本系统体现的创新特色之处,包括:动态处理座位属性表,提高程序效率;座位属性值采用一个整型值来存储,目的是为了减少内存存储和比较次数;支持加载Json格式的模拟数据报表文件;该系统不仅适用于航班座位自动分配,而且还适用于其他类型的座位自动分配,如火车、电影院等。