CTS2025 算法大赛获奖队伍算法总结
总体观察
CTS2025 的机组排班问题本质是一个带大量业务规则的组合优化问题:航班必须尽量覆盖,机组必须满足资质、时间、地点衔接、休息和值勤周期规则,同时还要控制置位、外站过夜、新增过夜机场和违规扣分。获奖队伍的方案虽然实现路径不同,但可以归纳出四个共同判断:
- 直接做全量整数规划很难。 航班、机长、占位任务、可过夜机场和大巴/飞行置位组合后,变量规模会迅速膨胀。
- 图模型是共同底座。 有的队把节点设为航班,有的队把节点设为机场-时间状态,有的队把弧升级为完整 FDP。
- 高质量初始解决定上限。 贪心、DFS、反向推演等方法用于快速构造可行解,避免后续算法从过差的解开始。
- 后处理负责补质量。 列生成、ALNS、遗传算法、模拟退火、Diving 取整等方法用于改进覆盖、飞时、置位和过夜。
iLorD:列生成 + 迭代分批释放
iLorD 队的主线是“基于列生成的迭代分批与释放算法”。该方案更接近运筹优化中的精确建模路线:先构造航班/占位/过夜节点组成的时空网络,再把每个机长的一条完整排班路径作为主问题中的一个列。

建模方式
主问题中的核心变量是 x_pk:是否把机长 k 的路径 p 选入方案。航班和占位任务如果没有被任何路径覆盖,则用取消变量表示并计入惩罚。约束包括:
- 每个航班要么被一条机长路径覆盖,要么记为未覆盖;
- 每个占位任务要么被路径覆盖,要么记为未覆盖;
- 每个机长最多选择一条路径;
- 路径内部已经通过子问题保证资质、时间、地点、休息、置位和值勤周期可行。
算法流程
列生成直接在全体机长上跑会非常重,因此 iLorD 引入“分批 Batch + 释放 Release”:
- 分批策略:优先选择值勤/休息占位任务多、可执飞航班多的未排班机长,让难度较高的资源先进入优化。
- 释放策略:当仍有未覆盖航班时,释放能覆盖这些航班的已排班机长;当方案利用率低时,优先释放日均飞时低的机长。
- 子问题:使用多标签最短路生成新路径,标签记录成本、值勤日内任务数、飞行时间、总飞行时间、休息时间、周期日历天数、置位位置等状态。
- 支配规则:如果一个标签在成本、任务数量、飞行时间、休息和周期状态上都不劣于另一个标签,就删除劣势标签,压缩搜索空间。
- Diving 取整:RMP 线性松弛产生大量非整数变量时,选取接近 1 的变量临时取整并重新求解,逐步得到整数方案。
该路线的优势是质量高、约束表达完整,适合追求全局质量;代价是实现复杂,依赖高效子问题、并行和求解器。
NJUORLAB:启发式初解 + FDP 网络列生成
NJUORLAB 的方案是“启发式与精确算法融合”。它不是直接在航班网络上做列生成,而是先生成合法 FDP,再把搜索粒度提升到 FDP 网络。

两阶段框架
第一阶段用启发式方法构造可行初解:
- 为每个机组创建
CrewSchedule; - 用 DFS 搜索候选任务序列;
- 每加入航班或大巴任务,都检查时间衔接、值勤日状态、飞行周期和置位合法性;
- 用破坏重建和模拟退火做局部优化;
- 在最后阶段扩大 DFS 分支数,提高覆盖航班数。
第二阶段进入列生成:
- 离线生成所有合法 FDP;
- 对每个机组按资质、基地、初始位置和占位任务过滤可执行 FDP;
- 构建个性化 FDP 时空网络并序列化到磁盘;
- 在线列生成时读取网络,根据主问题对偶价动态更新弧收益;
- 使用 Beam Search 在 FDP 网络中找高检验数路径。

关键创新
传统 SPPRC 子问题如果以航班为基本单元,状态会非常复杂。NJUORLAB 把弧定义为完整合法 FDP,节点是 (机场, 时间),一条弧代表相同起终点节点之间的若干 FDP,并把弧收益设为这些 FDP 的最大收益。这样在线求解时只需要在更高层 FDP 网络中搜索,Beam Search 可以在速度和质量之间做平衡。
ORA 队:DFS 初始解 + ALNS 改进
ORA 队采用的是典型的“构造启发式 + 大邻域搜索”路线。它把问题拆成单个机长的周期规划,先用 DFS 生成初始排班,再用 ALNS 对低质量部分进行破坏和修复。

初始解构造
ORA 先按“值 4 休 2”规则和地面占位任务,把每个机长在计划期内的可用时间切成多个飞行周期。对于每个周期:
- 根据机长资质和时间安排筛选可行航班;
- 单值勤日内从可安排航班或大巴出发做 DFS;
- 对每条候选任务链按覆盖、飞时、置位、过夜和违规等指标评分;
- 从 top-K 方案中随机选择一个,避免完全贪心导致路径单一;
- 周期结束后安排置位,让机长回到基地或合适位置。
ALNS 改进
ALNS 阶段的核心是“选择部分机长,拆掉他们现有排班,再重新构造”:
- 基于约束违反的破坏:优先破坏扣分高、违规多的机长排班;
- 基于日均飞时的破坏:优先破坏日均飞时低的机长排班;
- 构造修复:对被破坏机长重新调用 DFS;
- 最优修复:每轮遍历修复候选,先固定得分最高的机长方案,再删除其使用航班,继续修复剩余机长。
这种方法工程上相对直观,适合规则复杂但需要快速迭代的场景。
前进四:航班连接图 + 边类型优先级
前进四队使用航班连接有向图建模。节点是航班,边表示两个航班在机场和时间上可衔接。算法按起飞时间遍历航班,相当于沿航班连接图的拓扑顺序做分配。

核心模型
每个航班节点包含起降机场、起降时间、尾号和飞行时间。有向边 A -> B 成立需要满足:
A.to == B.from;A.sta + min_connect <= B.std;- 飞行和值勤时间不超过规则上限。
初版逐航班选择机长,容易因为过早分配导致后续航班无人可接。后续优化是给边增加类型:
type=0:同尾号且可直接连接;type=1:普通直接连接;type=2:通过飞行置位连接;type=3:通过大巴置位连接。
分配当前航班后,算法优先沿 type=0 延伸,再尝试 type=1/2/3,尽量把连续高质量航段留给同一个机长。该算法复杂度低、速度快,适合作为初始解生成器;PPT 中也提到后续可接遗传算法、模拟退火或强化学习继续调优。
只会贪心:个性化任务图 + DP 剪枝 + 遗传算法
只会贪心队同样采用图模型,但它为每个机组构建个性化任务图,并在图上搜索源点到汇点的高得分路径。

图上搜索
每个任务节点可以有双重身份:飞行任务或飞行置位。如果一个航班已经被其他机组执飞,当前机组仍可把它作为置位任务使用。这个状态切换不需要重构图,复杂度是 O(1)。
路径搜索时,算法给不同任务赋分:
- 飞行任务加分;
- 置位任务扣分;
- 占位任务和回基地路径有额外处理;
- 外站过夜、未回基地等产生惩罚。
由于任务图是 DAG,同一节点天然不会重复访问。算法用支配规则删除劣势路径:如果路径 A 在得分、开始时间、任务时间、飞行时间等维度都不劣于路径 B,则 B 不再保留。这样图上搜索接近动态规划。
遗传算法优化顺序
PPT 中指出机组处理顺序会显著影响结果,因此外层用遗传算法优化“机组排列”:
- DNA 是机组处理顺序;
- 适应度是贪心搜索后的总得分;
- 使用精英保留;
- 使用顺序交叉;
- 使用交换、反转、插入等变异;
- 多线程并行评估。
它的经验结论是:贪心可以在十几秒生成较高质量初解,遗传算法继续提高分数;但单值勤日视角仍会限制跨值勤日协调。
章鱼哥的紧箍咒:反向推演 + 两阶段抢任务 + ALNS
章鱼哥的紧箍咒队强调“计划期截断”和“初始机组分布不均”带来的路径依赖。它先从计划期末反向推演一个理论终局状态,再决定哪些机组可以锁定、哪些机组需要释放重排。

反向推演
反向推演的目标是估计每个机组更理想的初始位置:
- 从最后降落的航班开始,按到达时间从晚到早处理;
- 以当前航班作为“终点”,寻找前序航班,构造反向 FDP;
- 得到每个被分配任务机组的理论最优计划;
- 取反向计划最早出发机场作为理想初始位置。
第二阶段判断机组当前 StayStation 是否与理想初始位置一致,或者能否通过一次置位到达。如果可以,就锁定反向推演得到的任务链;否则把任务释放回任务池,交给正向贪心重排。
迭代优化
该方案后续使用三类改进:
- 低任务量机组重构:找出任务量少、排班零散的机组,以 Crew 为中心重新构造任务链;
- 两阶段抢任务:先 8 人小组、后 4 人小组,在小范围内重新分配任务,提高局部总分;
- ALNS:使用随机、最差、关联、未覆盖等破坏算子,修复时采用贪心,并用模拟退火式接受准则允许少量劣解跳出局部最优。
这个方案的核心价值在于把“初始位置”纳入优化,而不是默认所有机组从计划期初自然可用。
横向比较
| 队伍 | 核心建模 | 初始解 | 改进方法 | 适合借鉴的点 |
|---|---|---|---|---|
| iLorD | 时空网络 + 机长路径列 | DFS/VNS 初始列 | 列生成、分批释放、Diving | 高质量全局优化、对偶价驱动 |
| NJUORLAB | FDP 时空网络 | DFS + 破坏重建 | 列生成、Beam Search | FDP 粒度子问题、离线网络缓存 |
| ORA | 单机长周期与任务链 | DFS top-K | ALNS | 易落地的大邻域搜索框架 |
| 前进四 | 航班连接 DAG | 拓扑顺序贪心 | 边类型优先级 | 快速初始解、连接类型建模 |
| 只会贪心 | 个性化任务图 | 图上路径搜索 | 遗传算法优化顺序 | 支配规则、DP 剪枝、状态切换 |
| 章鱼哥 | 反向 FDP + 正向贪心 | 反向推演锁定 | 两阶段抢任务、ALNS | 初始位置修正、小组局部重排 |
对当前系统建设的启发
- 先做稳定航班环/FDP 层。 当前系统已有航班-only 组环,后续可以把“环”扩展为 FDP 或任务串,作为排班算法的上层输入。
- 保留人工锁定和算法补剩余。 多队方案都依赖“锁定一部分高质量结构,再释放低质量部分重排”的思路;这与当前人工预组环锁定机制一致。
- 后续算法可以分层演进。 第一层用贪心/DFS 快速覆盖航班,第二层用 ALNS 或两阶段抢任务做局部重排,第三层再引入列生成或对偶价。
- 规则检查要成为搜索状态的一部分。 iLorD 和 NJUORLAB 都把休息、值勤、置位、周期等约束编码进标签或 FDP 合法性中;否则后处理会产生大量不可修复违规。
- 机场位置和计划期边界要提前处理。 章鱼哥的反向推演说明,计划期开始时的机组分布会显著影响结果;后续粗排需要显式建模初始位置、基地和可置位策略。
- 性能工程很重要。 支配规则、哈希查询、预排序、离线网络序列化、并行求解和 Beam Search 都是把算法从可运行推到可控时间的关键。