aps-agent/docs/algorithm/scheduling-cp-v1.md

70 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 排产算法 · CP-SAT / HYBRID v1(SC-03,工序级模型)
> 代码:`server/engines/cp_engine.py`
> 测试:`tests/golden/test_cp_engine.py`、`tests/golden/test_cp_operation_level.py`
> 工厂:`get_engine("CP"|"HYBRID")`
---
## 1. 范围
| 引擎 | 管线 |
| --- | --- |
| CP | CP-SAT 工序级选线+排序(Interval/NoOverlap/换型/冻结窗)→ 班次占槽 |
| HYBRID | RULE 策略序/选线 hint → CP-SAT 改良 → 班次占槽 |
诚实留痕:`engineType` + `solverMeta`(backend / model / pipeline / warmStart / status / gap / wallTimeSec / operationSlots / totalChangeoverMin / frozenCount)。
---
## 2. 工序级模型摘要(方向 D)
决策与约束(对应 plan.md §9.2a 约束目录):
| 约束 | 建模 |
| --- | --- |
| 选线(C5) | 每订单恰好一条可行产线(OptionalBoolVar 互斥);只保留全线工序均有可用工位的产线 |
| 工序区间(C1) | 每订单每道工序一个 `OptionalIntervalVar`(准备 + 数量×单件/效率),按工艺路线 `start[i+1] >= end[i] + 转移/等待` 串联 |
| 工位/设备独占(C2) | 同工位/设备上全部工序 `AddNoOverlap`(跨订单聚合);同线不同工位允许并行(流水语义) |
| 换型矩阵(C10) | 产线工序序列用 next-link 单链路径建模:相邻订单首工序间 `start >= 前序首工序 end + setup(族→族)`;同族/无前序为 0 |
| 冻结窗(C11) | `freezeWindowHours` 内已发布/`isFrozen` 工单作为 `FixedSizeIntervalVar` 障碍加入 NoOverlap;新排订单首工序不早于冻结窗末端 |
| 目标(C8/C9) | 加权延期最小化(客户等级 + 急单权重),与前版一致 |
其他说明:
- 无工艺路线或缺工位的产线不作为 CP 候选(物化阶段照常报 `NO_LINE`/`NO_WORKSTATION`,诚实留痕)。
- 二级资源当前采用「容量互斥」:同工位 NoOverlap;`Cumulative`(班组/工装等聚合容量)为后续扩展点。
- 换型 setup 落在相邻订单的首工序之间(与 RuleEngine 物化把跨族分钟叠到首道工序的语义一致);`solverMeta.operationSlots` 中 `changeoverMin` 标注在首工序槽位。
- 工序级 Interval 与物化的班次占槽是两个层面:CP 决定选线与开工序,物化仍按班次日历落槽(`placement=shift-slot`)。
---
## 3. solverMeta 新增字段
| 字段 | 内容 |
| --- | --- |
| `model` | `"operation-level+no-overlap+changeover+freeze"` |
| `operationSlots` | 每个订单每道工序:lineId / workstationId / sequenceNo / operationId / startMin / endMin / durationMin / setupMin / changeoverMin / isFrozen |
| `totalChangeoverMin` | 本版累计换型分钟(跨族 setup 求和) |
| `frozenCount` | 冻结窗内固定障碍工单数 |
---
## 4. 降级策略
| 场景 | CP | HYBRID |
| --- | --- | --- |
| 缺 ortools | `ENGINE_UNAVAILABLE` 空版本 | `DEGRADED_RULE` 物化 RULE 序 |
| 求解无可行解 | 保留启发式序 | 保留 warm 强制线 |
---
## 5. 未做
- LNS 大邻域 / 插单局部修复
- GA / NSGA-II 多目标
- 班组/工装 Cumulative 聚合容量进 CP
- 换型矩阵与冻结工单之间的跨窗 setup(冻结障碍不参与换型路径)
见 [roadmap.md](./roadmap.md)。