matlab实现单纯型法解线性规划_数值优化|笔记整理(A)——线性规划中的单纯形法与内点法…

  • Post author:
  • Post category:其他


433e6abd7f0d505ae1f9872c694a26fb.png

上一节笔记:

学弱猹:数值优化|笔记整理(9)——非线性规划的极值性质,KKT条件​zhuanlan.zhihu.com

cb2708dc8e57cfdea0ac62cc4d50ce16.png

————————————————————————————————————

大家好!非常熟悉我的写作风格的同学知道,标题的A就是10的意思。

在这一节我们会给大家介绍带约束优化中更为具体的

线性规划

的内容。相信大家在运筹学中会对线性规划更加熟悉,比方说单纯形法就是运筹学一开始就会讲授的内容。那么在优化中,我们也会关注它们,通过介绍他们来了解优化在运筹中的应用,也能够让大家更好的了解为什么“运筹优化”一般都放在一起来说。

那么我们开始吧。


目录

  • 引入:线性规划的含义及标准形式

    • 几何建构
  • 单纯形法
  • 内点法

    • 算法实现
    • 实际的算法实现


Source

  • D. G. Luenberger and Y. Ye.

    Linear and nonlinear programming
  • J. Nocedal and S. J. Wright,

    Numerical Optimization


引入:线性规划的含义及标准形式

相信大家在高中数学的必修五里已经学过一部分的线性规划的知识。这一节我们关注的问题基本上就是下面这个形式

其中


,也就是说,我们的目标函数和约束函数


都是线性的

和上一节的非线性规划一样,很多人会有疑问这个约束条件会不会太强,因为毕竟不是所有的问题都是仅有等式约束的。但是实际上不会,因为我们可以通过

松弛变量

(slack variable)和

拆分正负部分

的方式,使得绝大部分问题都可以使用我们这个框架。具体来说,假如我们的问题一开始是

添加松弛变量


,可以得到

再拆分正负号,具体来说就是设



的正数部分,而


的负数部分,满足

(比方说

,那么

)。那么这样的话,问题就会变成这样的形式

换句话说,我们实际上只需要把我们这个新构造的向量


重新换元为

,就可以完成我们的任务,也就是说所有满足一开始那种线性形式的问题,都可以使用我们的框架来解决。


几何建构

因为线性规划是一个具体的问题,这也为它带来了一定的几何意义。我们先给出它约束的一个几何定义。

Definition 1: Hyperplane

定义


是一个超平面。其中

,

比方说


就是一个与

垂直的所有向量的集合。如果只改变

,那么形成的各个超平面相互平行。这也不难理解,因为比方说如果

,那就是我们高中就已经学过的直线的斜截式方程。而对应到

,那就会变成我们解析几何中学过的平面方程,再往上因为人脑无法再直观想象出来这种结构了,就给了它一个超平面的名字,但是我们如果把它投影到一个低维的空间上(比方说三维空间),其实依然是满足平面的结构的。

定义完超平面自然会有超平面衍生出来的一些几何形状。

Definition 2: Half Space

定义


是由

定义出来的半平面。其中

一定沿着可行域的外方向。

这里我们可以拿一个


的直线来举例子。

e79aa10260df136037c81610b53a27fb.png

这两个性质为我们后面分析优化问题提供了很多理解上的方便。

接下来我们会给出一个与凸集有关的概念。

Definition 3: Extreme Point


为一个凸集,且

,那么如果不存在

,使得存在

满足

,那么称

是一个极值点。

这里的翻译上要注意,和我们之前说的“极小值”,”极大值“

并不是一个意思

,根据单词extreme的含义,可以看出它比较像“边界上的点”的意思。

对于下面的这张图,我们认为它们的约束都是实心的。我们可以看出,左边这个椭圆的三个点都是极值点,但是对于右边来说,只有点


是极值点,剩下的两个都不是。

9b6057a9f5aecab5034b5f9ffc965354.png

定义超平面的原因在于,我们的最终的约束


,是一个线性方程组,也就是说可以视为是


一系列超平面的交集

。而这样的几何图形也是有自己的名字的。

Definition 4: Polytope, Polyhedron

定义有限个闭半空间的交为凸多胞体。定义非空有界的凸多胞体为凸多面体。

这里要注意的是,polytope和polyhedron其实都可以被翻译为多面体,在这里为了区分我们将polytope翻译成了多胞体,polyhedron翻译成了多面体。虽然网上说多胞体一般是用来形容


维空间下的图形,而多面体一般只考虑三维情况,但在这里很明显,至少从定义上来说二者并没有这样的区分。因此我们这里多解释一些,并且在之后我们还是会保留这两个定义的原版英文。

接下来我们给出一个与单纯形法紧密相关的性质。

Proposition 1:


是一个凸的polyhedron,那么

会在极值点上取到极小值。

这个性质我们不详细证明,大家可以利用凸的定义观察到,如果不是极值点就一定可以找到更小的值。

好的,有了这些铺垫,我们就可以慢慢的给出单纯形法的做法了。


单纯形法

我们要注意的是,我们的标准形式就蕴含着说,我们的约束就是

多个超平面的交

,因为


。也可以看出我们的集合

也是一个凸集,而单纯形法的重要的支撑在于下面这个定理。

Theorem 1:


是优化问题的解当且仅当

是极值点。

这个证明还是有点复杂的,可以参考D. G. Luenberger and Y. Ye.的

Linear and Nonlinear Programming

的P23。而这个定理就是想告诉我们,我们只需要使得点位于极值点,就可以找到极小值,单纯形法的核心,就是

找遍所有的极值点

但是如何做到这样的事情呢?还是一样,

从源头找思路

。在正常的情况下,我们的约束都是不等式约束,是

添加了松弛变量

才使得我们可以化简为标准的形式。所以为什么叫松弛变量呢?不就是因为它很多时候起不到作用吗?那么什么叫起不到作用呢?简单来说,就是

对应的解向量的分量为0

。为了理解这个含义,我们的做法是对不同的


的列做一个线性变换,使得我们可以找出这个矩阵对应的线性变换中,冗余的部分。也就是说我们考虑设一个正交矩阵

,使得

其中


。并且

是满秩的(否则的话就没解了)。这样做之后,根据正交矩阵的性质我们有

,所以设

就可以得到


,那么会有

这里我们有一个操作,就是人工设置我们的


。为什么可以这么做?如果只是图一个简单,那么只需要理解我们


人工的认为



的部分是松弛变量即可



。但是严谨的来说,首先,如果


,那么会出现什么?不妨假设某一个分量是非零的,那么注意到,我们一定可以说明它不是极点,因为假如说我们可以变换一下

,得到一个新的点

,就可以得到

这里


不需要事先计算出来,就假设

是已知的

简单变一下我们就可以得到

这样的话,只需要设



,就可以得到两个点,并且满足凸集的性质。这里能够成功的原因就是我们的假设

,因为当

的时候,是不能够保证我们的

是不同的。

既然有了推论,我们的


也就自然可以算出来,取个逆就可以了。

到此为止,我们可以发现,如果我们达到了一个极值点,那么必然有


。虽然这个是经过一组线性变换之后的新的

,但是这个变换,无非就是挑出了一组方程组中的基而已。换句话说,我们去掉这一组基的一个分量,换成之前不属于基的某一个分量,依然可以组成一组基。所以我们这里的松弛变量是


可以换的

,而这个更换就会得到不同的极值点。

单纯形法就是这么一个思路,不停的枚举可能的极值点,直到我们的目标函数值无法下降为止。但是如何判断呢?自然不可能真的是暴力枚举。现在设想一下两个不同的方程组

并且我们认为一开始有


,但是经过了一组“换基”,使得

(换基的含义我们后面会有例子可以进行更加形象的解释,在这里你可以理解为,

这两个分别挑出了一列交换了一下),化简就可以得到

那么对应到我们的目标函数呢?其实就是

这里


,我们可以看到这个值是很重要的,因为如果

,那么这个变换就是无效的,因为无法使得函数下降。所以换句话说,如果我们无论怎么换基,都有

,就说明找到极小值了,算法也就应该结束了。

到此,我们可以总结一下我们的算法核心的步骤了

找到


中,

的分量为负且绝对值最大的那个对应的指标。

设这个指标为


,并设置

,也就是说考虑将这个分量由

改为


满足

中最小的分量为0



中分量被变为0的那个指标

交换这两个指标,也就是交换


列得到新的

,进行下一轮操作。

那么我们来举个例子吧,演示几步过程就自然会对这个算法理解的更加透彻了。

Example 1:

考虑问题


,约束条件为

按照我们这里的想法,我们自然的是希望把我们的不等式组通过矩阵的方式写出来,在这里其实就是写成

那么我们可以很容易的挑出我们


矩阵中的一组基,这里就是系数矩阵的第3,4列,所以我们可以写出

,且

,所以可以得到我们的

根据我们的算法,既然我们设置了


为基,潜在意思就是

,所以我们这里的候选的

,因此对应的可以得到

注意到我们的


,因此结合我们的

,我们可以得到

,也就是说第一个指标是负的指标中,绝对值最大的那个。因此我们考虑要换基,把基中的第一个分量给换进去,因为如果它作为基,就可以使得函数值进一步下降(运筹学中有一个说法叫做


入基

)。

要入基的话,就是设


,所以对应的要计算一个合适的

。这里我们可以得到

,也就是说这里的

,因为在这个情况下,可以满足

,且存在一个分量到达了0的边界。换句话说,这个时候分量为0的部分就是应该被视为“松弛变量”的部分,应该把基的这个分量换出去(也叫


出基

)。

在更换完之后,可以得到新的



,对应的

,所以可以得到新的

,所以对应的

(注意这个时候

对应的列指标已经变了,所以拼接的时候要注意顺序),这个时候也可以算出来

。那么一直往下做,到停止条件满足即可。

事实上在运筹学中,我们也可以通过

画表

的方式来解决这样的问题,思路也完全一样。这里我们因为长度限制,就不多说这个思路了,可以参考运筹学的教材来了解这样的计算方法。

所以到此为止,所有的单纯形法的“正常”计算思路都已经介绍完了,但是事实上还会有一种情况就是

退化

。这个的意思是,

当我们的基确定下来之后,



中却存在




的分量为0



。换句话说这个时候只有


,就没有办法使得算法正常进行。对于退化自然也有一定的处理方式,但同样的我们也不在这里详细介绍。同时如果我们的过程是正常的,那么算法结束的时候,就是找到了极小值的时候。这个可以在


Numerical Optimization

中的Thm 13.4中找到。


内点法

刚刚我们介绍完了单纯形法,但是单纯形法并非是一个速度很让人满意的方法。假如说我们的


的大小为

,那么它大概需要


的迭代次数,这样的话其实严格来说算是一个


指数级别复杂度

的算法(注意一下,严格来说计算时间复杂度的计算方式是根据

数据的存储量

而言的,而存储一个


这个数到计算机自然不可能占用

个字节,所以这里大家可能会有疑惑,记住这个结论就好)。所以相比较而言,内点法(Interior Point Method)就是一个值得提倡的方法,因为它的计算复杂度


一般是多项式级别

还是一样,考虑问题


行满秩。内点法的含义就是


根据方程组的KKT条件,寻找它的一个满足KKT条件的点

。比方说在这里的拉格朗日函数为

其中


,那么对应的它的KKT条件为

大家可以通过第一节的向量求导的方法来求解KKT条件,这里为了方便把传送门放上:

学弱猹:数值优化|笔记整理(1)——引入,线搜索:步长选取条件​zhuanlan.zhihu.com

d12ae4bed1a94c1cc7898e8229a70875.png

所以化简一下可以得到我们关注的问题的形式为

并且



仔细观察这个方程组可以发现,这个本质上就是一个



方程组求根

问题。对于方程组求根,我们本质上就是求解下面这样的问题

其中


为方程组的Jacobi矩阵,在这里其实就是

,也就是我们的每一行都是对它的三个分量

求梯度得到的结果。这个结果的由来也并不难理解,具体的可以参考牛顿法(第5节)的推导,然后把它从方程推广到方程组的情况。这里还是一样给出链接

学弱猹:数值优化(5)——信赖域子问题的求解,牛顿法及其拓展​zhuanlan.zhihu.com

0f7c3f555866fcdc04fea2c31967252d.png

而这个方程组的求解一般也确实是牛顿法。

假如说我们定下来了


,那么本质上其实就是定下了我们的


搜索方向

。换句话说我们的更新公式就是

很明显,为了保证


的非负性,我们需要让

小一些。但是这也就是问题所在了。因为这个条件会让我们的收敛速度很慢。同时需要注意的是,我们的迭代矩阵


不一定是满秩的

,这样的话方程组的解不一定唯一,对应的搜索方向也会无法确定。

为了使得我们的解是唯一的,一个关键的思路是考虑修改我们的方程组,变成下面这样

所以一定程度上是放宽了互补松弛条件。

当然了这个思路不是拍脑袋一下子想出来的,其背后是将这个线性规划问题修改成了一个对数栅栏(log-barrier,这个翻译实在是太烫嘴了)的形式。所以本质上就是

这个函数是一个严格凸的函数,所以极小值唯一。同时需要注意的是,因为它满足LICQ条件(大家可以自己验证一下),所以它的Lagrange函数的解是唯一的。而如果我们求解它的KKT条件,我们可以得到

然后设


,化简即可得到我们之前的形式。之后的方式就很明确了。精确的求解结果得不到,那就考虑近似,也就是说不断的减小

就可以了。


算法实现

理论的部分其实到此就差不多了,接下来我们介绍实际的算法中,它会怎么做。首先要观察到的是,


本质上是一个对于

(意思就是

的对应分量的积)的估计,所以我们这里的算法思路就是设

,然后设

是一个对于当前的

的估计,再人工控制

(一般来说

),这样的话这个

随着

的变小,也就自然的会变小。所以最终算法需要求解的问题,就是

当然了,对这个方程组,我们不会真的构造这样的一个大矩阵,而是会考虑把它化为下面这样的等价形式来求解。

其中


,

,

看似很玄乎,其实就是把三个式子写出来然后尝试着去化简而已。先根据原始方程组得到的3个式子来,然后先得到比较简单的


,这就会用到两个方程,然后把式子带到最后一个方程里面化简即可。注意根据定义,我们可以得到

好的,接下来我们贴出我们的算法图给大家参考。

691624d0c8cee07b9eabfbda444b6a7a.png

这里有一个疑点就是


,事实上,这个集合被定义为

,简单来说就是希望我们的每一个分量值在一个合适的范围内。下面这一张图虽然不太严谨,但算解释了这一点。

ba922deabb02846e73ec965c3f0f4379.png

也就是说,这个算法一方面希望函数值能够尽可能的下降,另一方面又不希望算法让我们的迭代点不满足约束条件。事实上,这就会导致一般情况下,算法跑出来的点的轨迹就如上图所示。

那么这个算法的收敛性如何呢?可以参考下面的这个性质。

Theorem 2:


为算法所定义出的对应含义的序列,那么给定

,存在一个

,有

我们这里不给出证明,感兴趣的读者可以参考

Numerical Optimization

的定理14.4。


实际的算法实现

有的人可能会感到一脸懵逼:

理论我也知道了,算法我也知道了,那这一块是什么?其实虽然说书上给了我们上面贴的算法,但是实际情况下,大家为了效果会更希望用我们接下来提供的方法,尽管它并没有理论保障。但是这里要提醒大家的是,这种现象在带约束优化问题中是常态

。之后我们还会碰到这样的情况。

因为没有理论基础,我们也不多解释这个算法,大家如果想实现的话,直接使用即可。

a95c15c87dfd6a06cef4a378677393da.png

3f4df275159e8bdfce5d11b2f0c3ccd4.png

c49518cecadacdadf60b41f6935599d8.png

这个方法的核心思想是

主对偶问题

(primal-dual)优化方法,简单的用凸优化的知识来解释呢,就是

对偶问题和原始问题都做优化迭代

好的,关于内点法,我们就说到这里。


小结

本节我们关注的是线性规划中的两个方法:单纯形法与内点法。这两种方法的来源不太一样,一个是考虑的几何意义,一个是考虑的KKT条件(当然了其实单纯形法也可以从KKT条件的角度出发解释,不过不是我们这里采用的考虑方法)。二者的思路不同,求解的方式也有不一样。当然了,在内点法中更是出现了实际的使用方法没有理论保障的情况。这也会是之后的常态。

在下一节我们会介绍

二次规划

的具体的算法,大家可以将它与线性规划对比,看看二者有什么区别。


小结

本节我们主要关注了非线性规划问题的极值性质,从一开始对于约束的探索,到之后搭建几何到代数的桥梁,再到最后利用这些思想方法证明带约束优化中极为重要的KKT条件。虽然说KKT条件只是一个充分条件,很像是无约束优化中的驻点的地位,但是对于优化这个领域来说,这已经算是很不错的成果了。

下一节我们会进入到

线性规划

的部分,介绍一些运筹学中很常见的算法,并适当的给出一些实际的计算实例。

——————————————————————————————————————

87a87cc15f8f021e4f6f37ab2097a307.png

本专栏为我的个人专栏,也是我学习笔记的主要生产地。

任何笔记都具有著作权,不可随意转载和剽窃

个人微信公众号:

cha-diary

,你可以通过它来获得最新文章更新的通知。

《一个大学生的日常笔记》专栏目录:笔记专栏|目录

《GetDataWet》专栏目录:GetDataWet|目录

想要更多方面的知识分享吗?可以关注专栏:一个大学生的日常笔记。你既可以在那里找到通俗易懂的数学,也可以找到一些杂谈和闲聊。也可以关注专栏:GetDataWet,看看在大数据的世界中,一个人的心路历程。我鼓励和我相似的同志们投稿于此,增加专栏的多元性,让更多相似的求知者受益~