首先介绍下拉格朗日松弛的出发点,以及该方法所属的门类;再介绍下拉格朗日松弛法需要处理的难点和注意事项。
目录
1.拉格朗日松弛出发点
2.拉格朗日松弛所属分类
3.拉格朗日松弛
3.1 拉格朗日松弛(松弛全部,转化为无约束问题)
3.2 拉格朗日分解(只松弛部分约束)
3.2.1 简单可分离问题——满足可分离性
3.2.2 非可分离性问题——需要上拉格朗日分解(松弛部分约束)
对于min问题而言,众所周知线性松弛可以提供一个下界,线性松弛很简单,即把决策变量的整数约束松弛为连续约束,这个界并不好。
因此我们期望找到一个更好的下界,这样上下界之间差距gap小,后续使用分支定界就可以剪去更多分支,求解效率就可以提升了。同样提升下界的方法,还有添加割平面,有效不等式,这些方法本质也是通过添加约束,砍掉外围的部分,通过缩小可行域,来让解提到提升(下界变大)。
所以综上:
(1)拉格朗日松弛得到的下界会比线性松弛得到的下界要好。
(2)每一个拉格朗日乘子对应着一个界,我们期望找到最好的下界,这句话等同于找到最好的拉格朗日乘子。
这是我们的出发点。
张老师提到ARRD的方法,是求解优化问题的四条路径:
A:approximate,近似算法
R:reformulation,重写模型,像DW分解,列生成,就属于这个脉络;
R:relaxation,松弛,线性松弛,拉格朗日松弛属于这个脉络;
D:decomposition,分解算法,本质是降维,benders分解,拉格朗日分解属于这一脉络。
换句话说拉格朗日算法还挺牛的,横跨拉格朗日松弛和拉格朗日分解两条路径。
拉格朗日松弛的思路和做法是,对于约束引入拉格朗日乘子,然后构造拉格朗日函数。注意,拉格朗日函数会比原问题的解更好,因为原目标函数中引入的拉格朗日项让原目标函数min问题更小,让原目标函数max问题更大了。因此我们对于min问题而言,在所有的拉格朗日乘子构造的拉格朗日函数中取max,往上拉大下界,从而可以得到拉格朗日松弛所能得到的最好的下界;对于max问题而言,在所有拉格朗日函数中取min,往下拉低上界。
拉格朗日松弛后的拉格朗日函数的形式,可以分为两种类型,(此处默认是松弛所有约束):
(1)一种是经过分析后不再含有原变量,只含有拉格朗日乘子,也叫作只含有拉格朗日乘子的显示表达。此时,直接求解,就可以得到最好的拉格朗日乘子,也就是我们说的对偶变量。——线性规划的对偶规划就是这么得到的。详见3.1。
(2)同时含有原函数的变量和拉格朗日乘子,也叫作非显示表达。有两种处理途径:一种是外逼近法,或者是只松弛部分约束即拉格朗日分解法。详见3.1种注意点(2)及3.2。
经过合并同类项,以及分析(各种场景,这一步是核心,可见注意点1里的分析),这样就能够使得拉格朗日函数得到的下界最好,最好的下界对应的乘子就是最好的乘子,也是我们说的对偶变量。(以下全部以min问题为例,只要不提,默认就是min问题。)
线性规划的对偶规划就是通过拉格朗日松弛推理分析得到的。
注意点:
(1)拉格朗日松弛得到的最好下界即使是可行解,也不一定是原问题的最优解。
因为新目标函数中还存在拉格朗日乘子项,除非拉格朗日乘子项=0(下图中的μ(b-Ax)=0,此时L(μ)=mincx也就是原来的目标函数),即被松弛约束的互补松弛性成立,再具体点说:要么乘子为0,要么被松弛的约束等式成立,(这就是KKT条件的3个条件之一)。
(2)拉格朗日松弛后的拉格朗日函数有两种类型:
a)一种是经过分析后不再含有原变量,只含有拉格朗日乘子,比如我们上面介绍的拉格朗日松弛得到对偶。
b)还有一种是无法分析,此时拉格朗日函数中同时含有原变量和拉格朗日乘子两类变量。那么我们的方式是先固定原变量,此时拉格朗日函数中只含有拉格朗日乘子一类变量了。具体的方法是我们通过列举原变量取值的可能,或者列举部分可能,这样拉格朗日函数中仅含有拉格朗日乘子一类变量,然后求解,得到乘子;再得到新的原变量取值,再求解继续得到新乘子......这是外逼近法的思路。在非线性规划问题中用的多。
由于非显示表示的拉格朗日函数不好处理,我们通常采用只松弛部分约束的方式。也就是拉格朗日分解这条路。
分解的本质是降维。按照问题的难易(是否满足分离性),可以将所有的优化问题分为两类:
对于一个优化问题而言,如果
• (1) 约束条件彼此之间互相独立(约束中只含有某类变量,不会有多类变量混合的情况。混合的也被叫做耦合/链接约束),
• (2) 目标函数可以写成对应元素的和的形式
我们称这样的问题为可分离问题。对于可分离问题,我们可以对其进行分解,分解成一个个的独立子问题,子问题往往是容易求解的。求解完独立子问题之后,再求和就可以得到原问题的解,原问题的最优解就等于子问题的最优解之和。
总之,对于满足可分类的问题而言,子问题之间是互相独立的,目标函数也是互相独立的,那么原问题可以拆成若干个子问题,原问题的目标函数也是这若干个子问题的累加。
如果约束条件不具备上述可分离性,那么需要上拉格朗日分解了!拉格朗日分解的本质还是拉格朗日松弛。先进行拉格朗日松弛处理,通过拉格朗日松弛的方式把一些复杂的约束条件放到目标函数上进行处理,之后再对问题进行分解。
这种处理方法的难点在于:
(1)松弛哪些约束——直接决定着子问题好不好解,常见的思路是看处理后的子问题是否具有特殊结构,比如形如背包约束的等等;
(2)解出来的好不好——间接决定着得到的下界怎么样,也是需要注意的一个问题。
总结:
1.拉格朗日松弛其实是想找最好的下界,这等同于找最好的乘子。一个拉格朗日乘子对应着一个下界。
2.假如拉格朗日函数可以写出显示表达,那么就可以直接得到原问题的对偶,直接找到最好的拉格朗日乘子。
3.拉格朗日得到的下界即使是原问题的可行解,也不一定是原问题的最优解,因为存在着拉格朗日乘子项,除非该项为0。
4.拉格朗日松弛掉部分约束的时候,这部分约束应该怎么选,直接决定着子问题求解的难易,以及求解结果的好坏。基本的出发点是处理那些子问题具有特殊结构的约束松弛掉;或者是耦合约束。
运筹优化课程 013-Lagrangian relaxation