单机多周期生产计划模型里有一条约束 p_t ≤ M · y_t:p_t 是第 t 天的产量(连续变量),y_t 是设备当天是否开机的 0-1 变量,设备真实日产能上限是 120 件。同事把 M 直接写成 100000,理由是“写大一点免得约束误伤”。请回答:(1) 这样写会带来什么后果,为什么;(2) 你会怎么确定这个 M,并说明 M 必须满足什么条件,模型才和原意等价。
面试官在考什么
判断候选人是否把 big-M 只当成一个“大数”,还是理解它同时是逻辑开关和隐含上界,以及它的大小如何影响 LP 松弛强度和求解时间。
回答框架 · 前两步
- M 太大时,y_t = 0 让约束几乎不起作用(p_t ≤ 100000),LP 松弛里求解器可以一边把 y_t 松成很小的分数值、一边保持 p_t 很大,松弛下界离真实最优很远,分支定界节点数暴涨、求解时间显著变长,还容易带来数值精度问题。
- M 必须取 p_t 真实上界的紧上界(M ≥ max p_t)。取小了会静默切掉可行解:比如实际存在加班到 150 的可行方案,M = 120 时模型不报错,只是返回一个次优“最优解”。
还有 3 条答案要点、 3 层追问、 4 个常见坑, 以及针对你简历的追问路径,在定制报告里。
同一能力域的其他题
- 你简历里用到了线性规划做工艺参数优化。请说明:当约束中出现「某两个参数不能同时取高值」这类互斥条件时,你是如何把它写进模型的?如果求解器返回 infeasible,你怎么定位是哪条约束导致的?
- 5 个工人、5 项任务的一对一指派问题,用 0-1 变量 x_ij 建模,目标是最小化总工时。你发现直接解 LP 松弛(把 x_ij ∈ {0,1} 放松成 0 ≤ x_ij ≤ 1)得到的解自动就是整数,根本不需要分支定界。现在客户加了一条约束:“任务 A 和任务 B 不能由同一个人做”,写成 x_Aj + x_Bj ≤ 1(对每个工人 j)。请说明:(1) 为什么原模型的 LP 松弛天然给整数解;(2) 加了这条约束之后还能不能保证,如果不能,你会怎么处理这个模型。
- 你需要为一个运输问题建模:10个供应点,20个需求点,最小化运输成本。原本的运输问题约束矩阵是全幺模的,LP松弛直接得到整数解。现在业务要求:每条运输路线如果使用,需要支付一次性固定费用(例如1000元),且每条路线有容量上限。请问:这个问题属于什么类型?LP松弛会得到什么性质解?如果LP松弛得到分数解,你如何判断是否需要精确求解整数解,还是可以用LP解四舍五入?
- 一个跨工厂的产能分配问题被建成线性规划:约 800 个变量、300 条约束,求解在秒级完成。但输出里出现“0.4 号产线”“1.7 个班组”这类不可执行结果。业务要求每周排一次、凌晨批处理窗口 30 分钟,且允许目标值比理论最优差 1%。你作为技术负责人,怎么判断哪些变量必须整数化、哪些可以保持连续?如果整数化后求解时间涨到小时级,你的降级路径和与业务的精度口径怎么定?请给出可落地的决策规则。
- 某车间只有一台设备,每天可用 6 机时、9 kg 原料。生产一件 A 用 1 机时、3 kg 原料,利润 5 元;生产一件 B 用 2 机时、1 kg 原料,利润 4 元。A、B 的产量必须是非负整数。请回答:(1) 写出这个整数规划模型;(2) 求出 LP 松弛的最优解和整数最优解,两者目标值差多少;(3) 有人说“先解 LP,再把结果四舍五入取整就行”,你同意吗?说明理由(本小题的数值是否恰好可行不影响你的结论)。
- 你正在为选址问题建模:50个候选仓库,200个客户。决策变量:y_j 表示是否开设仓库j(0-1),x_ij 表示客户i是否由仓库j服务(0-1)。约束:x_ij <= M * y_j,其中M设为所有客户需求总和(10000)。模型有10000个二进制变量和10000个连续变量。求解器跑了1小时仍无可行解。请分析可能的原因,并给出至少两种改进方案。