线性规划基础:从标准形式到Python求解
线性规划,说白了就是在一堆约束条件下,找到最优的那个解。我刚开始接触这个领域时,总觉得它离实际业务很远。直到有一次做供应链成本优化,才发现线性规划简直就是成本控制的利器。
今天咱们就聊聊线性规划的四个核心内容:标准形式、图解法、单纯形法原理,以及怎么用Python快速求解。
一、线性规划的标准形式
先说说标准形式。你可能会问:为什么非要搞个标准形式?
嗯,这就像写代码要有规范一样。标准形式让所有问题都能用统一的算法去解。我个人习惯把标准形式记成三要素:
- 目标函数:最小化某个线性表达式,比如 min c₁x₁ + c₂x₂ + ... + cₙxₙ
- 约束条件:全部是等式,且右端项非负,比如 Ax = b, b ≥ 0
- 变量约束:所有变量非负,即 x ≥ 0
举个例子:
原始问题:max z = 3x₁ + 2x₂,约束为 x₁ + x₂ ≤ 4,x₁ ≥ 0, x₂ ≥ 0
标准形式:min -z = -3x₁ - 2x₂,引入松弛变量 x₃,得 x₁ + x₂ + x₃ = 4,所有变量 ≥ 0
我在项目中遇到过很多次,大家容易忽略的就是「不等式转等式」这一步。其实加个松弛变量或剩余变量就行,很简单。
二、图解法:直观理解线性规划
图解法只适用于两个变量的问题。但它能帮你建立直观的几何感觉。
怎么操作?三步走:
- 画出所有约束条件对应的直线
- 找到可行域(所有约束的交集)
- 移动目标函数等值线,找到最优解
你想想看,可行域其实就是一个凸多边形。最优解一定在顶点上。这个结论很重要,单纯形法就是基于这个原理。
我的经验:图解法虽然简单,但千万别小看它。有一次我在做产能分配方案时,先用图解法画了个草图,立刻发现约束条件写错了——可行域竟然是空的。要是直接上代码,debug得花半天。
三、单纯形法原理
单纯形法,说白了就是「沿着顶点走,直到找到最优」。为什么只走顶点?因为最优解一定在顶点上,这是线性规划的核心定理。
算法流程大致是:
- 从一个初始可行解(顶点)出发
- 检查当前解是否最优(检验数是否都 ≥ 0)
- 如果不是,沿着目标函数下降最快的方向,移动到相邻顶点
- 重复直到找到最优解
避坑指南:我曾经在实现单纯形法时,遇到退化问题——迭代了好几步,目标函数值一点没变。后来发现是出现了循环。解决办法很简单,用 Bland 规则选入基变量就行。
单纯形法的计算过程,我习惯用表格形式来记录。下面是一个简单的例子:
| 基变量 | x₁ | x₂ | x₃ | x₄ | RHS |
|---|---|---|---|---|---|
| x₃ | 1 | 2 | 1 | 0 | 8 |
| x₄ | 3 | 1 | 0 | 1 | 12 |
| 检验数 | -3 | -2 | 0 | 0 | 0 |
检验数为负,说明还没到最优。选最负的列(x₁)入基,用最小比值法则确定出基变量。迭代下去,直到所有检验数 ≥ 0。
四、用Python求解:scipy.optimize.linprog
实际工作中,我们很少手算单纯形法。Python 的 scipy.optimize.linprog 函数封装得很好,几行代码就能搞定。
先看一个例子:
from scipy.optimize import linprog
# 目标函数系数(注意:linprog默认求最小值)
c = [-3, -2] # 原问题是 max 3x1+2x2,所以取负
# 不等式约束 A_ub * x <= b_ub
A_ub = [[1, 1]]
b_ub = [4]
# 变量边界
bounds = [(0, None), (0, None)]
# 求解
res = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')
print('最优解:', res.x)
print('最优值:', -res.fun) # 记得取负
输出结果:
最优解: [4. 0.]
最优值: 12.0
嗯,这里要注意几个细节:
- linprog 默认求最小值,如果原问题是最大化,记得把系数取负
- 约束默认是 ≤,如果是 ≥ 需要两边取负
- method='highs' 是推荐的内点法,比默认的单纯形法快很多
我的习惯:每次用 linprog 之前,我都会先画个约束条件的草图。不是为了精确求解,而是确认可行域非空、问题有界。这步花不了1分钟,但能避免很多低级错误。
下面我用 SVG 画一张本章的知识体系图,帮你理清思路:
这张图把四个知识点串起来了。标准形式是基础,图解法帮你理解几何意义,单纯形法是核心算法,Python 求解是落地工具。四者缺一不可。
最后说一句:线性规划看起来理论性很强,但实际应用非常广泛。从生产排程到物流配送,从投资组合到资源分配,处处都有它的影子。掌握了今天的内容,你就拿到了成本控制的一把钥匙。