求解运行与性能
候选池怎么变成决策结果、求解规模多大、多久出结果、超时了怎么办。核心是两件事:过滤规则要可解释,超时必须降级而不是失败。
i业务价值:O15 —— 决策批次是有时间窗的(凌晨 02:10 起跑,必须在出单前完成)。行业实践是"分品类拆网 → 贪心/最小成本流 → 局部 MIP 精修"分层求解,并设硬超时与降级启发式:宁可给一个稍差但按时可用的方案,也不能让整批决策失败。前置条件:候选池生成规则、分层拆网配置、超时阈值与降级策略、批次快照可回溯(否则事后无法复算)。功能编号 O15O10G1
候选池行数
14,968行
规则生成的款店组合
决策结果行数
330行
过滤率 97.8%
总耗时
4分12秒
SLA ≤ 10 分钟
硬超时阈值
180秒
超时自动降级启发式
MIP gap
0.8%
达到 1.0% 即提前收敛
降级次数
0次
本批次未触发降级
候选池 → 决策结果:过滤规则逐步拆解
业务误读高发区:14,968 与 330 是两个口径,分母不同不可直接比较O15D5
STEP 1
取候选池
14,968 行
STEP 2
字段过滤
6,240 行
STEP 3
约束过滤
2,180 行
STEP 4
门槛过滤
880 行
STEP 5
收益过滤
412 行
STEP 6
包裹合并
330 行
| 步骤 | 过滤规则(可解释) | 输入行数 | 输出行数 | 剔除行数 | 累计过滤率 | 耗时 |
|---|---|---|---|---|---|---|
| ① 取候选池 | 目标库存 > 现有库存(含在单在途)的款店组合,按品类拆网 | — | 14,968 | 0 | 0.0% | 18s |
| ② 字段过滤 | 关键字段缺失(门店画像/陈列容量/尺寸曲线)、未进入模型(#999999)、脏数据 | 14,968 | 6,240 | 8,728 | 58.3% | 42s |
| ③ 约束过滤 | 不允许调出(#ff595e)/ 不允许调拨入(#896bb3)/ 不允许补货入(#3e8965)/ 保护期内 | 6,240 | 2,180 | 4,060 | 85.4% | 56s |
| ④ 门槛过滤 | 缺口 < 起调量 2 件、单包裹 < 2 件、单店包裹 > 15 个、全国库存 < 80 件集中处理 | 2,180 | 880 | 1,300 | 94.1% | 38s |
| ⑤ 收益过滤 | 调拨收益 ≤ 0(X4)、追单未通过五项检查、清货回收额 < 物流成本 | 880 | 412 | 468 | 97.2% | 31s |
| ⑥ 包裹合并 | 同调出门店同线路合并包裹、尺码凑整(SKC→SKU 分解后) | 412 | 330 | 82 | 97.8% | 27s |
候选池 14,968 行 → 决策结果 330 行,逐级可解释;每一级都可下钻到被剔除的具体行每页
求解规模与分层策略
分品类拆网 → 贪心/最小成本流 → 局部 MIP 精修O10
| 层级 | 方法 | 规模 | 耗时 | 状态 |
|---|---|---|---|---|
| L1 分品类拆网 | 按中类 + 区域拆成独立子网络(外套/针织/裙装/裤装/羽绒/衬衫/大衣) | 7 个子网 / 14,968 行 | 1分38秒 | 完成 |
| L2 贪心初始解 | 就近分配 + 缺口优先(TOP 款优先、销量大优先) | 2,180 行候选 | 46 秒 | 完成 |
| L3 最小成本流 | 区域内调拨作为线性网络流求解(运输问题) | 2,180 行 → 412 行 | 21 秒 | 完成 |
| L4 局部 MIP 精修 | 仅对跨区 + 固定费用 + 起调量的争议行求 MILP,设 gap 1.0% | 66 行 / 24 个包裹变量 | 1分03秒 | gap 0.8% |
| L5 包裹后处理 | 包裹合并、凑整、2 件起调与 15 包裹上限校验 | 412 → 330 行 | 24 秒 | 完成 |
合计 4 分 12 秒;分层的关键是"先降维再精确",不要把 1.5 万行整体送进 MILP每页
求解过程监控
每一步都可断点续跑,失败不从头再来STEP 1
候选池
02:10:00
STEP 2
字段过滤
02:10:42
STEP 3
约束过滤
02:11:38
STEP 4
分层求解
02:12:14
STEP 5
出单
02:14:12
02:10:00 · 取数窗口开启
载入决策日快照 14,968 行候选(冻结快照 ID SNAP20251021)
02:10:42 · 字段过滤完成
剔除 8,728 行(字段缺失 6,912 / 未进入模型 926 / 脏数据 890)
02:11:38 · 约束过滤完成
剔除 4,060 行(不允许调出 3,120 / 不允许调拨入 640 / 不允许补货入 300)
02:12:14 · 分层求解启动
7 个子网并行,并发度 4;L4 局部 MIP 求解中(gap 0.8%)
02:14:12 · 求解完成
330 行决策结果,耗时 4 分 12 秒,未触发降级
02:15:00 · 待出单
等待人工确认后下发 WMS
求解耗时分布(近 32 个批次)
越稳定越可信:耗时波动主要来自 L4单批次耗时(秒)均值 268 秒 / 峰值 312 秒 / SLA 600 秒
- P50 耗时
- 268 秒
- P95 耗时
- 312 秒
- 最慢环节
- L4 局部 MIP(1 分 03 秒,占 25%)
- 并发度
- 4(受 ERP 取数接口限流约束)
- 超时告警
- 耗时 > 480 秒触发预警;> 600 秒判定 SLA 违约
硬超时与降级启发式
宁可给稍差但按时的方案,也不能整批失败降级必须留痕
降级方案与正常方案在决策表里必须可区分(标注"降级启发式解 + 未达 gap 目标"),并且强制人工复核。最怕的是降级了但业务看不出来,把近似解当成最优解执行。
资源与瓶颈
规模上限与压测基线
- 当前规模
- 382 SKC × 85 门店 = 32,470 组合(14,968 行候选)
- 设计上限
- 2,000 SKC × 400 门店 = 800,000 组合
- 压测基线
- 80 万组合下分品类拆网后单子网 ≤ 12 万行,L2+L3 ≤ 90 秒
- 推荐配置
- 32 核 / 32 GB / MIP 许可 4 并发
- 扩展策略
- 拆网粒度从"中类"细化到"中类 + 价格带"
异常与兜底
| 异常 | 触发条件 | 处理 |
|---|---|---|
| 求解超时 | 单子网 > 60s | 该子网降级为贪心解 |
| MIP 不可行 | 约束互斥 | 放松起调量 → 再放松跨区 |
| 快照缺失 | 无决策日快照 | 任务中断并告警(不可复算) |
| 取数延迟 | POS 延迟 > 6h | 按门店剔除该店候选 |
| 内存溢出 | > 28 GB | 拆网粒度细化 + 落盘中间解 |
!口径提示:本页所有比例的分母都是候选池 14,968 行(不是决策结果 330 行)。第 ② 步剔除 8,728 行里,"未进入模型"(#999999)占 926 行 —— 这一项最容易被业务误读成"模型漏算了",实际是本次决策范围之外的款店组合,需在导出说明里写清楚。