电梯调度算法结对编程作业
项目仓库地址:
https://z.gitee.cn/zgca/repos/zgca/elevator_arrange/blob/develop/
1、项目简介
本次项目以结对编程形式开发一套完整的电梯调度系统,核心目标是在多电梯、多楼层、高并发乘客请求场景下,实现“乘客等待时间最小化”与“电梯运行效率最大化”的平衡。团队由 3 人组成,技术栈选择 Python 作为核心开发语言,结合 Elevator-Saga 模拟器接口,构建了“优化版调度算法 + Web 可视化监控”的双层架构:
算法层:专注调度决策,不耦合展示逻辑;监控层:独立拉取数据,实时渲染状态。二者既可独立替换,又能高效协同。
2、PSP表格
项目开发前,我们通过 PSP 表格规划时间;开发后复盘实际耗时,明确时间差异根源。
| 模块需求 | 预计时间 | 实际时间 | 差异原因 |
| 需求分析 | 2h | 2h | 需求清晰(聚焦调度与可视化),仅需确认接口适配规则,无额外沟通成本。 |
| 架构与设计 | 3h | 4h | 新增“动态分区”与“预判调度”功能,需额外设计分区逻辑与高峰时段判定规则。 |
| 编码实现 | 5h | 8h | 原计划用基础 SCAN 算法,实际优化为“多维度评分派梯”,需额外实现评分模型与能耗计算。 |
| 测试调试 | 2h | 8h | 发现“高峰时段分区冲突”“乘客等待时间统计偏差”等问题,需针对性修复 。 |
| 重构与优化 | 3h | 6h | 为实现“算法与监控解耦”,重构数据交互逻辑,将“算法传数据”改为“监控拉数据”。 |
| 合并讨论 | 2h | 6h | 在实际中合并时,会出现主要针对GUI界面设计的大讨论,就需要在多个方案中抉择。 |
| 提交验收 | 1h | 2h | 远程仓库流水线测试需适配环境变量,调试接口兼容性花费额外时间。 |
- 差异分析:
1.万事“开头第二步”难:需求分析通常不用花费太多时间,但是真正开始做就会考虑到,例如在架构与设计中,就曾针对如何更好调度以及结果如何呈现,出现了分歧,最终确定在助教老师的基础上补充功能实现。
2.做起来跟想起来不一样:原本的计划是添加功能,其实在我们看来也就是加些判断函数,令其遵守规则即可,但实现过程中会出现难以想象的报错。
3.不断讨论不断否认:讨论起来有时候会局限于自己思维,但是其实他人的有些意见会使得你觉得他的想法更好,就会不断地去改进自己的原本的算法和界面,时长就不自觉地增加。
3、核心架构:松耦合设计实现“可替换、可扩展”
为满足“算法与监控可独立替换”的需求,我们采用“数据分离 + 接口标准化”思路,分两版迭代实现解耦。
3.1. 初版:基础分离(数据暂存)
算法层:监听模拟器事件,将电梯状态、乘客信息暂存到本地字典。
监控层:定时读取该字典更新界面。
问题:监控依赖算法运行状态,无法独立启动。
3.2. 优化版:彻底解耦(监控主动拉取)
算法层:仅通过 OptimizedElevatorController 类调用模拟器接口控制电梯,不处理任何展示逻辑。
监控层:通过 WebMonitorSystem 类每秒轮询服务器,直接拉取原始数据,独立完成解析与渲染。
优势:算法可替换为 FCFS、LOOK 等其他实现;监控也可切换为 PyQt5 界面,只需保持“从服务器拉数据”的接口一致。
4、Web 监控系统:可视化 + 实时性双保障
4.1. 界面设计:三区布局,响应式适配
电梯状态区:卡片式展示编号、楼层、方向(↑/↓)、负载(3/10)、目标楼层列表,状态颜色标识。
统计面板区:实时显示总呼叫数、完成行程数、平均等待时间、各电梯能耗。
系统日志区:倒序事件日志,按 info/warning/error 分色,便于排查。
4.2. 技术实现:轻量 HTTP 服务 + 差异更新
后端:Python HTTPServer 提供 /(HTML)和 /api/data(JSON)接口。
前端:ElevatorMonitor 类每秒轮询,仅更新变化内容,减少 DOM 操作。
动画反馈:方向箭头脉冲、进度条加载,提升交互体验。
4.3. MVC 模式落地
Model:从模拟器拉取的原始状态数据;
View:HTML 元素动态生成;
Controller:ElevatorMonitor 负责数据处理与视图触发。
5、结对编程:“驾驶员-导航员-审核员”三人协作
在传统结对基础上,新增“审核员”角色,形成闭环:
- 驾驶员:编码实现(如评分计算);
- 导航员:把控逻辑(如提醒考虑高峰场景);
- 审核员:检查规范与边界(如满载派梯逻辑)。
每 2 小时轮换角色,确保全员深度参与。
协作亮点:
- 利用 GPT5 和豆包生成基础框架(如 HTML 结构),节省 50% 编码时间;
- 即时文档同步进度,避免重复开发;
- 三明治沟通法反馈:先肯定成果,再提“硬编码”等改进点,最后鼓励。
结对编程图片

6、项目收获与反思
通过结对编程能够认识到原来不同学科背景同学的思维方式,例如原来AI专业的明显更懂并且对解决这些问题的思考明显更为专业,更关注做什么;而非AI专业的更多的倾向于思考的是这个问题怎么去做,要用什么方法这样子。通过本次结对编程作业的完成,个人认为具备了以下几种能力:
- git的使用以及团队协作完成项目;
- 真正从生活中的需求出发来解决问题,从原本论文的理论创新思路转变为工程上思考的应用思路;
- GUI界面的设计以及与算法的对接。
- 与AI交流中更能专业地描述自己的需求,例如让其分模块为我们提供建议而不是整体生成后再去理解。
队友的博客地址如下:https://blog.csdn.net/m0_60143612/article/details/153918790

浙公网安备 33010602011771号