线性规划基础:从标准形式到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

我在项目中遇到过很多次,大家容易忽略的就是「不等式转等式」这一步。其实加个松弛变量或剩余变量就行,很简单。

二、图解法:直观理解线性规划

图解法只适用于两个变量的问题。但它能帮你建立直观的几何感觉。

怎么操作?三步走:

  1. 画出所有约束条件对应的直线
  2. 找到可行域(所有约束的交集)
  3. 移动目标函数等值线,找到最优解

你想想看,可行域其实就是一个凸多边形。最优解一定在顶点上。这个结论很重要,单纯形法就是基于这个原理。

我的经验:图解法虽然简单,但千万别小看它。有一次我在做产能分配方案时,先用图解法画了个草图,立刻发现约束条件写错了——可行域竟然是空的。要是直接上代码,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 画一张本章的知识体系图,帮你理清思路:

线性规划基础 标准形式 min cᵀx s.t. Ax = b, x ≥ 0 图解法 2变量可视化 可行域 + 等值线 单纯形法 顶点迭代 检验数判断最优 Python求解 scipy.optimize.linprog method='highs'

这张图把四个知识点串起来了。标准形式是基础,图解法帮你理解几何意义,单纯形法是核心算法,Python 求解是落地工具。四者缺一不可。

最后说一句:线性规划看起来理论性很强,但实际应用非常广泛。从生产排程到物流配送,从投资组合到资源分配,处处都有它的影子。掌握了今天的内容,你就拿到了成本控制的一把钥匙。

专注资料整理