混合整数线性规划
一、直观理解:开关是整数,流量是连续的
混合整数线性规划(Mixed-Integer Linear Programming, MILP)同时包含:
- 整数 / 0-1 变量:开不开厂、用不用某条线、第几天检修;
- 连续变量:产量、运输量、库存、功率。
现实中的计划问题几乎都是这种「骨架离散、血肉连续」的结构。例如:
- 是否启用某台机器(0-1),启用后在产能范围内连续安排工时;
- 是否建设配送中心(0-1),建成后连续分配客户需求量;
- 是否在某时段充电(0-1),充电功率连续可调。
MILP 仍要求目标与约束对所有变量是线性的。它是数学建模里处理复杂运营决策的「首选重型武器」:能建 MILP 并在时限内求得可接受间隙,就不要先上智能优化。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 生产计划与排程、设施选址+运输、库存-路径、电网机组组合(简化线性)、项目选择+资源连续分配、带固定成本的网络设计。 |
| 核心优点 | 表达力远强于纯 LP;精确求解器(intlinprog 等)可给界与证明;固定成本、逻辑、分段线性(多段)均可建模。 |
| 局限与缺点 | 计算难度通常由整数部分主导;弱公式导致长时间高间隙;非线性物理规律需近似;调参与建模经验要求高。 |
使用前确认:
- 整数变量是否必要、能否减少;
- 固定成本、若则逻辑是否用紧的大 M 或 indicator 思路表达;
- 连续部分上下界是否合理;
- 可接受的时间与 gap;
- 是否有自然分解(先选址后分配等)便于检验。
三、核心原理:LP 松弛 + 离散决策
1. 标准形式
连续, 整数。求解仍主要依赖 Branch-and-Cut:对整数分量分支,节点上解 LP 松弛。
2. 固定成本结构
活动水平 ,是否开展 ,固定成本 ,变动成本 :
无 时强制 且不付 ;有 时付 且 可至 。
3. 分段线性(凸/非凸)
成本随用量呈折线时,可用多个连续片段变量 + 0-1 选择段,或用特殊有序集(SOS2)思想。非凸分段必须借助整数,否则 LP 会「抄近路」。
4. 与纯 IP、纯 LP 的关系
- 无整数 → LP;
- 无连续 → 纯 IP / 0-1;
- MILP 是二者的合流,也是多数竞赛「规划类」大题的最终形态。
四、关键决策
1. 公式强度(formulation strength)
同样逻辑,不同不等式的 LP 松弛可紧可松。优先:
- 最小必要大 M;
- 聚合并约束、覆盖不等式等;
- 避免把本可连续的量设为整数。
2. 尺度与单位
连续流量可能是 ,0-1 系数是 ,注意约束中系数平衡,必要时缩放连续变量。
3. 初始可行解
先用启发式构造一组可行的 ,再让求解器改进并证明,常比冷启动快。
4. 终止与报告
设定 MaxTime、RelativeGapTolerance。终稿必须写清:是否最优、gap、时间、机器环境(可选)。
5. 验证
固定所有整数变量后,剩余应是 LP,可用 linprog 复核连续部分;也可固定 做 what-if 分析。
五、MATLAB 示例
带固定成本的生产:两种产品,连续产量 ;是否生产 。
% 变量 z = [x1; x2; y1; y2]
f = [3; 4; 20; 15];
% x1 + x2 >= 10 -> -x1 -x2 <= -10
% x1 - 8 y1 <= 0
% x2 - 9 y2 <= 0
A = [
-1, -1, 0, 0;
1, 0, -8, 0;
0, 1, 0, -9
];
b = [-10; 0; 0];
lb = [0; 0; 0; 0];
ub = [8; 9; 1; 1];
intcon = [3, 4]; % 仅 y 为整数(0-1)
opts = optimoptions("intlinprog", ...
"Display", "iter", ...
"MaxTime", 60, ...
"RelativeGapTolerance", 1e-4);
[z, fval, exitflag, output] = intlinprog( ...
f, intcon, A, b, [], [], lb, ub, opts);
x = z(1:2); y = z(3:4);
fprintf("exitflag=%d, 成本=%g, gap=%g\n", ...
exitflag, fval, output.relativegap);
fprintf("产量 x = [%.4f, %.4f], 开关 y = [%g, %g]\n", ...
x(1), x(2), y(1), y(2));
% 固定 y 后用 LP 复核
yFix = round(y);
A_lp = [-1, -1; 1, 0; 0, 1];
b_lp = [-10; 8*yFix(1); 9*yFix(2)];
[x2, f2] = linprog([3;4], A_lp, b_lp, [], [], [0;0], [8;9]);
fprintf("固定 y 后连续最优成本(含固定成本)= %g\n", ...
f2 + 20*yFix(1) + 15*yFix(2));
选址-分配(有容量)也可写成 MILP:0-1 建仓 + 连续运量,容量约束 。
六、如何解释结果
完整结果应包括:
- 整数决策(开哪些、选哪些)与连续决策(产多少、运多少)分开陈述;
- 总成本/利润构成:固定部分 vs 变动部分;
- 容量与逻辑约束是否绑紧;
exitflag、相对间隙、求解时间;- 与「强制全开」「全关不可行」等对照方案的差值;
- 管理含义:固定成本是否被规模摊薄、哪个设施处于临界。
好的表述:「仅开启产线 2,产量 10,总费用 55;若两线都开,变动成本下降但固定成本上升,总费用反而更高。」
七、常见误区
1. 把 MILP 当成「LP 加 round」
整数与连续耦合时,圆整连续最优通常既不正也不优。
2. 所有变量都标成整数
产量本可连续却设为整数,只会更慢;只对真正离散的决策用 intcon。
3. 固定成本用非线性写法
不能直接进线性求解器;必须引入 0-1 与 。
4. 间隙很大仍当精确最优
报告「当前最好方案」与「下界」两者,避免误导。
5. 过早转向遗传算法
先改进公式、加界、给初值、延长时间;确认精确法不可行后,启发式才能作为兜底,并与 MILP 下界比较。
6. 忽略不可行诊断
需求超过「全部设施开启」的总容量时模型必不可行。先做最大流/简单容量检查。
八、小结
混合整数线性规划的核心思想可以概括为:
用整数变量编码离散结构,用连续变量描述数量流动,在全部线性约束下联合优化;求解器通过松弛与分支给出可行方案及最优性间隙。
它是连接「逻辑选择」与「资源配置」的标准框架,应作为复杂运营类题目的首选。写紧公式、分清变量类型、诚实报告 gap,再考虑是否需要非线性或智能优化扩展。