HomeBlogTopicsPublish
  • rss

  • contact

© 2025 MIT Licensed

Topics→Machine Learning→Naive Solve

Machine Learning

Fundamentals
Decision TreeBackpropagationLinear 1Linear 2Linear 3Linear DualLinear IntroML Numerical MethodsNaive SolveLagrangian Conditions under Equality ConstraintsLagrangian Conditions under Inequality ConstraintsSupport Vector Machine 1Support Vector Machine 2Support Vector Machine 3Convex
Deep Learning Acceleration
Paper DartsPaper MobileNetsPaper ShuffleNetPaper HashingTricksPaper ShuffleNetV2Neural Architecture Search MilestonePyTorch Training Acceleration
Computer Vision
Paper RobotPaper InceptionV4Dataset Cityscapes
Reinforcement Learning
Paper Deep Q-Network

Naive Solve

September 29, 2017

by Frank

1947 年,丹齐格提出了一种求解线性规划问题的方法,即今天所称的单纯形法,这是一种简洁且高效的算法,被誉为 20 世纪对科学发展和工程实践影响最大的十大算法之一。

1947 年,丹齐格提出了一种求解线性规划问题的方法,即今天所称的单纯形法,这是一种简洁且高效的算法,被誉为 20 世纪对科学发展和工程实践影响最大的十大算法之一。 上文提到线性规划问题的最优解一定是基本可行解,单纯形法的思路即在不同的基向量下求不同的基本可行解,然后找到最优的解。从几何的角度来看,也就是从一个极点转换到另一个极点,直至找到最优极点的过程。 那么这样的话可以把算法分成三个子问题,1.如何从一个基本可行解转换到另一个基本可行解。2.如何确定应该转移到哪个极点。3.什么时候停止转移操作,即如何判断当前基本可行解是否为最优解。

极点的转移

线性规划的标准型为

minimizecTxsubject toAx=bx≥0\begin{align*} minimize\quad c^{T}x\\ subject\ to\quad Ax=b\\ x\ge0 \end{align*}minimizecTxsubject toAx=bx≥0​

考虑到方程Ax=bAx=bAx=b,展开成如下规范型的方程组

x1+y1 m+1xm+1+...+y1nxn=y10x2+y2 m+1xm+1+...+y2nxn=y20⋮xm+ym m+1xm+1+...+ymnxn=ym0\begin{align*} x_{1}+y_{1\ m+1}x_{m+1}+...+y_{1n}x_{n}=y_{10}\\ x_{2}+y_{2\ m+1}x_{m+1}+...+y_{2n}x_{n}=y_{20}\\ \vdots\\ x_{m}+y_{m\ m+1}x_{m+1}+...+y_{mn}x_{n}=y_{m0} \end{align*}x1​+y1 m+1​xm+1​+...+y1n​xn​=y10​x2​+y2 m+1​xm+1​+...+y2n​xn​=y20​⋮xm​+ym m+1​xm+1​+...+ymn​xn​=ym0​​

可以将该方程组转换为[Im,Ym,n−m]x=y0[I_{m},Y_{m,n-m}]x=y_{0}[Im​,Ym,n−m​]x=y0​,这种形式的方程组Ax=bAx=bAx=b称为典式,方程组的典式与原方程组的解是相同的,在典式表达式中,与基列向量对应的变量为基变量,其他的变量为非基变量,即在方程[Im,Ym,n−m]x=y0[I_{m},Y_{m,n-m}]x=y_{0}[Im​,Ym,n−m​]x=y0​中,x1,x2...,xmx_{1},x_{2}...,x_{m}x1​,x2​...,xm​为基变量,其他的变量是非基变量。考虑增广矩阵规范型[Im,Ym,n−m,y0][I_{m},Y_{m,n-m},y_{0}][Im​,Ym,n−m​,y0​],其最后一列的各元素是向量bbb关于基{a1,...,ama_{1},...,a_{m}a1​,...,am​}的坐标。

现在考虑增广矩阵的更新,即用某个非基变量替换某个基变量,求新的基变量对应的典式表达式,比如用非基变量aq,m<q≤na_{q},m<q\le naq​,m<q≤n替换基变量ap,1≤p≤ma_{p},1\le p\le map​,1≤p≤m。在原矩阵上,aqa_{q}aq​可以表示为

aq=∑i=1myiqai=∑i=1i≠pmyiqai+ypqapa_{q}=\sum_{i=1}^{m}y_{iq}a_{i}=\sum_{i=1\\i\ne p}^{m}y_{iq}a_{i}+y_{pq}a_{p}aq​=i=1∑m​yiq​ai​=i=1i=p∑m​yiq​ai​+ypq​ap​

注意仅当ypq≠0y_{pq}\ne 0ypq​=0时,向量组{a1,...,ap−1,aq,ap+1,...,ama_{1},...,a_{p-1},a_{q},a_{p+1},...,a_{m}a1​,...,ap−1​,aq​,ap+1​,...,am​}才是线性无关的,才能形成一组基。 可以由上述方程求解出

ap=1ypqaq−∑i=1i≠pmyiqypqaia_{p}=\frac{1}{y_{pq}}a_{q}-\sum_{i=1\\i\ne p}^{m}\frac{y_{iq}}{y_{pq}}a_{i}ap​=ypq​1​aq​−i=1i=p∑m​ypq​yiq​​ai​

利用原来的增广矩阵,可以将任意向量aj(m<j≤n)a_{j}(m<j\le n)aj​(m<j≤n)表示为

aj=y1ja1+y2ja2+...+ymjama_{j}=y_{1j}a_{1}+y_{2j}a_{2}+...+y_{mj}a_{m}aj​=y1j​a1​+y2j​a2​+...+ymj​am​

将apa_{p}ap​的表达式代入可以得到

aj=∑i=1i≠pm(yij−ypjypqyiq)ai+ypjypqaqa_{j}=\sum_{i=1\\i\ne p}^{m}(y_{ij}-\frac {y_{pj}}{y_{pq}}y_{iq})a_{i}+\frac{y_{pj}}{y_{pq}}a_{q}aj​=i=1i=p∑m​(yij​−ypq​ypj​​yiq​)ai​+ypq​ypj​​aq​

利用yij′y_{ij}^{'}yij′​表示新的增广矩阵中的元素,由上式可得

yij′=yij−ypjypqyiq,i≠pypj′=ypjypq\begin{align*} y_{ij}^{'}=y_{ij}-\frac{y_{pj}}{y_{pq}}y_{iq},i\ne p\\ y_{pj}^{'}=\frac{y_{pj}}{y_{pq}} \end{align*}yij′​=yij​−ypq​ypj​​yiq​,i=pypj′​=ypq​ypj​​​

利用以上公式对矩阵的变换称为关于元素(p,q)(p,q)(p,q)的枢轴变换,以上即为从一个极点转换到另一个极点的公式。

确定转移的极点

确定转移的极点即将向量组转换到另一组坐标系上,详细来说就是将向量组中 m 个向量之一取出,从另外 n-m 个向量中选择一个向量加入到基向量组形成新的基。我们记为将apa_{p}ap​向量取出(出基),将aqa_{q}aq​向量加入(入基),又可以将这个问题分为两部分,即分别确定ppp和qqq。 对于qqq的确定,先看枢轴变换的公式如下

yij′=yij−ypjypqyiq,i≠pypj′=ypjypq\begin{align*} y_{ij}^{'}=y_{ij}-\frac{y_{pj}}{y_{pq}}y_{iq},i\ne p\\ y_{pj}^{'}=\frac{y_{pj}}{y_{pq}} \end{align*}yij′​=yij​−ypq​ypj​​yiq​,i=pypj′​=ypq​ypj​​​

再看另一种方法将一个非基变量aqa_{q}aq​变成基向量 利用当前的基向量来表示向量aqa_{q}aq​

aq=y1qa1+y2qa2+...+ymqama_{q}=y_{1q}a_{1}+y_{2q}a_{2}+...+y_{mq}a_{m}aq​=y1q​a1​+y2q​a2​+...+ymq​am​

上式两边同时乘上ϵ>0\epsilon>0ϵ>0可以得到

ϵaq=ϵy1qa1+ϵy2qa2+...+ϵymqam\epsilon a_{q}=\epsilon y_{1q}a_{1}+\epsilon y_{2q}a_{2}+...+\epsilon y_{mq}a_{m}ϵaq​=ϵy1q​a1​+ϵy2q​a2​+...+ϵymq​am​

将基本解x=[y10,...,ym0,0,...,0]Tx=[y_{10},...,y_{m0},0,...,0]^Tx=[y10​,...,ym0​,0,...,0]T代入方程Ax=bAx=bAx=b可以得到

y10a1+...+ym0am=by_{10}a_{1}+...+y_{m0}a_{m}=by10​a1​+...+ym0​am​=b

联立上面两个等式,可以得到

(y10−ϵy1q)a1+(y20−ϵy2q)a2+...+(ym0−ϵymq)am+ϵaq=b(y_{10}-\epsilon y_{1q})a_{1}+(y_{20}-\epsilon y_{2q})a_{2}+...+(y_{m0}-\epsilon y_{mq})a_{m}+\epsilon a_{q}=b(y10​−ϵy1q​)a1​+(y20​−ϵy2q​)a2​+...+(ym0​−ϵymq​)am​+ϵaq​=b

即向量[y10−ϵy1q,...,ym0−ϵymq,0,...,ϵ,...,0][y_{10}-\epsilon y_{1q},...,y_{m0}-\epsilon y_{mq},0,...,\epsilon,...,0][y10​−ϵy1q​,...,ym0​−ϵymq​,0,...,ϵ,...,0]是方程Ax=bAx=bAx=b的一个解,当ϵ\epsilonϵ不断增大,向量的前 m 个元素中首次出现 0,此时可以得到一个基本可行解,变换过后的基本可行解对应的目标函数值为

z=c1(y10−y1qϵ)+...+cm(ym0−ymqϵ)+cqϵ=z0+[cq−(c1y1q+...+cmymq)]ϵ\begin{align*} z=c_{1}(y_{10}-y_{1q}\epsilon)+...+c_{m}(y_{m0}-y_{mq}\epsilon)+c_{q}\epsilon\\ =z_{0}+[c_{q}-(c_{1}y_{1q}+...+c_{m}y_{mq})]\epsilon \end{align*}z=c1​(y10​−y1q​ϵ)+...+cm​(ym0​−ymq​ϵ)+cq​ϵ=z0​+[cq​−(c1​y1q​+...+cm​ymq​)]ϵ​

其中,z0=c1y10+...+cmym0z_{0}=c_{1}y_{10}+...+c_{m}y_{m0}z0​=c1​y10​+...+cm​ym0​,令zq=c1y1q+...+cmymqz_{q}=c_{1}y_{1q}+...+c_{m}y_{mq}zq​=c1​y1q​+...+cm​ymq​,可以得到z=z0+(cq−zq)ϵz=z_{0}+(c_{q}-z_{q})\epsilonz=z0​+(cq​−zq​)ϵ,当z−z0=(cq−zq)ϵ<0z-z_{0}=(c_{q}-z_{q})\epsilon<0z−z0​=(cq​−zq​)ϵ<0时,说明基本可行解对应的目标函数值变小了,即认为这个向量加入基向量组后是有益的。

那么可以对每一个q,m<q≤nq,m<q\le nq,m<q≤n计算cq−zqc_{q}-z_{q}cq​−zq​,令ri=0(i=1,...,m),ri=ci−zi(i=m+1,...,n)r_{i}=0(i=1,...,m),r_{i}=c_{i}-z_{i}(i=m+1,...,n)ri​=0(i=1,...,m),ri​=ci​−zi​(i=m+1,...,n),称rir_{i}ri​为第iii个简化价值系数,也称为检验数。可以通过证明得到,当且仅当相应的检验数都是非负的时候,该基本可行解是最优解。

即可以通过计算检验数的方法来判断当前解是否为最优解,当检验数中有负数的时候,则说明当前解不是最优解,可以通过将第qqq个向量加入基向量组的方法减小目标函数值,如果有多个负数,则选择检验数最小的第qqq个向量加入基向量组。

上面确定了qqq的选择方法,下面来介绍一下如何确定出基向量apa_{p}ap​,由上文可知,对于向量[y10−ϵy1q,...,ym0−ϵymq,0,...,ϵ,...,0][y_{10}-\epsilon y_{1q},...,y_{m0}-\epsilon y_{mq},0,...,\epsilon,...,0][y10​−ϵy1q​,...,ym0​−ϵymq​,0,...,ϵ,...,0],当ϵ\epsilonϵ不断增大,在前mmm个元素中会有第iii个元素yi0−ϵyiqy_{i0}-\epsilon y_{iq}yi0​−ϵyiq​最先等于 0,那么我们则选择aia_{i}ai​作为出基向量apa_{p}ap​,即p=arg mini{yi0/yiq:yiq>0}p=arg\ min_{i}\{y_{i0}/y_{iq}:y_{iq}>0\}p=arg mini​{yi0​/yiq​:yiq​>0},需要注意的是,如果不存在yiq>0y_{iq}>0yiq​>0,则问题有无界解,停止运算,另外如果同时出现多个 0 元素,那么得到退化的基本可行解,此时选择最小的ppp值。

确定停止条件

上文介绍了如何选择转移的极点数,在确定qqq的时候,计算检验数,若所有的检验数都是非负,那么此时的基本可行解是最优解,停止计算。另外在确定ppp的时候,若随着ϵ\epsilonϵ不断增大,向量的前 m 个元素也随之增大,即对于0<i≤m,yiq<00<i\le m,y_{iq}<00<i≤m,yiq​<0,那么该问题有无界解,也停止计算。

单纯形算法

上文介绍了单纯形算法几个子问题的处理方法,下面来总结一下单纯形算法 1. 根据初始基本可行解构造增广矩阵规范型; 2. 计算非基变量的检验数; 3. 如果对于所有jjj都有rj≤0r_{j}\le 0rj​≤0,则停止计算,当前基本可行解是最优解,否则进入下一步 4. 在小于 0 的检验数中选择检验数最小的qqq 5. 如果不存在yiq>0y_{iq}>0yiq​>0,则停止计算,问题有无界解;否则计算p=arg mini{yi0/yiq:yiq>0}p=arg\ min_{i}\{y_{i0}/y_{iq}:y_{iq>0}\}p=arg mini​{yi0​/yiq​:yiq>0​},如果得到多个满足条件的下标iii,令ppp为最小的下标值。 6. 以元素(p,q)(p,q)(p,q)作为枢轴元素,进行枢轴变换,更新增广矩阵规范型。 7. 转到步骤 2

另外对于单纯形算法,还有其矩阵表达式,对于寻找初始基本可行解所遇到的困难,又提出了两阶段单纯形法,为了减小计算量,又提出了修正单纯形法等等。

←Previous: ML Numerical MethodsNext: Lagrangian Conditions under Equality Constraints→

Comments