运筹调度 / 02
LP / ILP / 匹配 / 网络流
运筹优化面试里,LP、ILP、匹配、网络流是最常见的基础工具。你不一定要现场手写求解器,但要知道什么问题适合用什么形式建模。
LP:线性规划
线性规划的形式是:目标函数和约束都是线性的,变量可以连续取值。
典型形式:
minimize c^T x
subject to Ax <= b
x >= 0
LP 适合做资源连续分配,比如预算、流量、库存比例、产能规划。它通常比整数规划更容易求解。
例子:广告预算在多个流量池之间分配。
- 变量:每个流量池分配多少预算。
- 目标:最大化预期转化或 ROI。
- 约束:总预算、单池上限、消耗速度、风险阈值。
ILP:整数规划
整数规划要求变量是整数,常见的是 0/1 变量。
例如:
x_{i,j} = 1 表示订单 i 分给骑手 j
x_{i,j} = 0 表示不分配
ILP 表达能力强,适合选择、分配、排班、路径等离散决策。但求解复杂度高,大规模在线系统往往不能直接求全局最优。
二分图匹配
匹配问题适合“一边对象分配给另一边对象”的场景。
例子:
- 订单分给骑手。
- 用户分配优惠券。
- 广告请求匹配广告。
- 任务分配给机器。
如果每个订单只能分给一个骑手,每个骑手只能接一个订单,可以建成二分图最大权匹配。边权表示收益或负成本。
边权可以包含:
- 骑手到店时间。
- 预计送达时间。
- 超时风险。
- 空驶距离。
- 接单概率。
- 未来机会成本。
最小费用最大流
网络流适合有容量和路径结构的问题。最小费用最大流可以表达“在满足流量需求的同时最小化成本”。
例子:多区域骑手供给调配。
- 源点连接骑手区域供给。
- 中间节点表示区域和时间片。
- 汇点表示订单需求。
- 边容量表示可调配数量。
- 边费用表示调配成本或延迟成本。
网络流比简单匹配更适合多层资源流动和容量约束。
匹配和网络流的区别
匹配更像“一对一或一对多分配”,网络流更像“资源从源头经过网络流向需求点”。
如果问题只是订单和骑手之间选边,匹配够用。
如果问题涉及区域流转、容量、时间层、库存或多阶段路径,网络流更自然。
什么时候不用精确优化
工业场景常常不用精确解,原因包括:
- 问题规模太大。
- 输入预测本身有误差。
- 在线决策时间很短。
- 约束会频繁变化。
- 可解释和稳定比最优更重要。
此时可以用启发式:先排序、再贪心、局部调整、模拟退火、遗传算法、beam search,或者用机器学习模型打分候选动作。
面试题:订单分配给骑手怎么建模
一个基础回答:
我会先构造订单和骑手的二分图。每条边表示某骑手可以服务某订单,边权是服务成本,包括到店时间、送达时间、超时风险、空驶距离和骑手负载。然后在每个滚动时间窗口内做最小成本匹配。如果考虑多单组合和未来订单,就需要扩展候选动作,或者把问题转成带时间窗的 VRP,再用启发式近似求解。
这个回答的重点是:先给简单模型,再说明真实系统如何扩展。
面试题:排班怎么建模
排班通常是整数规划。
变量:
x_{r,t,k} = 区域 r、时间片 t、班次类型 k 的骑手数量
目标:
minimize 缺口成本 + 冗余成本 + 排班成本
约束:
- 每个区域时间片供给覆盖需求。
- 班次长度合法。
- 总人力预算不超过上限。
- 骑手可用时间满足要求。
如果要排到个人,就会更复杂,需要考虑个人偏好、休息时间和公平性。
面试题:优惠券或补贴预算怎么分配
可以看成 knapsack 或整数规划。
变量:
x_{i,k} = 用户或骑手 i 是否获得策略 k
目标:
maximize 增量收益 - 成本
约束:
- 总预算。
- 每个人最多一个策略。
- 每个区域或人群覆盖下限。
- 风险和公平性限制。
如果收益来自 uplift 模型,就要强调它估计的是增量效果,而不是普通转化概率。
如何在面试中表现成熟
不要只说“这个可以用 ILP”。要补充:
- 变量数量多大。
- 约束是否线性。
- 求解是否能满足实时性。
- 输入预测误差会不会影响结果。
- 如果求解超时怎么降级。
- 线上怎么验证比旧策略好。
总结
LP 适合连续资源分配,ILP 适合离散选择,匹配适合两类对象分配,网络流适合容量和路径结构。真实业务中常常是这些方法和启发式、机器学习、仿真一起使用。
下一篇建议继续看: