卷包产品级排产CP-SAT约束表设计说明 1
1. 文档目的
本文用于说明卷包产品级排产在 OR-Tools CP-SAT 中,如何将业务规则整理为“约束表”。
这里的约束表,本质上是一张翻译表:
- 业务规则
- 涉及变量
- 数学表达
- 约束类型(硬约束 / 软约束)
目标不是直接覆盖所有现场细节,而是先形成一版适合首期产品级排产模型的最小可用约束体系。
2. 变量口径
本文默认采用时间桶模型,计划周期已被离散为固定粒度的时间桶,例如按天、班次或小时建模。
2.1 核心索引
P:产品集合L:卷包线集合T:时间桶集合
如后续需要按订单交期精细控制,可补充:
O:订单集合
2.2 核心决策变量
x[p,l,t]表示产品p是否在产线l的时间桶t生产,类型为BoolVar。u[l,t]表示产线l在时间桶t是否开机,类型为BoolVar。q[p,l,t]表示产品p在产线l、时间桶t的排产量,类型为IntVar。c[l,t]表示产线l在t-1 -> t是否发生换牌,类型为BoolVar。short[p]表示产品p在计划周期结束后的未完成量,类型为IntVar。late[p]表示产品p在交期点的未完成量或延期量,类型为IntVar。delta[p,l,t]表示重排时该桶结果是否偏离原计划,类型为BoolVar,首版可选。
3. 最小可用硬约束表
首版产品级排产建议先落以下 8 条硬约束。
| 编号 | 业务约束 | 数学表达 | 类型 | 说明 |
|---|---|---|---|---|
| C1 | 单线单桶最多生产一个产品 | sum_p x[p,l,t] <= 1 | 硬约束 | 一个时间桶内一条线只能安排一个产品口径 |
| C2 | 开机才允许生产 | sum_p x[p,l,t] <= u[l,t] | 硬约束 | 未开机不能安排生产 |
| C3 | 产量受选择与能力限制 | q[p,l,t] <= cap[p,l,t] * x[p,l,t] | 硬约束 | 选中才允许有产量,且不能超过能力 |
| C4 | 需求守恒 | sum_l sum_t q[p,l,t] + short[p] = demand[p] | 硬约束 | 产品需求要么完成,要么记入欠产 |
| C5 | 最大同时开台数 | sum_l u[l,t] <= maxOpen[t] | 硬约束 | 同一时间桶开机数不能超过策略上限 |
| C6 | 不兼容机台禁止排产 | 若 compatible[p,l]=0,则 x[p,l,t]=0 | 硬约束 | 不允许不兼容产品上机 |
| C7 | 停机窗口禁止排产 | 若 available[l,t]=0,则 u[l,t]=0 | 硬约束 | 维护、保养、停机时段不能开机 |
| C8 | 交期前欠量计入延期 | late[p] >= demandDue[p,d] - sum_l sum_{t<=d} q[p,l,t] | 硬约束 + 目标 | 交期时未完成部分形成延期量 |
4. 各硬约束的业务解释
4.1 C1 单线单桶单产品
该约束保证单条卷包线在一个时间桶内不会同时安排多个产品,是最基础的资源互斥关系。
4.2 C2 开机关联
该约束用于防止“未开机却安排了生产”的脏解。若后续希望控制空开机问题,可在目标函数中进一步压缩 u[l,t]。
4.3 C3 能力约束
该约束将产品选择变量与产量变量关联起来:
- 当
x[p,l,t] = 0时,q[p,l,t] = 0 - 当
x[p,l,t] = 1时,q[p,l,t]不得超过该线该桶的最大产能
4.4 C4 需求守恒
这是排产模型对计划完成负责的核心约束。若业务要求必须全部排完,可将 short[p] 固定为 0;若允许少量欠产,则保留 short[p] 并在目标函数中给予高惩罚。
4.5 C5 最大同时开台数
该约束与现有策略中的 maxSimultaneousMachines 口径一致,用于限制同一时间桶的开机总数,防止超出车间组织能力。
4.6 C6 兼容性约束
若某产品不能在某条线生产,则直接将对应的 x[p,l,t] 固定为 0。这类约束应尽量在建模前置过滤,以降低求解规模。
4.7 C7 可用时间窗口约束
该约束用于表达计划停机、保养、不开班等场景。设备在不可用时段不得开机,自然也不能安排生产。
4.8 C8 交期约束
首版不建议一开始就将“不得延期”写成绝对死约束,更推荐采用“允许延期但代价极高”的方式。这样既能体现交期优先,又能降低模型无解风险。
5. 换牌相关约束
换牌是卷包产品级排产中非常关键的一类业务规则。
首版建议先采用简化变量:
c[l,t]:表示产线l在t-1 -> t是否发生换牌
典型表达如下:
c[l,t] >= x[p1,l,t-1] + x[p2,l,t] - 1,其中 p1 != p2
业务含义如下:
- 上一桶生产
p1 - 当前桶生产
p2 - 且
p1不等于p2 - 则本次切换必须触发换牌变量
c[l,t]
首版建议先将“是否换牌”建入模型,再将“少换牌”放入目标函数中优化。
若后续需要精细表达不同产品之间的不同切换时间,可升级为:
y[p1,p2,l,t]:表示是否从p1切换到p2
但该版本变量维度更大,更适合第二阶段扩展。
6. 软约束与目标项设计
在 CP-SAT 中,很多业务偏好更适合做软约束,而不是硬编码为必须满足的死规则。
6.1 典型软约束表
| 编号 | 业务偏好 | 表达方式 | 类型 |
|---|---|---|---|
| S1 | 尽量少换牌 | 最小化 sum_l sum_t c[l,t] | 软约束 |
| S2 | 尽量连续生产 | 最小化非连续切换次数或切换损失 | 软约束 |
| S3 | 尽量少开机 | 最小化 sum_l sum_t u[l,t] | 软约束 |
| S4 | 尽量均衡负载 | 最小化各线总负载偏差 | 软约束 |
| S5 | 重排时少扰动 | 最小化 sum delta[p,l,t] | 软约束 |
6.2 软约束的设计原则
- 硬约束决定“能不能这样排”
- 软约束决定“这样排好不好”
因此,像以下偏好更适合进入目标函数而不是首版硬约束:
- 少换牌
- 连续生产
- 少开机
- 负载均衡
- 少扰动
7. 约束表分层建议
为便于后续设计、评审和代码组织,建议将约束表分为两层。
7.1 第一层:硬约束
这些约束不满足时,方案直接无效:
- 单线单桶单产品
- 产能限制
- 兼容性限制
- 可用时间窗口
- 最大开台数
- 需求守恒
7.2 第二层:软约束
这些约束不一定必须满足,但决定方案优劣:
- 少换牌
- 连续生产
- 交期更优
- 更少开机
- 更均衡
- 更少扰动
这种“硬约束 + 优化目标”的分层方式,也与现有策略配置模型的结构相匹配。
8. 面向卷包产品级排产的一版推荐约束结构
从实现角度看,首版最推荐按以下业务模块组织约束。
8.1 资源占用类
C1单线单桶单产品C2开机才允许生产C5最大同时开台数C7停机窗口禁止排产
8.2 工艺能力类
C3产量受能力限制C6不兼容机台禁止排产
8.3 计划完成类
C4需求守恒C8交期前欠量计入延期
8.4 切换连续类
- 换牌触发约束
- 少换牌目标
- 连续生产目标
8.5 重排稳定类
delta相关扰动约束- 最小扰动目标
9. 总结
变量表回答的是“模型要决定什么”,
约束表回答的是“这些决定必须遵守什么规则”。
对于卷包产品级排产,首版不建议一开始就把所有现场细节都塞进主模型,而应优先写稳以下主链路:
- 一条线一个时间桶生产什么
- 能生产多少
- 能不能生产
- 会不会超出开台上限
- 能不能按期完成
- 换牌是否过多
在此基础上,再逐步扩展烟丝批次、精细换牌、库存联动和局部重排等更复杂能力,会更稳妥。

