电梯调度编程结对项目总结
项目地址:https://gitee.com/surrealgit/elevator_surreal.git
一、项目背景
本次课程大作业要求我们以结对编程的形式,完成一个电梯调度算法系统,包括调度算法设计、可视化界面实现、模块接口设计以及协作与版本控制实践。
电梯调度问题的目标是在多部电梯、多楼层、多乘客并发请求的情况下,最小化乘客等待时间并兼顾运行效率。
我们的团队由三人组成,使用 Python + PyQt5 实现整体功能。
二、PSP 表格(开发前估计时间)
| PSP阶段 | 预估时间(小时) | 说明 |
|---|---|---|
| 分析 | 2 | 阅读作业要求,分析需要实现的功能 |
| 设计 | 3 | 调度算法与gui设计 |
| 编码 | 3 | 根据设计方案编写代码实现相应功能 |
| 测试 | 1 | 使用提供的测试样例进行测试 |
| 修改 | 5 | 根据测试过程中发现到问题修改代码 |
| 提交 | 1 | 将项目上传远程仓库并通过流水线测试 |
| 总计 | 15 | — |
三、松耦合的体现
在初版项目中,算法部分与gui部分分离。为保证算法与gui的时间一致性,在程序运行过程中,将算法部分通过监听服务器获取到电梯与乘客信息保存下来,供gui部分查阅,以实现界面的实时更新。
在第二版的修改中,为使算法部分与gui部分进一步解耦,删去了算法部分保存电梯与乘客信息的相关内容,改为令gui通过http直接从服务器获取信息,在修改后的项目中两个部分可独立运行,并能够随意替换不同的调度算法。
四、算法设计与性能表现
1. 算法思路
实现了一种改进的 Nearest-Neighbor + Directional Priority 策略:
- 优先选择当前运行方向一致、且距离最近的电梯
- 若无合适电梯,则选择负载最小的空闲电梯
- 使用动态优先队列维护乘客请求,周期性更新分配
该算法综合考虑了距离、方向、负载三个维度,使得高峰期调度更平衡
2. 算法特点
- 兼顾了效率与公平性
- 对突发请求(如多人同层请求)响应更快
- 支持后期添加机器学习预测模块的扩展性
3. 性能对比(实验结果)
相较于作为baseline的bus算法,在提供的6项测试用例中:
- 平均等待时间降低约 5%
- 前 95% 乘客等待时间降低约 10%
- 在规定时间内运输的乘客数增加约 5%
- 峰值延迟更稳定
五、需求变化与重构
在第二阶段,新增了算法与gui解耦的要求,以使得算法与gui能够随意配合其它小组的gui和算法。
将gui部分由从算法部分获取信息改为直接从服务器获取信息。
gui主要包含获取系统时间、电梯位置、乘客按电梯、乘客上电梯与乘客下电梯等信息,将它们逐步替换为从服务器直接获取信息,每修改完一部分就进行测试,如果有效就将修改内容暂存。在修改完所有内容并通过测试后,提交代码并推送到远程仓库。
小组使用单个账号和远程仓库,在修改完成并讨论后直接推送至远程仓库,无pull request
六、代码规范
规范约定:遵循 [PEP8] 编码规范,函数命名统一使用 snake_case。
异常处理:在gui读取当前状态信息的函数中添加异常捕获并打印报错信息,避免程序直崩溃并便于debug
七、界面模块设计(MVC 模式体现)
我们的系统采用 MVC 模式:
- Model:电梯与乘客的状态对象,由提供的模拟器后端维护
- View:基于 PyQt5 的实时监控界面;
- Controller:算法部分通过处理事件消息按指定逻辑控制电梯运行
界面设计:
- 动态展示电梯所在楼层、运动方向、乘客数量与目标楼层
- 动态展示每一层的乘客数以及它们已经等待的时间
- 实时更新每一位乘客按电梯、上电梯和下电梯的情况
八、结对编程
合作模式
在结对编程中,我们小组采用了类似 驾驶员—导航员(Driver–Navigator) 的模式,3人中有2人尝试以不同的方式实现指定功能,取最终效果较好的一版;另一人则负责检查和优化已完成的代码并细化对尚未完成部分的思路,在整个编程过程中,角色根据团队成员的思路进行轮换。
结对过程照片
队友优点
- 逻辑思维严密,能快速定位算法瓶颈
- 善于借助ai工具快速完成设计与代码编写
- 沟通积极,能及时反馈问题
队友不足
- 对python语言掌握程度不足
改进建议(使用三明治沟通法)
先肯定其在算法和gui设计上的贡献 → 再指出因python基础不牢使代码存在细节问题 → 最后鼓励其通过这次编程实践加深对python程序设计的理解。
九、PSP 表格(实际耗时)
| PSP阶段 | 预估时间(小时) | 说明 |
|---|---|---|
| 分析 | 2 | 争吵完成 |
| 设计 | 3 | ai辅助设计,顺利完成设计 |
| 编码 | 6 | 在第二版中重构了gui获取信息的方式 |
| 测试 | 1 | 测试过程较为顺利 |
| 修改 | 7 | 设计的调度算法实际效果不佳、反复调试 |
| 提交 | 3 | 在提交流水线测试时遇到较多问题 |
| 总计 | 22 | — |
十、项目收获与反思
算法思维:通过多次实验体会到调度系统设计中“全局最优”和“局部最优”的权衡。
团队协作:结对编程有效提升了沟通效率和代码质量。
AI辅助开发:我们使用 ChatGLM 与 Qwen3 协助生成部分框架代码,大幅节省时间,但仍需人工优化结构。
技术突破:掌握了 PyQt5 的异步数据交互、线程安全问题的处理。
