北邮研究生课程《最优化理论与算法》知识总结 - Part 1

10970 字
55 分钟
北邮研究生课程《最优化理论与算法》知识总结 - Part 1
2026-06-18
Important

考试划重点

线性规划 (LP) 部分 50%

  • 标准型
  • 单纯形方法(两阶段/大M)
  • 对偶规划,对偶单纯形
  • 灵敏度分析 (c,b,A,约束条件)
  • 对偶理论
  • 互补松弛条件
  • LP 的基本性质

基于教材最优化理论与算法(第2版)-陈宝林-清华大学出版社-2006

Note

前置数学知识:

Ch 02. 线性规划的基本性质#

本章是单纯形法的理论基础,核心建立“几何极点 \leftrightarrow 代数基本可行解”的等价关系。

本章逻辑主线

  1. 实际LP → 化为标准型(计算前提);
  2. 几何顶点(极点)对应代数基本可行解;
  3. 理论保证:有可行解就有BFS,有最优解就有最优BFS;
  4. 由此引出下一章单纯形法:只需在有限个基本可行解中迭代寻优。

2.1 标准形式及图解法#

  1. 线性规划标准形式定义

    mincxs.t.Ax=bx0\begin{array}{ll} \min & \boldsymbol{c}\boldsymbol{x} \\ \text{s.t.} & \boldsymbol{A}\boldsymbol{x}=\boldsymbol{b} \\ & \boldsymbol{x} \ge \boldsymbol{0} \end{array}

    极小化目标、等式约束、右端常数b0b\ge0、所有变量xj0x_j\ge0

  2. 非标准型转化标准型全套规则

    • 不等式约束:\le 加松弛变量,\ge 加剩余变量;
    • 无符号自由变量:xj=xjxj,xj,xj0x_j=x_j'-x_j'',x_j',x_j''\ge0
    • 变量上下界平移:xjljxj=xjlj0x_j\ge l_j\Rightarrow x_j'=x_j-l_j\ge0xjujxj=ujxj0x_j\le u_j\Rightarrow x_j'=u_j-x_j\ge0
    • 右端bi<0b_i<0:方程两边乘1-1;最大化转最小化:maxcxmincx\max cx \Leftrightarrow \min -cx
  3. 图解法(二维变量专用)

    • 可行域:线性不等式围成凸多边形;
    • 目标函数等值线、梯度/法向量方向:极小化沿负梯度平移等值线;
    • 结论:最优解出现在顶点(极点);三种结果:唯一最优、无穷多最优、无界、无可行域。

2.2 线性规划基本性质#

1. 可行域几何性质#

定理2.2.1:线性规划可行域K={xAx=b,x0}K=\{x|Ax=b,x\ge0\}凸集

Note

凸集 (Convex Set): 如果在这个集合里任意挑两个点,连成一条线段,这条线段上的所有点也必须在这个集合内。

圆、正方形、球体都是凸集;而月牙形、五角星就不是凸集(因为凹进去的地方连线会跑到图形外面去)。

这个定理告诉我们:线性规划的可行域绝对不会有“凹陷”或“空洞”,它是一个规整的、实心的多面体。这为后续寻找最优解奠定了良好的几何基础。

2. 最优解极点定理(定理2.2.2)#

可行域非空时:

  1. 存在有限最优解     \iff 可行域所有极方向满足cd(j)0cd^{(j)}\ge0;若存在cd(j)<0cd^{(j)}<0,目标无界;
  2. 若有有限最优解,则最优值一定能在极点取到。
Note
  • 极点(Extreme Point):几何上的 “顶点”“角点”。比如立方体的 8 个顶点。

  • 极方向(Extreme Direction):如果可行域是无限延伸的(无界),那么顺着某个方向可以一直走下去而不出界,这个方向就是极方向。

  • cc:目标函数的系数向量(代表我们想优化、比如降低成本的方向)。

  • 拆解理解:

    • 第(1)条:如果可行域是无限大的,你顺着某个无限延伸的方向 d(j)d^{(j)} 走,如果发现成本在降低(即 cd(j)<0cd^{(j)} < 0),那你就可以无限走下去,成本变成 - \infty,这就是“目标无界”(说明题目设计不合理,现实中不存在)。只有往所有无限方向走都会使成本增加(即 cd(j)0cd^{(j)} \ge 0),才存在一个合理的、有限的最优解。
    • 第(2)条(核心结论):如果有最优解,它一定可以在某个顶点(极点)上达到
    • 为什么重要:可行域内部有无数个点,我们不可能每个都去试。但这定理告诉我们,只需要去检查那些有限的“角点”就可以了。这极大地缩小了搜索范围。

3. 基本解、基本可行解(BFS)定义#

问题背景: 约束条件是 Ax=bAx = b,其中 AA 是一个 m×nm \times n 的矩阵(mm 个方程,nn 个变量,通常变量比方程多,即 n>mn > m)。因为方程比变量少,所以这个方程组有无数个解。

基矩阵 BB 与非基矩阵 NN:

  • 我们从 AAnn 列中,挑出 mm 列,组成一个 m×mm \times m 的可逆矩阵,称为基(Basis),记为 BB
  • 剩下的 nmn-m 列组成非基(Non-basis),记为 NN
  • 相应地,变量也分成两部分:基变量 xBx_Bmm 个)和非基变量 xNx_Nnmn-m 个)。

基本解(Basic Solution):

  • 做法:把那 nmn-m 个非基变量 xNx_N 直接强制设为 0,然后求解剩下的 mm 个基变量 xBx_B
  • 公式BxB=b    xB=B1bBx_B = b \implies x_B = B^{-1}b
  • 整个解就是 x=(B1b0)x = \begin{pmatrix} B^{-1}b \\ 0 \end{pmatrix}
  • 注意:基本解只要求满足 Ax=bAx=b不要求满足 x0x \ge 0。所以有些变量可能是负数。

基本可行解(Basic Feasible Solution, 简称 BFS):

  • 如果算出来的基本解里,所有分量都大于等于 0(即 B1b0B^{-1}b \ge 0),那么它既是“基本解”又是“可行解”,这就叫 BFS

退化(Degenerate)

  • 如果算出来的基变量 xBx_B 里,恰好有某些变量的值也是 0,就叫退化基本可行解;如果全都是正数(>0>0),就叫非退化。

基本解总数上界 CnmC_n^m:

  • 我们能挑出多少种不同的“基”?这就是从 nn 列里选 mm 列的组合数 Cnm=n!m!(nm)!C_n^m = \frac{n!}{m!(n-m)!}
  • 因为这个数字是有限的,所以基本可行解的数量也是有限的

4. 极点与基本可行解等价定理(定理2.2.3,重中之重)#

几何上的“极点(角点)”     \iff 代数上的“基本可行解(BFS)”。

① 如果你用眼睛看,发现某个点是图形的顶点(极点),那么在代数上,它对应的变量中必定只有不超过 mm 个是非零的,且对应的矩阵列线性无关(可以作为基)。

② 反过来,如果你用矩阵算出了一个 BFS,那么它在多面体图像上一定对应着一个顶点(角点)。

推论:线性规划若有最优解,则一定存在最优基本可行解,是单纯形法理论根基。

Important

计算机不会看图,无法直接找“角点”;但计算机非常擅长做矩阵运算(算 BFS)。既然两者等价,计算机只需要在不同的 BFS(基)之间进行切换和比较,就等于在图形的各个顶点之间“跳跃”寻找最优解。这就是大名鼎鼎的“单纯形法”的运行逻辑。

5. 基本可行解存在定理(定理2.2.4)#

只要这个问题有解(即它的可行域不是空的,里面至少有一个点 xx),那么这个可行域就一定存在至少一个顶点(基本可行解)

证明:

  • 假设你现在站在可行域的“内部”(一个普通的可行解,不是顶点)。
  • 因为对应的列线性相关,你可以顺着某个方向移动,直到触碰到边界。
  • 每次碰到边界,就会有多一个变量变成 0。
  • 由于变量个数有限,你不断地往边界“推”,最终一定会推到某几个边界的交汇处——也就是退无可退的顶点(角点)。此时,正分量对应的列线性无关,你就得到了一个基本可行解。

意义:它保证了我们使用单纯形法时,**绝对能找到一个起点(顶点)**开始搜索。


Ch 03. 单纯形方法#

3.1 单纯形方法原理#

我们可以把单纯形方法(Simplex Method)想象成一个 “在多面体山谷中寻找最低点(或最高点)” 的探索游戏。

在线性规划中,可行区域就像一个由许多平面围成的多面体(比如一栋多面体建筑),而它的最优解(最低点或最高点)一定会出现在这个多面体的某个“顶点”(角)上

单纯形方法的核心思想就是:从一个顶点出发,沿着棱线走到相邻的、更好的顶点,一步步直到找到最顶端或最低端。

例子#

max3x+2y+zs.t.x+2y+z4002x+y+z500x,y,z0\begin{aligned} \max \quad & 3x + 2y + z \\ \text{s.t.} \quad & x + 2y + z \le 400 \\ & 2x + y + z \le 500 \\ & x, y, z \ge 0 \end{aligned}

我们可以按照前面介绍的“下山/爬山”逻辑,一步步用单纯形方法来求解。因为这是一个求最大值(max)的问题,所以我们的目标是一路上坡,直到找不到更高的路为止

第一步:准备工作(引入“松弛变量”和找起点)

为了把不等式变成等式,我们引入两个“松弛变量” s1s_1s2s_2(它们代表资源没有用完的剩余量,且 s1,s20s_1, s_2 \ge 0):

  1. x+2y+z+s1=400x + 2y + z + s_1 = 400
  2. 2x+y+z+s2=5002x + y + z + s_2 = 500

此时,我们的目标是最大化:W=3x+2y+zW = 3x + 2y + z

  • 寻找初始起点

    最容易找的起点是原点,即让所有决策变量都为 0:

    x=0,y=0,z=0x = 0, \quad y = 0, \quad z = 0

    带入后,我们可以轻松得到:

    s1=400,s2=500s_1 = 400, \quad s_2 = 500

    当前海拔高度(目标函数值)W=0W = 0

第二步:第一次迭代(寻找最陡的上坡路)

  1. 环顾四周(选择进基变量)

    我们现在在 (0,0,0)(0,0,0) 这个顶点。看一眼目标函数:

    W=3x+2y+zW = 3x + 2y + z
    • 如果增加 xx,每增加 1 单位,海拔上升 3。
    • 如果增加 yy,每增加 1 单位,海拔上升 2。
    • 如果增加 zz,每增加 1 单位,海拔上升 1。

    最陡的路显然是 xx 方向(因为系数 3 最大)。所以我们决定让 xx进基(开始增加 xx 的值)

  2. 计算能走多远(选择离基变量 - 最小比值测试)

    沿着 xx 轴往前走,能走多远取决于等式约束中的“墙壁”:

    • 墙壁 1(第一个约束):x+s1=400    x400x + s_1 = 400 \implies x \le 400
    • 墙壁 2(第二个约束):2x+s2=500    x5002=2502x + s_2 = 500 \implies x \le \frac{500}{2} = 250

    为了不撞破墙壁,我们只能走到最近的限制点:x=250x = 250

    此时,墙壁 2 处的剩余资源用光了s2s_2 变为了 0)。所以我们把 s2s_2 选为离基变量

  3. 移动到新顶点(坐标变换)

    根据 2x+y+z+s2=5002x + y + z + s_2 = 500,我们将 xx 表达出来:

    x=2500.5y0.5z0.5s2x = 250 - 0.5y - 0.5z - 0.5s_2

    把它代入到第一个约束和目标函数中,得到新的表达式:

    • 新等式 11.5y+0.5z+s10.5s2=1501.5y + 0.5z + s_1 - 0.5s_2 = 150 (由原等式 1 代入 xx 得到)
    • 新目标函数
    W=3(2500.5y0.5z0.5s2)+2y+z=750+0.5y0.5z1.5s2W = 3(250 - 0.5y - 0.5z - 0.5s_2) + 2y + z = 750 + 0.5y - 0.5z - 1.5s_2

    我们成功来到了第二个顶点

    x=250,s1=150,y=0,z=0,s2=0x = 250, \quad s_1 = 150, \quad y = 0, \quad z = 0, \quad s_2 = 0

    当前海拔高度W=750W = 750

第三步:第二次迭代(继续寻找上坡路)

  1. 环顾四周

    在新的顶点,看一眼新的目标函数表达式:

    W=750+0.5y0.5z1.5s2W = 750 + 0.5y - 0.5z - 1.5s_2
    • 增加 yy,海拔还能上升(系数为 +0.5+0.5)。
    • 增加 zzs2s_2 都会让海拔下降(系数为负)。

    所以,我们决定让 yy 进基(开始增加 yy 的值)

  2. 计算能走多远(最小比值测试)

    看一看当前两个等式对 yy 的限制:

    • 新等式 11.5y+s1=150    y1501.5=1001.5y + s_1 = 150 \implies y \le \frac{150}{1.5} = 100
    • 新等式 2(利用 xx 的表达式):x+0.5y=250    y2500.5=500x + 0.5y = 250 \implies y \le \frac{250}{0.5} = 500

    最严苛的限制是 y100y \le 100。当 y=100y = 100 时,s1s_1 用光变为了 0。

    因此,s1s_1 被选为离基变量

  3. 移动到新顶点

    根据 1.5y+0.5z+s10.5s2=1501.5y + 0.5z + s_1 - 0.5s_2 = 150,我们可以将 yy 表达为:

    y=10013z23s1+13s2y = 100 - \frac{1}{3}z - \frac{2}{3}s_1 + \frac{1}{3}s_2

    yy 代入到 xx 的表达式以及目标函数中:

    • xx 的新表达式

    x=20013z+13s123s2x = 200 - \frac{1}{3}z + \frac{1}{3}s_1 - \frac{2}{3}s_2

    • 最新目标函数

    W=750+0.5(10013z23s1+13s2)0.5z1.5s2=80023z13s143s2W = 750 + 0.5\left(100 - \frac{1}{3}z - \frac{2}{3}s_1 + \frac{1}{3}s_2\right) - 0.5z - 1.5s_2 = 800 - \frac{2}{3}z - \frac{1}{3}s_1 - \frac{4}{3}s_2

    我们成功来到了第三个顶点

    x=200,y=100,z=0,s1=0,s2=0x = 200, \quad y = 100, \quad z = 0, \quad s_1 = 0, \quad s_2 = 0

    当前海拔高度W=800W = 800

  4. 检查是否到达终点

    再次环顾四周,看看最新的目标函数:

    W=80023z13s143s2W = 800 - \frac{2}{3}z - \frac{1}{3}s_1 - \frac{4}{3}s_2

    此时,所有未使用的变量(z,s1,s2z, s_1, s_2)前面的系数全部为负数。这意味着:

    • 无论你往哪个方向移动(增加 z,s1z, s_1s2s_2),海拔 WW 都只可能减小。
    • 我们已经站在了最高峰!

最终结论

经过单纯形法的逐步迭代,我们找到了该线性规划问题的最优解:

  • 最优决策变量

    x=200,y=100,z=0x = 200, \quad y = 100, \quad z = 0

  • 最大目标函数值(最高海拔):

    W=800W = 800

单纯形表法#

原问题为极大化问题:

maxZ=3x+2y+z\max \quad Z = 3x + 2y + z

W=ZW = -Z,则原问题等价于求如下极小化问题:

minW=3x2yz\min \quad W = -3x - 2y - z

引入松弛变量 s10s_1 \ge 0s20s_2 \ge 0,将不等式约束转化为等式约束:

minW=3x2yz+0s1+0s2s.t.x+2y+z+s1=4002x+y+z+s2=500x,y,z,s1,s20\begin{aligned} \min \quad & W = -3x - 2y - z + 0s_1 + 0s_2 \\ \text{s.t.} \quad & x + 2y + z + s_1 = 400 \\ & 2x + y + z + s_2 = 500 \\ & x, y, z, s_1, s_2 \ge 0 \end{aligned}

此时,目标函数的系数为:

c=[3,2,1,0,0]c = [-3, -2, -1, 0, 0]

对于极小化问题,判别式(检验数)定义为 σj=zjcj\sigma_j = z_j - c_j。当所有的 zjcj0z_j - c_j \le 0 时,当前解即为最优解。若存在 zjcj>0z_j - c_j > 0,则选择其中最大正值对应的变量作为入基变量。

1. 初始单纯形表(第 1 步迭代)

cj32100CB基变量xyzs1s2RHSθ (RHS/xj)0s112110400400/1=4000s2[2]1101500500/2=250zjcj32100W=0\begin{array}{cc|ccccc|c|c} \hline c_j & & -3 & -2 & -1 & 0 & 0 & & \\ C_B & \text{基变量} & x & y & z & s_1 & s_2 & \text{RHS} & \theta \text{ (RHS}/x_j) \\ \hline 0 & s_1 & 1 & 2 & 1 & 1 & 0 & 400 & 400 / 1 = 400 \\ 0 & s_2 & [2] & 1 & 1 & 0 & 1 & 500 & 500 / 2 = 250 \\ \hline z_j-c_j & & 3 & 2 & 1 & 0 & 0 & W = 0 & \\ \hline \end{array}
  • 入基变量选择:检验数 zjcjz_j - c_j 中最大正值为 σ1=3\sigma_1 = 3,因此 xx 为入基变量。
  • 出基变量选择:根据最小比值原则 θ\thetamin(400,250)=250\min(400, 250) = 250,故 s2s_2 为出基变量。
  • 主元(Pivot):为交叉处的元素 [2][2]

2. 第二次单纯形表(第 2 步迭代) 进行旋转变换(Pivot Row 2 除以 2,Row 1 减去新的 Row 2):

cj32100CB基变量xyzs1s2RHSθ( RHS/xj)0s10[3/2]1/211/2150150/(3/2)=1003x11/21/201/2250250/(1/2)=500zjcj01/21/203/2W=750\begin{array}{cc|ccccc|c|c} \hline c_j & & -3 & -2 & -1 & 0 & 0 & & \\ C_B & \text{基变量} & x & y & z & s_1 & s_2 & \text{RHS} & \theta (\text{ RHS}/x_j) \\ \hline 0 & s_1 & 0 & [3/2] & 1/2 & 1 & -1/2 & 150 & 150 / (3/2) = 100 \\ -3 & x & 1 & 1/2 & 1/2 & 0 & 1/2 & 250 & 250 / (1/2) = 500 \\ \hline z_j-c_j & & 0 & 1/2 & -1/2 & 0 & -3/2 & W = -750 & \\ \hline \end{array}
  • 入基变量选择:检验数中仍有正数 z2c2=1/2>0z_2 - c_2 = 1/2 > 0,因此 yy 为入基变量。
  • 出基变量选择:计算 θ\thetamin(100,500)=100\min(100, 500) = 100,故 s1s_1 为出基变量。
  • 主元(Pivot):为交叉处的元素 [3/2][3/2]

3. 第三次单纯形表(最终迭代) 进行旋转变换(Row 1 乘以 2/32/3,Row 2 减去 1/2×1/2 \times 新 Row 1):

cj32100CB基变量xyzs1s2RHSθ2y011/32/31/31003x101/31/32/3200zjcj002/31/34/3W=800\begin{array}{cc|ccccc|c|c} \hline c_j & & -3 & -2 & -1 & 0 & 0 & & \\ C_B & \text{基变量} & x & y & z & s_1 & s_2 & \text{RHS} & \theta \\ \hline -2 & y & 0 & 1 & 1/3 & 2/3 & -1/3 & 100 & - \\ -3 & x & 1 & 0 & 1/3 & -1/3 & 2/3 & 200 & - \\ \hline z_j-c_j & & 0 & 0 & -2/3 & -1/3 & -4/3 & W = -800 & \\ \hline \end{array}
  • 最优性判断:此时所有的检验数 zjcj0z_j - c_j \le 0(具体值为 0,0,2/3,1/3,4/30, 0, -2/3, -1/3, -4/3),迭代结束,已找到最优解。

3.2 两阶段法 & 大 M 法#

在之前的例子中,我们所有的约束条件都是 \le。当我们把所有的决策变量(如 x1,x2,x3x_1, x_2, x_3)都设为 00 时,松弛变量就可以很自然地作为初始起点(比如 s1=400,s2=500s_1 = 400, s_2 = 500)。这个起点是在多面体可行域内的。

但在实际问题中,经常会出现 \ge== 的约束。例如下面例题中的第三个约束:2x1x2+x312x_1 - x_2 + x_3 \ge 1

min5x14x2+3x3s.t.2x1x2+4x34x1+x2+2x362x1x2+x31x1,x2,x30\begin{array}{rrrrrcr} \min & 5x_1 &-&4x_2 &+&3 x_3 & & & \\ \text{s.t.} & 2x_1 &-&x_2 &+&4x_3 & \le & 4 \\ & x_1 &+ &x_2 &+&2x_3 & \le & 6 \\ & 2x_1 &- &x_2 &+&x_3 & \ge & 1 \end{array} \\ x_1,x_2,x_3 \ge 0

如果我们把 x1,x2,x3x_1, x_2, x_3 都设为 00,就会得到 010 \ge 1,这显然是不成立的。也就是说,原点 (0,0,0)(0,0,0) 根本不在合法区域内

如果我们强行减去一个“剩余变量” s3s_3 将其化为等式:

2x1x2+x3s3=12x_1 - x_2 + x_3 - s_3 = 1

当决策变量为 00 时,会得到 s3=1s_3 = -1,这违反了非负约束(s30s_3 \ge 0),因此 s3s_3 也不能用来当做起点。

既然找不到起点,数学家们就想了一个“作弊”的办法:

我们在等式左边强行加入一个临时的虚拟变量(即人工变量 a10a_1 \ge 0),将等式强行写成:

2x1x2+x3s3+a1=12x_1 - x_2 + x_3 - s_3 + a_1 = 1

这样,当决策变量和剩余变量都为 00 时,我们就有了一个数学上的初始起点:a1=1a_1 = 1

但请注意:这个变量是虚构的。因此,我们在计算的过程中,必须用尽一切手段让这个人工变量变为 00。如果算到最后它还是大于 0,说明原问题根本没有可行解。

为了强行把人工变量逼到 00,有两种主流方法:

  • 大 M 法 (Big M Method)

    我们在原目标函数里给人工变量加上一个极其沉重的惩罚。比如本题是求极小化,我们就把目标函数写成 minz+Ma1\min z + M \cdot a_1(其中 MM 是一个无穷大的正数)。因为我们要追求极小化,算法为了降低成本,会拼了命地优先把 a1a_1 减小到 00

  • 两阶段法 (Two-Phase Method)

    因为大M法要在表格里一直带着一个字母 MM 进行加减乘除,手算很容易出错。因此人们发明了“分步走”的两阶段法:

    • 第一阶段:不管原目标函数,我们只求人工变量的和最小(即 ming=a1\min g = a_1)。如果第一阶段算完,发现最小只能做到 g>0g > 0,说明无解;如果能做到 g=0g = 0,说明我们已经摆脱了虚构变量,找到了一个真实的“合法顶点”。

    • 第二阶段:丢弃人工变量,把原目标函数放回来,从第一阶段找到的那个真实顶点继续往下算。

下面使用大 M 法来解决这个问题。

  • 对于约束 1(\le),引入松弛变量 s10s_1 \ge 0
  • 对于约束 2(\le),引入松弛变量 s20s_2 \ge 0
  • 对于约束 3(\ge),引入剩余变量 s30s_3 \ge 0 和人工变量 a10a_1 \ge 0

由于是求极小化(min\min)问题,我们需要在目标函数中对人工变量 a1a_1 加上一个极大的正惩罚项 +Ma1+M \cdot a_1(其中 MM 为一个极大的正实数)。

标准化后的模型为:

minz=5x14x2+3x3+0s1+0s2+0s3+Ma1s.t.2x1x2+4x3+s1=4x1+x2+2x3+s2=62x1x2+x3s3+a1=1x1,x2,x3,s1,s2,s3,a10\begin{aligned} \min \quad & z = 5x_1 - 4x_2 + 3x_3 + 0s_1 + 0s_2 + 0s_3 + M a_1 \\ \text{s.t.} \quad & 2x_1 - x_2 + 4x_3 + s_1 = 4 \\ & x_1 + x_2 + 2x_3 + s_2 = 6 \\ & 2x_1 - x_2 + x_3 - s_3 + a_1 = 1 \\ & x_1, x_2, x_3, s_1, s_2, s_3, a_1 \ge 0 \end{aligned}

对于极小化问题,判别式(检验数)为 σj=zjcj\sigma_j = z_j - c_j,其中 zj=(cB)iaijz_j = \sum (c_B)_i a_{ij}

  • 最优性条件:当所有的检验数 zjcj0z_j - c_j \le 0 时,当前解为最优解。
  • 换入变量选择:若存在 zjcj>0z_j - c_j > 0,选择最大正数对应的变量作为入基变量。

1. 初始单纯形表(第 1 步迭代)

初始基变量选择为 s1,s2,a1s_1, s_2, a_1,其对应的目标函数系数为 cB=[0,0,M]Tc_B = [0, 0, M]^T

cj543000MCB基变量x1x2x3s1s2s3a1RHSθ0s1214100044/2=20s2112010066/1=6Ma1[2]11001111/2=0.5zjcj2M5M+4M300M0z=M\begin{array}{cc|ccccccc|c|c} \hline c_j & & 5 & -4 & 3 & 0 & 0 & 0 & M & & \\ C_B & \text{基变量} & x_1 & x_2 & x_3 & s_1 & s_2 & s_3 & a_1 & \text{RHS} & \theta \\ \hline 0 & s_1 & 2 & -1 & 4 & 1 & 0 & 0 & 0 & 4 & 4/2 = 2 \\ 0 & s_2 & 1 & 1 & 2 & 0 & 1 & 0 & 0 & 6 & 6/1 = 6 \\ M & a_1 & [2] & -1 & 1 & 0 & 0 & -1 & 1 & 1 & 1/2 = 0.5 \\ \hline z_j-c_j & & 2M-5 & -M+4 & M-3 & 0 & 0 & -M & 0 & z = M & \\ \hline \end{array}
  • 入基变量:在 zjcjz_j - c_j 中,2M52M-5 是最大的正值(因为 MM 极大),因此选择 x1x_1 入基。
  • 出基变量:根据 θ\theta 比值原则,min(2,6,0.5)=0.5\min(2, 6, 0.5) = 0.5,故选择 a1a_1 出基。
  • 主元:为 [2][2]

2. 第二次单纯形表(第 2 步迭代)

主元变换:将第 3 行除以 2,然后通过行变换消去其他行在 x1x_1 列上的系数。

cj543000MCB基变量x1x2x3s1s2s3a1RHSθ0s1003101130s20[1.5]1.5010.50.55.55.5/1.5=11/35x110.50.5000.50.50.5zjcj01.50.5002.5M+2.5z=2.5\begin{array}{cc|ccccccc|c|c} \hline c_j & & 5 & -4 & 3 & 0 & 0 & 0 & M & & \\ C_B & \text{基变量} & x_1 & x_2 & x_3 & s_1 & s_2 & s_3 & a_1 & \text{RHS} & \theta \\ \hline 0 & s_1 & 0 & 0 & 3 & 1 & 0 & 1 & -1 & 3 & - \\ 0 & s_2 & 0 & [1.5] & 1.5 & 0 & 1 & 0.5 & -0.5 & 5.5 & 5.5 / 1.5 = 11/3 \\ 5 & x_1 & 1 & -0.5 & 0.5 & 0 & 0 & -0.5 & 0.5 & 0.5 & - \\ \hline z_j-c_j & & 0 & 1.5 & -0.5 & 0 & 0 & -2.5 & -M+2.5 & z = 2.5 & \\ \hline \end{array}
  • 入基变量:检验数中只有 z2c2=1.5>0z_2 - c_2 = 1.5 > 0,因此选择 x2x_2 入基。
  • 出基变量:计算 θ\theta 比值,s1s_1 行和 x1x_1 行对应的 x2x_2 系数不大于 0(忽略),只有 s2s_2 行满足条件,所以选择 s2s_2 出基。
  • 主元:为 [1.5][1.5] (即 32\frac{3}{2})。

3. 第三次单纯形表(最终迭代)

主元变换:第 2 行乘以 23\frac{2}{3},并通过行变换消去其他行在 x2x_2 列上的系数。为了结果精确,以下数据采用分数表示。

cj543000MCB基变量x1x2x3s1s2s3a1RHSθ0s1003101134x201102/31/31/311/35x110101/31/31/37/3zjcj002013M+3z=3\begin{array}{cc|ccccccc|c|c} \hline c_j & & 5 & -4 & 3 & 0 & 0 & 0 & M & & \\ C_B & \text{基变量} & x_1 & x_2 & x_3 & s_1 & s_2 & s_3 & a_1 & \text{RHS} & \theta \\ \hline 0 & s_1 & 0 & 0 & 3 & 1 & 0 & 1 & -1 & 3 & - \\ -4 & x_2 & 0 & 1 & 1 & 0 & 2/3 & 1/3 & -1/3 & 11/3 & - \\ 5 & x_1 & 1 & 0 & 1 & 0 & 1/3 & -1/3 & 1/3 & 7/3 & - \\ \hline z_j-c_j & & 0 & 0 & -2 & 0 & -1 & -3 & -M+3 & z = -3 & \\ \hline \end{array}
  • 最优性判断:所有的检验数 zjcj0z_j - c_j \le 0(具体为 0,0,2,0,1,3,M+300, 0, -2, 0, -1, -3, -M+3 \le 0)。因此,当前表格已达到最优。

结论

最优解已求得,其变量取值为:

x1=73,x2=113,x3=0x_1 = \frac{7}{3}, x_2 = \frac{11}{3}, x_3 = 0

松弛变量与剩余变量的取值为:

s1=3,s2=0,s3=0s_1 = 3, s_2 = 0, s_3 = 0

最优目标函数值(极小值)为:

zmin=3z_{\min} = -3

3.3 退化与循环#

  • 退化:在做最小比值筛选时,发现算出来的步长 θ=0\theta = 0。这意味着我们虽然换了基变量,但在空间中其实一步都没挪动
  • 循环(鬼打墙):因为原地踏步,迭代了好几次,最后发现单纯形表居然和几步前一模一样。算法陷入了死循环,永远停不下来。
  • 摄动法(解决办法)
    • 原理:既然是因为某些约束线刚好交在同一个点上(退化),那我们就把右端的常数项 bb 加上一个极小的扰动(比如 ϵ\epsilon 的几次方)。
    • 这样就把交在一起的线稍微“错开”了一点点,让死角变成一个小通道,从而打破死循环,保证算法能够继续走下去。

3.4 修正单纯形法#

  • 痛点:标准的单纯形表要随着迭代不断更新整个大矩阵,如果变量有几万个,计算机会耗费大量内存来存那些根本不常用的数据。
  • 核心改进:实际上,每次迭代我们只需要用到当前基矩阵的逆 B1B^{-1}、右端项和原始数据。
  • 做法:我们不保存整张大表,只保留并更新 B1B^{-1}。每一次要算检验数或者主列时,临时用原始数据和 B1B^{-1} 乘一下算出来。
  • 逆的乘积形式:更新 B1B^{-1} 时,用初等矩阵相乘,进一步节省存储空间。这非常适合计算机处理大型稀疏矩阵。

详见 wikipedia: Revised simplex method

3.5 变量有界单纯形#

  • 普通情况:变量只要 0\ge 0 就行。
  • 有界情况:变量有区间限制(ljxjujl_j \le x_j \le u_j)。
  • 聪明做法:不用把这些上下界当成新的约束条件塞进表格(否则表格会成倍变大)。
  • 规则微调
    • 非基变量不仅可以等于 0(下界),还可以等于它的最大值(上界)。
    • 在选进基和离基时,不仅要考虑变量不能跌破下界,还要考虑它们不能撑破上界。一旦某个变量在移动过程中碰到了上界,它就直接停在上界,不一定要替换基变量。

3.6 分解算法#

  • 适用场景:一个超级大系统,里面有很多子系统(比如一个大集团有多个分厂,各自生产,但共享集团的部分总资源)。
  • 角色分配
    • 主规划(总公司):负责全局把控,协调分配集团总资源。
    • 子规划(分公司):各分公司根据总公司给出的内部资源价格(单纯形乘子),在自己的小范围内做优化,然后把方案报给总公司。
  • 工作流程:分公司报方案 \rightarrow 总公司评估并调整资源价格 \rightarrow 分公司根据新价格重新优化报方案 \rightarrow 循环往复,直到分公司无法报出更赚钱的方案,此时全局达到最优。

Ch 04. 对偶原理及灵敏度分析#

线性规划对偶理论#

1. 对偶形式构造规则#

【直观理解:什么是对偶?】

  • 原始问题(Primal):我有若干资源,如何安排生产,才能使利润最大
  • 对偶问题(Dual):别人想买断我的所有资源,他该如何定价(对偶变量 ww 就是资源的估价),才能使收购总成本最小,同时我又愿意卖给他(不低于我自己生产的收益)?

(1)对称对偶

  • 原问题(少花钱,满足基本需求):

    mincxs.t.Axbx0\begin{array}{ll} \min & \boldsymbol{c}\boldsymbol{x} \\ \text{s.t.} & \boldsymbol{A}\boldsymbol{x}\ge\boldsymbol{b} \\ & \boldsymbol{x} \ge \boldsymbol{0} \end{array}
  • 对偶问题(多收钱,但报价不能高过市场价)

    maxwbs.t.wAcw0\begin{array}{ll} \max & \boldsymbol{w}\boldsymbol{b} \\ \text{s.t.} & \boldsymbol{w}\boldsymbol{A}\le\boldsymbol{c} \\ & \boldsymbol{w} \ge \boldsymbol{0} \end{array}

(2)非对称对偶与一般混合约束转换

  • 原问题:

    mincxs.t.A1xb1A2x=b2A3xb3x0\begin{array}{rrrrrcr} \min & cx & & & \\ \text{s.t.} & A_1x & \ge & b_1 \\ & A_2x & = & b_2 \\ & A_3x & \le & b_3 \\ \end{array} \\ x \ge 0
  • 对偶问题:

    maxw1b1+w2b2+w3b3s.t.w1A1+w2A2+w3A3cw10w30w2无限制\begin{array}{l} \max &w_1b_1+w_2b_2+w_3b_3 \\ \text{s.t.} &w_1A_1 + w_2A_2 + w_3A_3 \le c ,\\ \end{array} \\ w_1 \ge 0 ,\\ w_3 \le 0,\\ w_2无限制

2. 三大对偶定理#

(1)弱对偶定理

  • 数学表达min\min 问题的任意可行解 x(0)x^{(0)}max\max 问题的任意可行解 w(0)w^{(0)},有关系 cx(0)w(0)b\boldsymbol{c}\boldsymbol{x^{(0)}} \ge \boldsymbol{w^{(0)}}\boldsymbol{b}
  • 通俗翻译“买家的最高出价,也绝不会超过卖家的最低底线。”
  • 考试妙用:如果你找到一个原问题的解(比如收益是100)和一个对偶问题的解(比如成本也是100),不用怀疑,它们两个都已经达到最值了。

(2)强对偶定理

  • 通俗翻译:在市场完全竞争(达到最优)时,买家的出价(资源总估值)和卖家的收益(生产总利润)一分钱都不差,完美相等

(3)互补松弛定理

  • 数学表达:成对乘积为0,即 xj(wAjTcj)=0x_j (w A^T_j - c_j) = 0wi(Aixbi)=0w_i (A_i x - b_i) = 0
  • 通俗翻译(两句大白话)
    1. 若资源有剩,则该资源不值钱:如果某种资源 ii 在最优方案里没有用完(约束是严格不等式 Aix>biA_i x > b_i),那它的影子价格(对偶变量)一定是 wi=0w_i = 0
    2. 若某产品赔钱,则绝不生产:如果生产产品 jj 的虚拟成本高于市场价(即 wAjT>cjw A^T_j > c_j),那么最优方案中这种产品绝对不生产(xj=0x_j = 0)。
    3. 反过来:如果决定生产(xj>0x_j > 0),说明刚好保本(wAjT=cjw A^T_j = c_j
  • 考试怎么用
    • 题目通常会给你原问题的最优解 x=(2,0,4)x^* = (2, 0, 4)
    • 第一步:因为 x1>0x_1 > 0x3>0x_3 > 0,所以对应的第1、3个对偶约束必须是等式(即等号成立)。
    • 第二步:代入原问题的约束,看看哪些约束有剩余。如果有剩余,对应的对偶变量 wi=0w_i = 0
    • 第三步:列方程组,轻松解出对偶最优解 ww^*

例题

给定线性规划问题,原问题为

min2x1+3x2+x3s.t.3x1x2+x31,x1+2x23x32,x1,x2,x30.\begin{array}{ll} \min&\quad 2x_1 + 3x_2 + x_3 \\ \text{s.t.}&\quad 3x_1 - x_2 + x_3 \ge 1, \\ &\quad x_1 + 2x_2 - 3x_3 \ge 2, \\ &\quad x_1,x_2,x_3 \ge 0. \end{array}

它的对偶问题为

maxw1+2w2s.t.3w1+w22,w1+2w23,w13w21,w1,w20.\begin{array}{ll} \max&\quad w_1 + 2w_2 \\ \text{s.t.}&\quad 3w_1 + w_2 \le 2, \\ &\quad -w_1 + 2w_2 \le 3, \\ &\quad w_1 - 3w_2 \le 1, \\ &\quad w_1,w_2 \ge 0. \end{array}

设用图解法求得对偶问题的最优解为 wˉ=(w1,w2)=(17,117)\bar{\boldsymbol{w}} = (w_1,w_2) = \left( \frac{1}{7},\frac{11}{7} \right),试用互补松弛定理求原问题的最优解。

答案: 由于在最优解 wˉ\bar{\boldsymbol{w}} 处,对偶问题的第三个约束 w13w21w_1 - 3w_2 \le 1 成立严格不等式,根据 xj(wAjTcj)=0x_j (w A^T_j - c_j) = 0x3=0x_3 = 0。 又由于 wˉ\bar{\boldsymbol{w}} 的两个分量均大于 0,由 wi(Aixbi)=0w_i (A_i x - b_i) = 0 可知原问题中的前两个约束在最优解处成立等式,即

{3x1x2+x3=1,x1+2x23x3=2.\left\{ \begin{array}{l} 3x_1 - x_2 + x_3 = 1, \\ x_1 + 2x_2 - 3x_3 = 2. \end{array} \right.

x3=0x_3 = 0 代入上述方程组,得到

{3x1x2=1,x1+2x2=2.\left\{ \begin{array}{l} 3x_1 - x_2 = 1, \\ x_1 + 2x_2 = 2. \end{array} \right.

解此方程,得到x1=47,x2=57x_1 = \frac{4}{7}, x_2 = \frac{5}{7},因此原问题的最优解是 xˉ=(x1,x2,x3)T=(47,57,0)T\bar{\boldsymbol{x}} = (x_1, x_2, x_3)^T = (\frac{4}{7}, \frac{5}{7}, 0)^T,目标函数的最优值为 fmin=237f_{min} = \frac{23}{7}

对偶单纯形法#

在传统的原单纯形法(Primal Simplex Method)中,当我们遇到 gege== 的约束条件时,加入常规的松弛变量后,由于右端常数(RHS)的要求,我们无法直接得到一个初始可行基(即单位矩阵)。

为了强行构造出一个初始基,原单纯形法必须引入人工变量,并使用大 M 法(Big-M Method)或两阶段法(Two-Phase Method)。这不仅增加了变量的维度,计算过程也非常繁琐,大 M 法还容易在计算机求解时引发数值不稳定的问题。

对偶单纯形法的巧妙之处在于:它允许“原问题不可行”,只要“对偶问题可行”即可开始迭代。

具体操作如下:

  1. 转化约束:将 b\ge b(其中 b>0b > 0)的约束两边同乘 -1,变成 b\le -b
  2. 加入常规松弛变量:直接加上大于等于 0 的松弛变量 xsx_s。此时的初始基就是这些松弛变量。
  3. 状态分析:
    • 此时常数项变成了负数(-b),即变量取负值,原问题不可行(Primal Infeasible)。
    • 但是,如果目标函数的检验数 zjcjz_j - c_j 已经满足最优性条件(对于求极小值问题,所有 zjcj0z_j - c_j \le 0),这就意味着对偶问题是可行的(Dual Feasible)。

例题#

用对偶单纯形法解问题:

min12x1+8x2+16x3+12x4,s.t.2x1+x2+4x32,2x1+2x2+4x43,xj0,j=1,,4.\begin{array}{ll} \min & 12x_1 + 8x_2 + 16x_3 + 12x_4, \\ \text{s.t.} & 2x_1 + x_2 + 4x_3 \quad\quad \ge 2, \\ & 2x_1 + 2x_2 \quad\quad + 4x_4 \ge 3, \\ & x_j \ge 0,\quad j = 1,\dots,4. \end{array}

1. 问题标准化

原问题为极小化问题,且约束条件均为 \ge。为了使用对偶单纯形法,我们需要将约束条件两边同乘 1-1 转化为 \le 形式,然后加入松弛变量 x5,x60x_5, x_6 \ge 0

转化后的目标函数和约束条件如下:

minz=12x1+8x2+16x3+12x4+0x5+0x6s.t.2x1x24x3+x5=22x12x24x4+x6=3xj0,j=1,,6\begin{array}{ll} \min & z = 12x_1 + 8x_2 + 16x_3 + 12x_4 + 0x_5 + 0x_6 \\ \text{s.t.} & -2x_1 - x_2 - 4x_3 + x_5 = -2 \\ & -2x_1 - 2x_2 - 4x_4 + x_6 = -3 \\ & x_j \ge 0, \quad j = 1, \dots, 6 \end{array}

初始检验数分析:

对于求极小值问题,检验数的定义为 σj=zjcj\sigma_j = z_j - c_j。当所有 zjcj0z_j - c_j \le 0 时,满足对偶可行性(即达到最优条件)。 初始基变量为 x5,x6x_5, x_6,对应常数项 bb 分别为 2,3-2, -3。由于 bi<0b_i < 0,原问题不可行,但所有检验数 zjcj=0cj0z_j - c_j = 0 - c_j \le 0,满足对偶可行性,因此可以直接使用对偶单纯形法。

2. 对偶单纯形法迭代过程

迭代规则:

  1. 换出变量 (Leaving Variable): 选择 bib_i 中最小的负数所在的行,对应的基变量换出。
  2. 换入变量 (Entering Variable): 对于换出变量所在行的系数 aij<0a_{ij} < 0 的列,计算比值 θ=zjcjaij\theta = \frac{z_j - c_j}{a_{ij}},选择比值最小的列对应的非基变量换入。

初始单纯形表

b2=3b_2 = -3 是最小的负数,因此 x6x_6 换出(主元行 2)。 计算比值 θ\theta

  • x1:12/2=6x_1: -12 / -2 = 6
  • x2:8/2=4x_2: -8 / -2 = 4
  • x4:12/4=3x_4: -12 / -4 = 3 (最小) 因此 x4x_4 换入(主元列 4)。主元为 a24=4a_{24} = -4
CBXBbx1x2x3x4x5x60x522140100x63220401zjcj0128161200\begin{array}{|c|c|c|cccc|cc|} \hline C_B & X_B & b & x_1 & x_2 & x_3 & x_4 & x_5 & x_6 \\ \hline 0 & x_5 & -2 & -2 & -1 & -4 & 0 & 1 & 0 \\ 0 & x_6 & -3 & -2 & -2 & 0 & \mathbf{-4} & 0 & 1 \\ \hline z_j - c_j & & 0 & -12 & -8 & -16 & -12 & 0 & 0 \\ \hline \end{array}

第一次迭代

进行行变换,使主元变为 1,同列其他元素变为 0。

  • 第 2 行 ÷(4)\div (-4)
  • 检验数行 (12)×- (-12) \times 新第 2 行
CBXBbx1x2x3x4x5x60x5221401012x43/41/21/20101/4zjcj96216003\begin{array}{|c|c|c|cccc|cc|} \hline C_B & X_B & b & x_1 & x_2 & x_3 & x_4 & x_5 & x_6 \\ \hline 0 & x_5 & -2 & \mathbf{-2} & -1 & -4 & 0 & 1 & 0 \\ 12 & x_4 & 3/4 & 1/2 & 1/2 & 0 & 1 & 0 & -1/4 \\ \hline z_j - c_j & & 9 & -6 & -2 & -16 & 0 & 0 & -3 \\ \hline \end{array}

此时 b1=2<0b_1 = -2 < 0,因此 x5x_5 换出(主元行 1)。

计算比值 θ\theta (a1j<0a_{1j} < 0):

  • x1:6/2=3x_1: -6 / -2 = 3
  • x2:2/1=2x_2: -2 / -1 = 2 (最小)
  • x3:16/4=4x_3: -16 / -4 = 4

因此 x2x_2 换入(主元列 2)。主元为 a12=1a_{12} = -1

第二次迭代

进行行变换:

  • 第 1 行 ÷(1)\div (-1)
  • 第 2 行 (1/2)×- (1/2) \times 新第 1 行
  • 检验数行 (2)×- (-2) \times 新第 1 行
CBXBbx1x2x3x4x5x68x2221401012x41/41/20211/21/4zjcj13208023\begin{array}{|c|c|c|cccc|cc|} \hline C_B & X_B & b & x_1 & x_2 & x_3 & x_4 & x_5 & x_6 \\ \hline 8 & x_2 & 2 & 2 & 1 & 4 & 0 & -1 & 0 \\ 12 & x_4 & -1/4 & \mathbf{-1/2} & 0 & -2 & 1 & 1/2 & -1/4 \\ \hline z_j - c_j & & 13 & -2 & 0 & -8 & 0 & -2 & -3 \\ \hline \end{array}

此时 b2=1/4<0b_2 = -1/4 < 0,因此 x4x_4 换出(主元行 2)。

计算比值 θ\theta (a2j<0a_{2j} < 0):

  • x1:2/(1/2)=4x_1: -2 / (-1/2) = 4
  • x3:8/2=4x_3: -8 / -2 = 4
  • x6:3/(1/4)=12x_6: -3 / (-1/4) = 12

这里 x1x_1x3x_3 的比值同为 4 发生退化(Tie),根据勃兰特法则(Bland’s Rule),选择下标较小的变量,因此 x1x_1 换入(主元列 1)。主元为 a21=1/2a_{21} = -1/2

第三次迭代

进行行变换:

  • 第 2 行 ÷(1/2)\div (-1/2)
  • 第 1 行 2×- 2 \times 新第 2 行
  • 检验数行 (2)×- (-2) \times 新第 2 行
CBXBbx1x2x3x4x5x68x2101441112x11/2104211/2zjcj14000442\begin{array}{|c|c|c|cccc|cc|} \hline C_B & X_B & b & x_1 & x_2 & x_3 & x_4 & x_5 & x_6 \\ \hline 8 & x_2 & 1 & 0 & 1 & -4 & 4 & 1 & -1 \\ 12 & x_1 & 1/2 & 1 & 0 & 4 & -2 & -1 & 1/2 \\ \hline z_j - c_j & & 14 & 0 & 0 & 0 & -4 & -4 & -2 \\ \hline \end{array}

3. 最终结论

在当前的单纯形表中,所有的常数项 bi0b_i \ge 0(原问题已具备可行性),且所有的检验数 zjcj0z_j - c_j \le 0(对偶问题保持最优性)。因此,当前解即为最优解。

最优解为: x1=12,x2=1,x3=0,x4=0x_1 = \frac{1}{2}, x_2 = 1, x_3 = 0, x_4 = 0

目标函数的最小值为: minz=14\min z = 14

灵敏度分析#

工厂的生产计划做好了,突然经理说:“原材料涨价了(cc 变了)”或者“仓库多送来一吨钢材(bb 变了)”。 我们千万不想重新列方程算一遍。灵敏度分析就是利用已经算好的最终单纯形表,做一点点矩阵乘法,快速算出新方案。

1. 核心概念:影子价格(Shadow Price)#

  • 通俗翻译“多给我一单位的某种资源,我的总利润能增加多少?”
  • 经济意义
    • 如果某种资源在最优方案里没有用完,它的影子价格就是 00(白送你一吨你也没用)。
    • 如果某种资源紧缺,它的影子价格是 55。这意味着如果市场上这种资源的价格低于 55,你买进来就是划算的。

2. 常考扰动的应对策略#

(1)目标系数 cjc_j 变了(产品价格波动)

  • 如果它是“没生产”的产品(非基变量)
    • 只要它涨价没涨到“值得生产”的门槛(检验数依旧 0\le 0),生产计划完全不变
  • 如果它是“正在生产”的产品(基变量)
    • 它变动会影响很多产品的检验数。我们需要列出不等式,算出它的“安全变动区间”。在这个区间内,生产计划不变。

(2)右端项 bib_i 变了(资源量变动)

  • 用最终表的逆矩阵乘上新的资源向量,即 B1bB^{-1}b'
  • 如果算出来的结果全 0\ge 0:太棒了!原计划的结构不用变,只需要把新数字代入,算一下新产量和新利润(利用影子价格快速计算:新利润 = 旧利润 + 变动量 ×\times 影子价格)。
  • 如果算出来的结果出现了负数:说明现在的资源分配方案“不可行”了。不用重算,直接在这个表上用对偶单纯形法转几步即可。

(3)增加新约束(突然出台了环保新规)

  • 第一步:把我们现有的最优解代入这个新约束。
  • 第二步:如果新约束依然满足,皆大欢喜,新约束当不存在,最优解不变。
  • 第三步:如果不满足,把新约束加到表格最下面,引入一个松弛变量。此时表格会出现负数,直接用对偶单纯形法把它纠正过来。

例子#

设生产桌子 x1x_1 张,椅子 x2x_2 把。

  • 目标函数(利润最大化):
maxz=50x1+30x2max z = 50x_1 + 30x_2
  • 约束条件:
    • 木材限制:4x1+2x21004x_1 + 2x_2 \le 100
    • 工时限制:2x1+2x2802x_1 + 2x_2 \le 80
    • 非负约束:x1,x20x_1, x_2 \ge 0

引入松弛变量:

  • x3x_3:未使用的木材量(木材松弛变量)
  • x4x_4:未使用的工时量(工时松弛变量)
max50x1+30x2s.t.4x1+2x2+x3=1002x1+2x2+x4=80xj0,j=1,,4\begin{array}{ll} \max & 50x_1 + 30x_2 \\ \text{s.t.} & 4x_1 + 2x_2 + x3 = 100\\ & 2x_1 + 2x_2 + x_4 = 80 \\ & x_j \ge 0, \quad j = 1, \dots, 4 \end{array}

初始单纯形表:

cj503000CB基变量x1x2x3x4RHSθ( RHS/xj)0x3[4]210100100/4=250x422018080/2=40zjcj5030000\begin{array}{cc|cccc|c|c} \hline c_j & & 50 & 30 & 0 & 0 & & \\ C_B & \text{基变量} & x_1 & x_2 & x_3 & x_4 & \text{RHS} & \theta (\text{ RHS}/x_j) \\ \hline 0 & x_3 & [4] & 2 & 1 & 0 & 100 & 100/4 = 25 \\ 0 & x_4 & 2 & 2 & 0 & 1 & 80 & 80/2 = 40 \\ \hline z_j - c_j & & -50 & -30 & 0 & 0 & 0 \\ \hline \end{array}

主元为 [4][4] (第一行第一列)。对第一行进行行变换(除以4),然后消去第二行和判别数行中的 x1x_1

迭代第二次表:

cj503000CB基变量x1x2x3x4RHSθ( RHS/xj)50x111/21/402525/(1/2)=500x40[1]1/213030/1=30zjcj0525/201250\begin{array}{cc|cccc|c|c} \hline c_j & & 50 & 30 & 0 & 0 & & \\ C_B & \text{基变量} & x_1 & x_2 & x_3 & x_4 & \text{RHS} & \theta (\text{ RHS}/x_j) \\ \hline 50 & x_1 & 1 & 1/2 & 1/4 & 0 & 25 & 25/(1/2) = 50 \\ 0 & x_4 & 0 & [1] & -1/2 & 1 & 30 & 30/1 = 30 \\ \hline z_j - c_j & & 0 & -5 & 25/2 & 0 & 1250 \\ \hline \end{array}

主元为 [1][1] (第二行第二列)。消去第一行和 z 行中的 x2x_2

cj503000CB基变量x1x2x3x4RHSθ( RHS/xj)50x1101/21/21030x20[1]1/2130zjcj001051400\begin{array}{cc|cccc|c|c} \hline c_j & & 50 & 30 & 0 & 0 & & \\ C_B & \text{基变量} & x_1 & x_2 & x_3 & x_4 & \text{RHS} & \theta (\text{ RHS}/x_j) \\ \hline 50 & x_1 & 1 & 0 & 1/2 & -1/2 & 10 & \\ 30 & x_2 & 0 & [1] & -1/2 & 1 & 30 & \\ \hline z_j - c_j & & 0 & 0 & 10 & 5 & 1400 \\ \hline \end{array}

从最终表读取的关键信息

  • 最优解:生产桌子 x1=10x_1^* = 10 张,椅子 x2=30x_2^* = 30 把。

  • 最大利润:z=1400z^* = 1400 元。

  • 最优基的逆矩阵 B1B^{-1}:直接对应初始松弛变量x3x_3x4x_4下方的矩阵

    B1=(0.50.50.51)B^{-1} = \begin{pmatrix} 0.5 & -0.5 \\ -0.5 & 1 \end{pmatrix}
  • 影子价格(对偶最优解):看 x3x_3x4x_4 的检验数

    • 木材的影子价格 w1=10w_1 = 10
    • 工时的影子价格 w2=5w_2 = 5

场景 1. 椅子的利润c2c_2从30元跌到25元,生产计划要变吗?

设椅子的利润c2c_2的变动量为 Δc2\Delta c_2(此处 Δc2=5\Delta c_2 = -5)。

当基变量的目标系数改变时,所有非基变量(x3,x4x_3, x_4)的检验数都会发生变化。

新检验数的计算公式为:

σj=σjΔc(最终表中该非基变量列)\sigma_j' = \sigma_j - \Delta c_{\text{基}} \cdot (\text{最终表中该非基变量列})

我们来检查非基变量 x3x_3x4x_4 的新检验数(必须保持 0\ge 0 才能维持最优):

  • 对于 x3x_3(木材): σ3=10(Δc2)(0.5)=10+0.5Δc20    Δc220\sigma_3' = 10 - (\Delta c_2) \cdot (-0.5) = 10 + 0.5 \Delta c_2 \ge 0 \implies \Delta c_2 \ge -20
  • 对于 x4x_4(工时): σ4=5(Δc2)(1)=5Δc20    Δc25\sigma_4' = 5 - (\Delta c_2) \cdot (1) = 5 - \Delta c_2 \ge 0 \implies \Delta c_2 \le 5

计算结果:只要 20Δc25-20 \le \Delta c_2 \le 5 最优生产方案(10张桌子,30把椅子)就不需要改变

  • 实际结论:跌到 25 元在安全区间内,所以生产方案完全不需调整。新利润变为 10×50+30×25=125010 \times 50 + 30 \times 25 = 1250 元。

场景 2. 供应商送来 10 公斤木材(资源b1b_1从100变为110),开价 8 元/公斤,我们应该买吗?

这属于右端项 bb 的变动:Δb=(100)\Delta b = \begin{pmatrix} 10 \\ 0 \end{pmatrix}。 我们使用 B1B^{-1} 来计算新的基变量取值,验证方案是否依然可行(即所有变量是否保持 0\ge 0):

xB=B1(b+Δb)=B1b+B1Δbx_B' = B^{-1} (b + \Delta b) = B^{-1} b + B^{-1} \Delta bxB=(1030)+(0.50.50.51)(100)=(1030)+(55)=(1525)x_B' = \begin{pmatrix} 10 \\ 30 \end{pmatrix} + \begin{pmatrix} 0.5 & -0.5 \\ -0.5 & 1 \end{pmatrix} \begin{pmatrix} 10 \\ 0 \end{pmatrix} = \begin{pmatrix} 10 \\ 30 \end{pmatrix} + \begin{pmatrix} 5 \\ -5 \end{pmatrix} = \begin{pmatrix} 15 \\ 25 \end{pmatrix}

计算结果

  • 新的生产计划:桌子 x1=15x_1 = 15 张,椅子 x2=25x_2 = 25 把。
  • 因为两个数都大等于 0,方案依然可行。
  • 新利润15×50+25×30=150015 \times 50 + 25 \times 30 = 1500 元(比原来增加了 100元)。
  • 决策依据:利润增加了 100 元,平均每公斤木材增值 100/10=10100 / 10 = 10 元(这正是木材的影子价格)。既然供应商开价 8 元/公斤,低于 10 元,果断购买

场景 3. 开发新产品(豪华木柜),利润 100 元,消耗 12 公斤木材 + 4 个工时,要生产吗?

这属于引入新变量 xnewx_{\text{new}}。其在约束条件中的系数列为 Pnew=(124)P_{\text{new}} = \begin{pmatrix} 12 \\ 4 \end{pmatrix},利润 cnew=100c_{\text{new}} = 100

我们需要计算新产品的检验数(在极大化问题中,若检验数 znewcnew0z_{\text{new}} - c_{\text{new}} \ge 0,则不值得生产): znewcnew=wPnewcnewz_{\text{new}} - c_{\text{new}} = w \cdot P_{\text{new}} - c_{\text{new}}

其中 w=(10,5)w = (10, 5) 是我们在最终表中得到的影子价格向量。 znewcnew=(10,5)(124)100=(120+20)100=140100=40z_{\text{new}} - c_{\text{new}} = (10, 5) \begin{pmatrix} 12 \\ 4 \end{pmatrix} - 100 = (120 + 20) - 100 = 140 - 100 = 40

计算结果

  • 检验数为 +40
  • 因为检验数大于 0(在我们的标准中,由于生产它带来的消耗折合 140元,大于其自身的利润 100元),如果强行生产它,每生产一个木柜会导致总利润下降 40元
  • 实际结论不生产木柜

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
北邮研究生课程《最优化理论与算法》知识总结 - Part 1
https://llm-tech.com.cn/posts/bupt-optimization-theory-1/
作者
Ming
发布于
2026-06-18
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-06-18,距今已过 33 天

部分内容可能已过时

Profile Image of the Author
Ming
你是来找 Ming 学习的吗
🎉 欢迎来到 Ming 的博客
这里是我的个人博客,分享 AI Infra、LLM 等技术内容。欢迎关注交流!
分类
标签
站点统计
文章
17
分类
10
标签
16
总字数
52,871
运行时长
0
最后活动
0 天前

目录