电梯调度算法结对编程作业

项目仓库地址:

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% 编码时间;
  • 即时文档同步进度,避免重复开发;
  • 三明治沟通法反馈:先肯定成果,再提“硬编码”等改进点,最后鼓励。

 

结对编程图片

微信图片_20251025214602_129_576

 

6、项目收获与反思

通过结对编程能够认识到原来不同学科背景同学的思维方式,例如原来AI专业的明显更懂并且对解决这些问题的思考明显更为专业,更关注做什么;而非AI专业的更多的倾向于思考的是这个问题怎么去做,要用什么方法这样子。通过本次结对编程作业的完成,个人认为具备了以下几种能力:

  • git的使用以及团队协作完成项目;
  • 真正从生活中的需求出发来解决问题,从原本论文的理论创新思路转变为工程上思考的应用思路;
  • GUI界面的设计以及与算法的对接。
  • 与AI交流中更能专业地描述自己的需求,例如让其分模块为我们提供建议而不是整体生成后再去理解。

 

队友的博客地址如下:https://blog.csdn.net/m0_60143612/article/details/153918790

 

posted @ 2025-10-27 16:48  Bingzheng  阅读(29)  评论(1)    收藏  举报