10.4 线性规划
一、线性规划
线性规划(Linear programming)是在线性代数的基础上再结合两个新的思想:不等式(inequalities) 和最小化(minimization)。这个问题仍然是从矩阵方程 Ax=bA\boldsymbol x=\boldsymbol bAx=b 开始,但是只考虑非负解向量,我们要求 x≥0\boldsymbol x\ge0x≥0(意味着 x\boldsymbol xx 的分量都不能为负)。一般来说,未知数要比方程的个数多,即矩阵的 n>mn>mn>m,因此,如果方程 Ax=bA\boldsymbol x=\boldsymbol bAx=b 存在有 x≥0\boldsymbol x\ge\boldsymbol 0x≥0 的解,那么可能会有很多个这样的解。线性规划是研究如何寻找解 x∗≥0\boldsymbol x^*\ge\boldsymbol 0x∗≥0 使得下面的成本最小:
成本为 c1x1+c2x2+⋯cnxnc_1x_1+c_2x_2+\cdots c_nx_nc1x1+c2x2+⋯cnxn,寻找线性方程组 Ax=bA\boldsymbol x=\boldsymbol bAx=b 的非负解向量 x∗\boldsymbol x^*x∗,使得成本最小。
因此,线性规划问题是由一个矩阵 AAA 和两个向量 b\boldsymbol bb 和 c\boldsymbol cc 来定义的:
- m×nm\times nm×n 的矩阵 AAA 有 n>mn>mn>m:如 A=[112]A=\begin{bmatrix}1&1&2\end{bmatrix}A=[112](一个方程,三个未知数)
- mmm 个方程组 Ax=bA\boldsymbol x=\boldsymbol bAx=b 中,b\boldsymbol bb 有 mmm 个分量:如 b=[4]\boldsymbol b=\begin{bmatrix}4\end{bmatrix}b=[4]
- 成本系数向量(cost vector) 有 nnn 个分量:如 c=[538]\boldsymbol c=\begin{bmatrix}5&3&8\end{bmatrix}c=[538].
那么这个问题就是最小化成本 c⋅x\boldsymbol c\cdot\boldsymbol xc⋅x,其中约束条件为 Ax=bA\boldsymbol x=\boldsymbol bAx=b 和 x≥0:\boldsymbol x\ge\boldsymbol 0:x≥0:最小化5x1+3x2+8x3,约束条件是x1+x2+2x3=4和x1,x2,x3≥0\pmb{最小化\kern 5pt5x_1+3x_2+8x_3,约束条件是\kern 5ptx_1+x_2+2x_3=4\kern 5pt和\kern 5ptx_1,x_2,x_3\ge0}最小化5x1+3x2+8x3,约束条件是x1+x2+2x3=4和x1,x2,x3≥0我们这里直接跳到了问题部分,没有解释问题的来源。线性规划实际上是数学在管理学中最重要的应用,开发相关快速求解的算法和程序代码是非常有意义的。一般来说,寻找 x∗\boldsymbol x^*x∗ 要比直接求解 Ax=bA\boldsymbol x=\boldsymbol bAx=b 更难,因为对于解向量要满足额外的约束条件:x∗≥0\boldsymbol x^*\ge\boldsymbol 0x∗≥0 和成本 cTx∗\boldsymbol c^T\boldsymbol x^*cTx∗ 最小。求解该问题后,会解释问题的背景,并介绍著名的单纯形法和内点法。
首先观察约束条件:Ax=bA\boldsymbol x=\boldsymbol bAx=b 和 x≥0\boldsymbol x\ge\boldsymbol 0x≥0. 方程 x1+x2+2x3=4x_1+x_2+2x_3=4x1+x2+2x3=4 表示的是三维空间中的一个平面,加上非负性的条件 x1≥0,x2≥0,x3≥0x_1\ge0,x_2\ge0,x_3\ge0x1≥0,x2≥0,x3≥0 会将这个平面限制到了一个三角形区域,所以解向量 x∗\boldsymbol x^*x∗ 一定位于 Figure 10.5 中的三角形 PQRPQRPQR 上。
在这个三角形 PQRPQRPQR 的内部,x\boldsymbol xx 所有的分量都是正的;在这个三角形的边上,有一个分量为零;而在它三个顶点 P,QP,QP,Q 和 RRR 处,有两个分量为零。最优解(optimal solution)x∗\boldsymbol x^*x∗ 一定是这些顶点中的一个! 下面说明为什么。
这个三角形区域包含所有满足约束条件 Ax=bA\boldsymbol x=\boldsymbol bAx=b 和 x≥0\boldsymbol x\ge\boldsymbol 0x≥0 的向量 x\boldsymbol xx,这些 x\boldsymbol xx 称为可行点(feasible points), 而这个三角形区域称为可行域(feasible set). 然后,我们要在可行域中寻找能够使得成本 c⋅x\boldsymbol c\cdot\boldsymbol xc⋅x 最小化的可行点:
在三角形 PQR 中寻找使得成本 5x1+3x2+8x3 最小的点 x∗\pmb{在三角形\,PQR\,中寻找使得成本\,5x_1+3x_2+8x_3\,最小的点\,\boldsymbol x^*}在三角形PQR中寻找使得成本5x1+3x2+8x3最小的点x∗
使成本为零的向量位于平面 5x1+3x2+8x3=05x_1+3x_2+8x_3=05x1+3x2+8x3=0 上,但是这个平面三角形并不相交,所以我们无法在 x\boldsymbol xx 满足约束条件的情况下,达到零成本。因此需要逐渐增加成本 CCC,直至平面 5x1+3x2+8x3=C5x_1+3x_2+8x_3=C5x1+3x2+8x3=C 与三角形相交。随着 CCC 的增加,我们可以得到一族向着三角形区域移动的互相平行的平面。
首先与三角形区域相交的平面 5x1+3x2+8x3=C5x_1+3x_2+8x_3=C5x1+3x2+8x3=C 有最小的 CCC. 交点就是最优解 x∗\boldsymbol x^*x∗. 而这个交点一定是顶点 P,Q\pmb P,\pmb QP,Q 或 R\pmb RR 中的一个,一个平移的平面在经过三角形顶点之前不可能会先经过其内点!因此我们需要比较在每个顶点处的成本 5x1+3x2+8x35x_1+3x_2+8x_35x1+3x2+8x3:
P=(4,0,0) 对应成本 20Q=(0,4,0) 对应成本 12R=(0,0,2) 对应成本 16\pmb P=(4,0,0)\,对应成本\,20\kern 10pt{\color{blue}\pmb Q=(0,4,0)\,对应成本\,12}\kern 10pt\pmb R=(0,0,2)\,对应成本\,16P=(4,0,0)对应成本20Q=(0,4,0)对应成本12R=(0,0,2)对应成本16
顶点 Q\pmb QQ 对应的成本最小,所以 x∗=(0,4,0)\boldsymbol x^*=(0,4,0)x∗=(0,4,0) 就是这个线性规划问题的最优解。
如果成本系数向量 c\boldsymbol cc 发生改变,那么这一族互相平行的平面就会发生倾斜。如果改变比较小,Q\pmb QQ 仍然是最优解。对于成本 c⋅x=5x1+4x2+7x3\boldsymbol c\cdot\boldsymbol x=5x_1+4x_2+7x_3c⋅x=5x1+4x2+7x3,最优解 x∗\boldsymbol x^*x∗ 就会移动到 R=(0,0,2)\pmb{R}=(0,0,2)R=(0,0,2),此时最小成本是 7⋅2=147\cdot2=147⋅2=14.
注1: 有些线性规划问题是寻求利润最大化而不是成本最小化,这在数学原理上几乎是相同的。此时选择的是一个较大的 CCC,然后随着 CCC 的减小,这一族平行的平面向着原点移动(不再是远离了)。第一个交点仍然是顶点。
注2: 约束条件 Ax=bA\boldsymbol x=\boldsymbol bAx=b 和 x≥0\boldsymbol x\ge\boldsymbol 0x≥0 可能无法同时满足。如方程 x1+x2+x3=−1x_1+x_2+x_3=-1x1+x2+x3=−1 就没有满足 x≥0\boldsymbol x\ge\boldsymbol 0x≥0 的解,此时可行域是空集。
注3: 可行域也有可能的无解的。如果约束条件是 x1+x2−2x3=4x_1+x_2-2x_3=4x1+x2−2x3=4,此时一个较大的正向量 (100,100,98)(100,100,98)(100,100,98) 就是一个可行点,而更大的向量 (1000,1000,998)(1000,1000,998)(1000,1000,998) 也是一个可行点。此时平面 Ax=bA\boldsymbol x=\boldsymbol bAx=b 将不会再被截断为一个三角形了。其中两个顶点 P\pmb PP 和 Q\pmb QQ 仍然可能是最优解 x∗\boldsymbol x^*x∗,但是顶点 R\pmb RR 移动到了无穷远处。
注4: 对于一个无解的可行域,最小成本可能是 −∞-\infty−∞(负无穷大)。假设成本函数是 −x1−x2+x3-x_1-x_2+x_3−x1−x2+x3,则向量 (100,100,98)(100,100,98)(100,100,98) 对应的成本 C=−102C=-102C=−102;向量 (1000,1000,98)(1000,1000,98)(1000,1000,98) 对应的成本 C=−1002C=-1002C=−1002. 此时我们会获得报酬,而不是支付成本。在实际应用中这种情况不可能发生,但是理论上是可能的,因为 A,bA,\boldsymbol bA,b 和 c\boldsymbol cc 可能会产生无法预料的三角形区域和成本函数。
二、原问题和对偶问题
下面举一个例子来解释 A,b,cA,\boldsymbol b,\boldsymbol cA,b,c. 未知数 x1,x2,x3x_1,x_2,x_3x1,x2,x3 分别表示一个博士、一个学生和一台机器的工作时间,每小时的成本分别为 $555,$333 和 $888,工作的时间不能为负:x1≥0,x2≥0,x3≥0x_1\ge0,x_2\ge0,x_3\ge0x1≥0,x2≥0,x3≥0. 博士和学生都是每小时完成一道题目,而机器每小时可以完成两道题。现在有四道题目需要完成,原则上它们可以分工合作完成:x1+x2+2x3=4x_1+x_2+2x_3=4x1+x2+2x3=4.
现在的问题是用最小的成本 cTx\boldsymbol c^T\boldsymbol xcTx 完成这四道题目。
如果这三者同时工作,那么这项工作需要一个小时完成:x1=x2=x3=1x_1=x_2=x_3=1x1=x2=x3=1,成本是 5+3+8=165+3+8=165+3+8=16 美元。但是我们可以发现博士和学生的解题速度是一样的,而学生的成本要更低,所以博士会被学生替代(这个问题就变得比较实际)。当学生工作两个小时,机器工作一小时也可以完成全部的四道题目,此时的成本是 6+8=146+8=146+8=14 美元。由于博士并没有参与解题,所以 x1=0x_1=0x1=0,此时这个解在图中三角形区域的边 QR\pmb{QR}QR 上,因此最优解应该是这四道题目全部都由学生完成(在 Q\pmb QQ 点)或全部由机器完成(在 R\pmb RR 点)。而在本例题中,学生用四个小时来解这四道题的成本是 $121212 —— 这是最小的成本。
由于约束条件 Ax=bA\boldsymbol x=\boldsymbol bAx=b 只有一个方程,所以顶点 (0,4,0)(0,4,0)(0,4,0) 只有一个非零分量。当约束条件 Ax=bA\boldsymbol x=\boldsymbol bAx=b 有 mmm 个方程时,顶点有 mmm 个非零分量。尽管可以令其中 n−mn-mn−m 个自由变量为零,然后求解 Ax=bA\boldsymbol x=\boldsymbol bAx=b 剩下的 mmm 个变量,但是,我们并不知道应该选择求解哪 mmm 个变量。
可行域顶点的个数就是从 nnn 个分量中选择 mmm 个分量方法的总数,即 CnmC_n^mCnm. 从 nnn 个数中选择 mmm 个数,这与概率密切相关。如有 202020 个未知数 m=8m=8m=8 个方程(这些数仍然很小),可行域有 C208=20!12!8!=125970C_{20}^8=\dfrac{20!}{12!8!}=125970C208=12!8!20!=125970 个顶点。
我们为了找到最小的成本检验 333 个顶点没有什么问题,但是要检验这 125970125970125970 个顶点,我们不能使用这个方法。而使用单纯形法要快得多。
对偶问题(The Daul Problem): 在线性规划中,问题通常是成对出现的,有最大值问题和最小值问题 —— 原问题和它的 “对偶” 问题。原问题使用矩阵 AAA 和两个向量 b\boldsymbol bb 和 c\boldsymbol cc 来表示,对偶问题是使用 AAA 的转置,然后交换一下向量 b\boldsymbol bb 和 c\boldsymbol cc 来表示:目标是最大化 b⋅y\boldsymbol b\cdot\boldsymbol yb⋅y. 下面是原问题的对偶问题:
一个作弊者通过出售问题的答案来解决问题。 每个问题的费用是 yyy 美元,总共是 4y4y4y 美元(此时 b=[4]\boldsymbol b=\begin{bmatrix}4\end{bmatrix}b=[4] 进入到收入中)。很明显,这个作弊者的收费不能超过博士、学生或者机器的成本,即:y≤5,y≤3y\le5,y\le3y≤5,y≤3 且 2y≤82y\le82y≤8(此时 c=(5,3,8)\boldsymbol c=(5,3,8)c=(5,3,8) 进入到了不等式约束条件中),这个作弊者需要最大化他的收入 4y4y4y.
对偶问题在约束条件 ATy≤c下,最大化收入 b⋅y≤c\kern 15pt\color{blue}在约束条件\,A^T\boldsymbol y\le\boldsymbol c 下,最大化收入\,\boldsymbol b\cdot\boldsymbol y\le\boldsymbol c在约束条件ATy≤c下,最大化收入b⋅y≤c.
当 y=3y=3y=3 时,收入 4y=124y=124y=12 美元达到最大,对偶问题的最大值($121212)等于原问题的最小值($121212),这就是对偶性。
对偶问题中,如果其中一个问题有最优解向量(x∗\boldsymbol x^*x∗ 或 y∗\boldsymbol y^*y∗),那么另一也有最优解向量。
最小化成本 c⋅x∗等于最大化收入 b⋅y∗{\color{blue}最小化成本\,\boldsymbol c\cdot\boldsymbol x^*}\kern 15pt等于\kern 15pt\color{blue}最大化收入\,\boldsymbol b\cdot\boldsymbol y^*最小化成本c⋅x∗等于最大化收入b⋅y∗
本课程前面有介绍行图和列图,第一个 “对偶定理” 是关于秩的:矩阵的线性无关的最大行数等于线性无关的最大列数。这个定理和上面的对偶问题一样,在矩阵规模较小时很容易进行验证。下面证明该定理中比较容易的部分 —— 作弊者的收入 bTy\boldsymbol b^T\boldsymbol ybTy 不会超过实际的解题成本:如果 Ax=b,x≥0,ATy≤c则bTy=(Ax)Ty=xT(ATy)≤xTc(10.4.1){\color{blue}如果\,A\boldsymbol x=\boldsymbol b,\boldsymbol x\ge\boldsymbol 0,A^T\boldsymbol y\le\boldsymbol c\kern 15pt则\kern 15pt\boldsymbol b^T\boldsymbol y=(A\boldsymbol x)^T\boldsymbol y=\boldsymbol x^T(A^T\boldsymbol y)\le\boldsymbol x^T\boldsymbol c}\kern 20pt(10.4.1)如果Ax=b,x≥0,ATy≤c则bTy=(Ax)Ty=xT(ATy)≤xTc(10.4.1)完整的对偶定理说的是,当 bTy\boldsymbol b^T\boldsymbol ybTy 达到最大值时,xTc\boldsymbol x^T\boldsymbol cxTc 达到最小值,它们相等:b⋅y∗=c⋅x∗\boldsymbol b\cdot\boldsymbol y^*=\boldsymbol c\cdot\boldsymbol x^*b⋅y∗=c⋅x∗. 注意(10.4.1)中最后一步有不等式符号 ≤\le≤:
x≥0 和 s=c−ATy≥0 的点积 xTs≥0,这个就是 xTATy≤xTc\boldsymbol x\ge\boldsymbol 0\,和 \,\boldsymbol s=\boldsymbol c-A^T\boldsymbol y\ge\boldsymbol 0\,的点积\,\boldsymbol x^T\boldsymbol s\ge\boldsymbol 0,这个就是\,\boldsymbol x^TA^T\boldsymbol y\le\boldsymbol x^T\boldsymbol cx≥0和s=c−ATy≥0的点积xTs≥0,这个就是xTATy≤xTc
两式相等需要 xTs=0\color{blue}两式相等需要\,\boldsymbol x^T\boldsymbol s=\boldsymbol 0两式相等需要xTs=0,因此最优解对于每个 jjj 都有 xj∗=0 或 sj∗=0\color{blue}\boldsymbol x^*_j=\boldsymbol 0\,或\,\boldsymbol s^*_j=\boldsymbol 0xj∗=0或sj∗=0.
三、单纯形法
消元法是求解线性方程组的主要方法,单纯形法(simplex method)是求解线性不等式的主要方法,这里只阐述单纯形法的原理。单纯形法是从可行域一个顶点出发搜索使成本更低的相邻顶点,最终(实际应用中会很快)到达成本最低的那个顶点。
顶点对应一个 nnn 维的 x≥0\boldsymbol x\ge\boldsymbol 0x≥0 的向量,且满足 mmm 个方程组 Ax=bA\boldsymbol x=\boldsymbol bAx=b,它最多有 mmm 个正分量,另外 n−mn-mn−m 个分量均为零(这些对应着自由变量,带回方程组可以求得 mmm 个基本变量的值,x\boldsymbol xx 的所有分量一定能够都是非负的,否则就不是顶点)。对于相邻的顶点,xxx 的一个零分量会变为正值,而一个正分量会变为零。
单纯形法的每一步都必须要决定哪个分量应该通过将其变为正值来 “换入(enter)”,哪个分量应该把它变为零来 “换出(leaves)”,决定的依据是降低总成本。这样单纯形法会向最优解 x∗\boldsymbol x^*x∗ 移动一步。
下面说明整体思想:观察当前顶点的每个零分量,如果将其从 000 变为 111,而为了保持 Ax=bA\boldsymbol x=\boldsymbol bAx=b 成立,其它的非零分量将不得不调整,我们通过回代来求新的 x\boldsymbol xx,并计算总成本 c⋅x\boldsymbol c\cdot\boldsymbol xc⋅x 的改变量。这个改变量就是该分量 “降低的成本(reduced cost)” rrr,换入的分量是就是取得最小负值(most negative) rrr 的那一个,rrr 是该分量最大的单位成本减少量。
【例1】上述的原问题,假设当前的顶点是 P=(4,0,0)\pmb P=(4,0,0)P=(4,0,0),表示所有的工作全部由博士完成(总成本是 $202020). 如果学生工作一小时,x=(3,1,0)\boldsymbol x=(3,1,0)x=(3,1,0) 对应的成本将下降到 $181818,减少的成本是 r=−2r=-2r=−2 美元. 如果机器工作一小时,则 x=(2,0,1)\boldsymbol x=(2,0,1)x=(2,0,1) 对应的成本也是 $181818,减少到成本也为 r=−2r=-2r=−2 美元。这种情况下单纯形法可以选择学生或机器的工作时间作为换入分量。
即使在这样一个小的例子中,第一步也可能无法立即得到最优的 x∗\boldsymbol x^*x∗。单纯性法首先选择一个换入分量,然后才可以确定换入分量的数值。我们将换入分量从 000 变为 111 后再计算 rrr,但是一单位的分量通常太大或太小。本例中,单纯形法选择换出分量(博士),最优解将会向着顶点 Q\pmb QQ 或 R\pmb RR 移动。
换入的分量的值越大,成本就越低。当其中一个正分量(我们调整其余的分量以满足 Ax=bA\boldsymbol x=\boldsymbol bAx=b)变为零时,我们就要停止该这个换入过程。换出分量是第一个取到零的那个正分量 xix_ixi,此时我们就找到了一个相邻的顶点,然后从新的顶点开始搜索下一个要换入和换出的分量。
当所有成本的改变量都为正时,当前的顶点就是最优解 x∗\boldsymbol x^*x∗. 此时没有零分量可以在成本 c⋅x\boldsymbol c\cdot\boldsymbol xc⋅x 不增加的情况下变为正值,没有新的变量要换入了,这个问题就解决了(同样也求得的对偶问题的 y∗\boldsymbol y^*y∗)。
注: 通常需要 αn\alpha nαn 步就可以得到 x∗\boldsymbol x^*x∗,其中 α\alphaα 不会太大。但是也有需要经过指数级单纯性法步数才能找到最优解的例子,进而人们发展出了另一种求解方法,这个方法保证了使用更少(但更困难)的步骤求得 x∗\boldsymbol x^*x∗,但是需要经过可行域的内部。
【例2】最小化成本 c⋅x=3x1+x2+9x3+x4\boldsymbol c\cdot\boldsymbol x=3x_1+x_2+9x_3+x_4c⋅x=3x1+x2+9x3+x4. 约束条件是 x≥0\boldsymbol x\ge\boldsymbol 0x≥0 和下面两个方程 Ax=bA\boldsymbol x=\boldsymbol bAx=b:{x1+2x3+x4=4x2+x3−x4=2m=2 个方程,n=4 个未知数\left\{\begin{array}{r}x_1+2x_3+x_4=4\\x_2+x_3-x_4=2\\\end{array}\kern 10ptm=2\,个方程,n=4\,个未知数\right.{x1+2x3+x4=4x2+x3−x4=2m=2个方程,n=4个未知数起始顶点是 x=(4,2,0,0)\boldsymbol x=(4,2,0,0)x=(4,2,0,0),对应的成本为 c⋅x=14\boldsymbol c\cdot\boldsymbol x=14c⋅x=14. x\boldsymbol xx 有 m=2m=2m=2 个非零分量和 n−m=2n-m=2n−m=2 个零分量,该顶点零分量是 x3x_3x3 和 x4x_4x4. 现在需要判断要换入的分量是 x3x_3x3 还是 x4x_4x4(变为非零分量),我们先将这两个分量分别增加一个单位:如果 x3=1 而 x4=0,则 x=(2,1,1,0) 对应的成本为 16.如果 x4=1 而 x3=0,则 x=(3,3,0,1) 对应的成本为1 3.如果\,x_3=1\,而\,x_4=0,则\,\boldsymbol x=(2,1,1,0)\,对应的成本为\,16.\\\color{blue}如果\,x_4=1\,而\,x_3=0,则\,\boldsymbol x=(3,3,0,1)\,对应的成本为1\,3.如果x3=1而x4=0,则x=(2,1,1,0)对应的成本为16.如果x4=1而x3=0,则x=(3,3,0,1)对应的成本为13.将上述两个成本与成本 141414 进行比较,换入 x3x_3x3 的成本改变量为 r=2r=2r=2,此时为正值,是无效换入。换入 x4x_4x4 的成本改变量为 r=−1r=-1r=−1,此时是负值是有效换入。所以,我们换入的分量是 x4x_4x4.
那么 x4x_4x4 可以换入多少呢?一单位的 x4x_4x4 会使得 x1x_1x1 从 444 降到 333,四单位就会使得 x1x_1x1 从 444 降到零(同时 x2x_2x2 会增加到 666),因此换出的分量是 x1x_1x1,新的顶点为 x=(0,6,0,4)\boldsymbol x=(0,6,0,4)x=(0,6,0,4),对应的成本变为了 x⋅c=10\boldsymbol x\cdot\boldsymbol c=10x⋅c=10. 这个就是最优的 x∗\boldsymbol x^*x∗,但是为了证明我们还需要尝试进一步的单纯性步骤,此时我们从顶点 (0,6,0,4)(0,6,0,4)(0,6,0,4) 出发,假设换入 x1x_1x1 和 x3x_3x3:从顶点 (0,6,0,4) 出发如果 x1=1 而 x3=0,则 x=(1,5,0,3) 对应的成本为 11.如果 x3=1 而 x1=0,则 x=(0,3,1,2) 对应的成本为 14.\pmb{从顶点\,(0,6,0,4)\,出发}\kern 15pt\begin{array}{l}如果\,x_1=1\,而\,x_3=0,则\,\boldsymbol x=(1,5,0,3)\,对应的成本为\,11.\\如果\,x_3=1\,而\,x_1=0,则\,\boldsymbol x=(0,3,1,2)\,对应的成本为\,14.\end{array}从顶点(0,6,0,4)出发如果x1=1而x3=0,则x=(1,5,0,3)对应的成本为11.如果x3=1而x1=0,则x=(0,3,1,2)对应的成本为14.这两个成本都比 101010 要高,它们的 rrr 都是正值 —— 此时不需要移动。因此,当前的顶点 (0,6,0,4)(0,6,0,4)(0,6,0,4) 就是最优解 x∗\boldsymbol x^*x∗.
这些计算可以程序化,每个单纯性步骤需要求解三个有相同系数矩阵 BBB 的线性方程组,矩阵 BBB 是由矩阵 AAA 的 mmm 个基本列向量组成的 m×mm\times mm×m 的矩阵。当一个列换入,而旧的列换出时,有快速更新 B−1B^{-1}B−1 的方法。这就是大多数代码处理单纯性法的方式。
最优解 x∗\boldsymbol x^*x∗ 中有 mmm 个非零分量,最优解 y∗\boldsymbol y^*y∗ 是 mmm 个方程 ATy∗=cA^T\boldsymbol y^*=\boldsymbol cATy∗=c 的解向量,然后得到的最优关系 xTs=0\boldsymbol x^T\boldsymbol s=0xTs=0 就是对偶性:要么 xj∗=0x^*_j=0xj∗=0,要么 s∗=c−ATy∗\boldsymbol s^*=\boldsymbol c-A^T\boldsymbol y^*s∗=c−ATy∗ 中的 “松弛量(slack)” sj∗=0s^*_j=0sj∗=0.
当 x∗=(0,4,0)\boldsymbol x^*=(0,4,0)x∗=(0,4,0) 是最优顶点 Q\pmb QQ 时,作弊者设定的价格为 y∗=3y^*=3y∗=3.
四、内点法
单纯形法是沿着可行域的边移动,最终到达最优顶点 x∗\boldsymbol x^*x∗. 内点法(Interior point methods)是在可行域内部移动(其中 x>0\boldsymbol x>\boldsymbol 0x>0),这个方法是期望能直接找到最优解 x∗\boldsymbol x^*x∗,并且效果很好。
固定在可行域内部搜索的一种方法是在边界处设置障碍,我们添加一个额外的对数项成本,因此当任何的 xjx_jxj 趋近于零时,这个成本都会趋于无穷大,最优解向量满足 x>0\boldsymbol x>\boldsymbol 0x>0,参数 θ\thetaθ 的值较小,并且会趋于零。
障碍问题 约束条件为Ax=b 时,最小化\kern 20pt\color{blue}约束条件为\kern 5ptA\boldsymbol x=\boldsymbol b\,时,最小化约束条件为Ax=b时,最小化cTx−θ(logx1+logx2+⋯+logxn)(10.4.2){\color{blue}\boldsymbol c^T\boldsymbol x-\theta(\log x_1+\log x_2+\cdots+\log x_n)}\kern 30pt(10.4.2)cTx−θ(logx1+logx2+⋯+logxn)(10.4.2)
这个成本是非线性的(线性规划中的不等式已经体现了非线性),由于当 xj=0x_j=0xj=0 时,logxj\log x_jlogxj 为无穷大,所以不再需要约束条件 xj≥0x_j\ge0xj≥0.
对于每个 θ\thetaθ,障碍问题都是原问题的一个近似问题,我们对这 mmm 个约束方程 Ax=bA\boldsymbol x=\boldsymbol bAx=b 引入拉格朗日乘子(Lagrange multipliers)y1,y2,⋯ ,ymy_1,y_2,\cdots,y_my1,y2,⋯,ym,这是处理约束条件一个很好的方法:y 来自拉格朗日乘子L(x,y,θ)=cTx−θ(∑i=1nlogxi)−yT(Ax−b)(10.4.3)\pmb{\boldsymbol y\,来自拉格朗日乘子}\kern 15ptL(x,y,\theta)=\boldsymbol c^T\boldsymbol x-\theta\Big(\sum_{i=1}^{n}\log x_i\Big)-\boldsymbol y^T(A\boldsymbol x-\boldsymbol b)\kern 15pt(10.4.3)y来自拉格朗日乘子L(x,y,θ)=cTx−θ(i=1∑nlogxi)−yT(Ax−b)(10.4.3)由 ∂L∂y=0\dfrac{\partial L}{\partial y}=0∂y∂L=0 我们可以反过来得到 Ax=bA\boldsymbol x=\boldsymbol bAx=b. 偏导数 ∂L∂xj\dfrac{\partial L}{\partial x_j}∂xj∂L 有重大的意义!
障碍问题中的最优解 ∂L∂xj=cj−θxj−(ATy)j=0\kern 10pt\color{blue}\dfrac{\partial L}{\partial x_j}=c_j-\dfrac{\theta}{x_j}-(A^T\boldsymbol y)_j=0\kern 10pt∂xj∂L=cj−xjθ−(ATy)j=0 即xjsj=θ(10.4.4)\kern 10pt{\color{blue}\boldsymbol x_j\boldsymbol s_j=\theta}\kern 15pt(10.4.4)xjsj=θ(10.4.4)
原问题中有 xjsj=0x_js_j=0xjsj=0,而障碍问题是 xjsj=θx_js_j=\thetaxjsj=θ,最优解 x∗(θ)\boldsymbol x^*(\theta)x∗(θ) 位于通往 x∗(0)\boldsymbol x^*(0)x∗(0) 的中心路径(central path) 上。这 nnn 个最优方程 xjsj=θx_js_j=\thetaxjsj=θ 是非线性的,我们可以用牛顿迭代法来求解。
当前的障碍问题中的 x,y,s\boldsymbol x,\boldsymbol y,\boldsymbol sx,y,s 满足 Ax=b,x≥0A\boldsymbol x=\boldsymbol b,\boldsymbol x\ge\boldsymbol 0Ax=b,x≥0 和 ATy+s=cA^T\boldsymbol y+\boldsymbol s=\boldsymbol cATy+s=c,但是并不满足 xjsj=θx_js_j=\thetaxjsj=θ,因为现在是在可行域内,还不是最优解。牛顿迭代法选取步长 Δx,Δy,Δs\Delta \boldsymbol x,\Delta \boldsymbol y,\Delta\boldsymbol sΔx,Δy,Δs,并且忽略掉 (x+Δx)(s+Δs)=θ(x+\Delta x)(s+\Delta s)=\theta(x+Δx)(s+Δs)=θ 中的二次项 ΔxΔs\Delta \boldsymbol x\Delta \boldsymbol sΔxΔs,然后使用下面的线性方程组来修正 x,y,s\boldsymbol x,\boldsymbol y,\boldsymbol sx,y,s:牛顿迭代法AΔx=0ATΔy+Δs=0sjΔxj+xjΔsj=θ−xjsj(10.4.5)\pmb{牛顿迭代法}\kern 25pt\begin{array}{r}A\Delta \boldsymbol x=\boldsymbol 0\\A^T\Delta \boldsymbol y+\Delta \boldsymbol s=\boldsymbol 0\\s_j\Delta x_j+x_j\Delta s_j=\theta-x_js_j\end{array}\kern 25pt(10.4.5)牛顿迭代法AΔx=0ATΔy+Δs=0sjΔxj+xjΔsj=θ−xjsj(10.4.5)牛顿迭代法对每个 θ\thetaθ 都能达到二阶收敛,然后令 θ\thetaθ 趋近于零。对偶间隙(duality gap)xTs\boldsymbol x^T\boldsymbol sxTs 通常在迭代 202020 至 606060 步后会小于 10−810^{-8}10−8.
内点法在商业软件中几乎是 “按原样” 使用,它用于解决一大类线性和非线性的问题。