Skip to content

卷包产品级排产CP-SAT约束表设计说明 1

About 2130 wordsAbout 7 min

apscpsat

2026-06-05

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] 表示产线 lt-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]:表示产线 lt-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. 总结

变量表回答的是“模型要决定什么”,
约束表回答的是“这些决定必须遵守什么规则”。

对于卷包产品级排产,首版不建议一开始就把所有现场细节都塞进主模型,而应优先写稳以下主链路:

  • 一条线一个时间桶生产什么
  • 能生产多少
  • 能不能生产
  • 会不会超出开台上限
  • 能不能按期完成
  • 换牌是否过多

在此基础上,再逐步扩展烟丝批次、精细换牌、库存联动和局部重排等更复杂能力,会更稳妥。

求求了,快滚去学习!!!

求求了求求了,快去学习吧!

【LeetCode】贪心算法
【LeetBook】数组和字符串

不知道方向的时候,可以多看看书,书会给你指明下一步该干什么,加油!