单纯形算法是求解线性规划问题最经典的方法,在许多介绍该算法的文章中会使用单纯形表(Tableau)辅助计算,而对Tableau进行的操作本质上都是在对松弛化的线性规划模型进行矩阵运算,从几何表现上看,就是在线性规划问题的定义域上的顶点中迭代搜索,寻找使得目标函数最优的那个顶点。使用Tableau计算虽然很高效,不过对于理解算法原理帮助不大;单纯形算法的原理是基于线性代数的,如果要彻底理解,还是需要很多基础的矩阵知识的。这篇文章里我只是记录和单纯形算法相关的线性代数知识,加深对该算法中一些术语的记忆和理解;算法里更加具体的线代原理则跳过,那已经超过了我的认知水平,在后续文章中会记录更容易理解的算法计算过程。
线性规划松弛形式
在应用算法前,必须对原始的线性规划模型进行预处理,先转换成标准线性规划模型,再转换成松弛线性规划模型。标准线性规划模型的形式:
maxZ=cTxs.t.Ax≤bx≥0 \begin{aligned} max\quad& Z=\boldsymbol{c}^T\boldsymbol{x}\\ s.t.\quad& \boldsymbol{A}\boldsymbol{x}\leq \boldsymbol{b} \\ & \boldsymbol{x} \geq0 \\ \end{aligned} maxs.t.Z=cTxAx≤bx≥0
具体形式:
maxZ=c1x1+c2x2+...+cnxns.t.[a11a12...a1na21a22...a2n....am1am2...amn][x1x2.xn]≤[b1b2.bm]x≥0 \begin{aligned} max\quad& Z=c_1x_1+c_2x_2+...+c_nx_n\\ s.t.\quad& \begin{bmatrix} a_{11} & a_{12} & ... & a_{1n} \\ a_{21} & a_{22} & ... & a_{2n} \\ . & . & . & . \\ a_{m1} & a_{m2} & ... & a_{mn} \\ \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ . \\ x_n\\ \end{bmatrix}\leq \begin{bmatrix} b_1 \\ b_2 \\ . \\ b_m\\ \end{bmatrix}\\ & \boldsymbol{x} \geq0 \\ \end{aligned} maxs.t.Z=c1x1+c2x2+...+cnxn⎣⎢⎢⎡a11a21.am1a12a22.am2..........a1na2n.amn⎦⎥⎥⎤⎣⎢⎢⎡x1x2.xn⎦⎥⎥⎤≤⎣⎢⎢⎡b1b2.bm⎦⎥⎥⎤x≥0
如果将一个原始的线性规划模型标准化? 如果目标是最小化,则乘上-1变成最大化目标(当然标准模型的目标函数也可以是最小化,两者本质是相同的,只不过算法的某些细节上互为相反);如果约束是≥\geq≥,两边同乘-1;如果某个变量xi<0x_i<0xi<0,那么定义xi=x′−x′′x_i=x'-x''xi=x′−x′′,并且x′≥0,x′′≥0x'\geq0,x''\geq0x′≥0,x′′≥0,将原变量替换成x′x'x′和x′′x''x′′
然后将标准形式转换成松弛形式,其实就是给每个约束不等式上引入松弛变量sss,将所有的约束不等式转换成等式:
maxZ=cTx′s.t.A′x′=bx′≥0 \begin{aligned} max\quad& Z=\boldsymbol{c}^T\boldsymbol{x'}\\ s.t.\quad& \boldsymbol{A'}\boldsymbol{x'}= \boldsymbol{b} \\ & \boldsymbol{x'} \geq0 \\ \end{aligned} maxs.t.Z=cTx′A′x′=bx′≥0
即:
maxZ=c1x1+c2x2+...+cnxns.t.a11x1+a12x2+...+a1nxn+s1=b1a21x1+a22x2+...+a2nxn+s2=b2...am1x1+am2x2+...+amnxn+sm=bmx1,x2,...,xn,s1,...,sm≥0 \begin{aligned} max\quad& Z=c_1x_1+c_2x_2+...+c_nx_n\\ s.t.\quad& a_{11}x_{1}+a_{12}x_{2}+...+a_{1n}x_{n}+s_1=b_1 \\ & a_{21}x_{1}+a_{22}x_{2}+...+a_{2n}x_{n}+s_2=b_2 \\ & {...} \\ & a_{m1}x_{1}+a_{m2}x_{2}+...+a_{mn}x_{n}+s_m=b_m \\ & x_1,x_2,...,x_n,s_1,...,s_m \geq 0 \end{aligned} maxs.t.Z=c1x1+c2x2+...+cnxna11x1+a12x2+...+a1nxn+s1=b1a