拉格朗日松弛算法求解整数规划的基本原理

声明:

  • 原文之前发表在本人的CSDN上,现搬运到博客里。
  • 本文的目的是记录和分享学到的知识。作者已尽一切努力确保本文内容的准确性。作者在此声明不承担因本文中的错误或遗漏造成的任何损失所带来的责任,无论这些错误或遗漏是意外、疏忽或其他原因导致的。
  • 转载请备注来源,欢迎点赞收藏或指出本文不足。
  • 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
  • 本文链接:https://blog.csdn.net/weixin_45746917/article/details/125524606

本文由作者用心整理,希望对您有所帮助。如果您入门或困扰于该问题,请您静下心来阅读,准备纸笔推导,一定会有所收获。所有例子和引证均带有来源,可点超链接深入了解。

概述

  拉格朗日松弛是一种求解整数规划的、基于优化的启发式算法。该算法能提供较为优质的解,可证明解的质量(可得到优化上下界),但不保证最优性。拉格朗日松弛的应用十分广泛,例如无容量限制的设施选址问题(该问题为NP-hard问题)。
  拉格朗日松弛算法可追溯到Everett 1963年,Fisher 1973使用了该算法求解了调度问题。注意,该算法并不是拉格朗日提出的,是借鉴了拉格朗日乘子法的一些启示,由(Geoffrion 1974)命名。

  • 松弛方法对于一个优化问题十分重要,因为这种方法为最优值提供了“上下界限”。

  • 松弛就是把一个问题的约束变弱,这样可行域就大了,也能方便求解了。

  • 最小化问题中,松弛问题的最优值是下界。最大化问题是上界。

  • 松弛技术的精髓就是设计一个容易求解的松弛问题并得到一个优质的“界”。

链接: Everett 1963

链接: Fisher 1973

从拉格朗日乘子法开始

  微积分中,一类问题是求解一个函数的极大值或者极小值。当这个函数受限于另一个函数的时候,问题求解将变得困难。详见同济版《高等数学 下》(高等教育出版社)多元函数的极值及其求法——条件极值 拉格朗日乘数法。

维基百科的一个例子

  参见维基百科
  求函数f(x,y)f(x,y)的极值,且要求满足条件g(x,y)=cg(x,y)=c
  这里简单描述一下原理和证明过程,详细证明参见引用来源。假设f(x,y)f(x,y)的取值为dnd_n,注意dnd_n是随xxyy的值变化的。只有f(x,y)=dnf(x,y)=d_ng(x,y)=cg(x,y)=c相切时,同时沿着有f(x,y)=dnf(x,y)=d_ng(x,y)=cg(x,y)=c的方向前进,在这种情况下,会出现极值。
  由于二者是相切关系,那么二者的梯度满足如下关系:(切线、法线、梯度的关系)

f(x,y)=λ(g(x,y)c)\nabla f(x,y) = -\lambda \nabla (g(x,y)-c)

于是,有

[f(x,y)+λ(g(x,y)c)]=0\nabla[f(x,y) + \lambda (g(x,y)-c)]=0\\

  这样,如果求出了λ\lambda的值,带到F(x,y,λ)=f(x,y)+λ(g(x,y)c)F(x,y,\lambda)=f(x,y) + \lambda(g(x,y)-c)中,就能求出无约束条件下的极值和对应的极值点。F(x,y,λ)F(x,y,\lambda)f(x,y)f(x,y)在极值点处相等。极值点处,F(x,y,λ)=0\nabla F(x,y,\lambda)=0,且Fλ=g(x,y)c\frac{\partial F}{\partial \lambda}=g(x,y)-cg(x,y)c=0g(x,y)-c=0​,所以极值点处有F(x,y,λ)=f(x,y)F(x,y,\lambda)=f(x,y)

同济版第7版《高等数学 下》的例子

  第九章p117给出了更详细的证明,这里直接给出结论:要找z=f(x,y)z=f(x,y)在附加条件ϕ(x,y)=0\phi (x,y)=0下的可能极值点,可做拉格朗日函数:

L(x,y)=f(x,y)+λϕ(x,y)L(x,y) = f(x,y) + \lambda \phi(x,y)

其中λ\lambda为参数,然后求LLx,y,λx,y,\lambda的一阶偏导,并令其为0,将这个三个等式联立。方程组求解得到的解(x,y)(x,y)就是f(x,y)f(x,y)可能的极值点。

整数规划拉格朗日松弛

问题构建

  给定一个待求解的整数规划问题(PP):

Z=mincx s.t. Ax=bDxex0 and integral (P)\begin{aligned} Z=& \min c x \\ \text { s.t. } & A x=b \\ & D x \leq e \\ & x \geq 0 \text { and integral } \end{aligned} \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\left(\mathrm{P}\right)

  我们松弛其整数约束,得到LPLP问题:

Z=mincx s.t. Ax=bDxex0(LP)\begin{aligned} Z=& \min c x \\ \text { s.t. } & A x=b \\ & D x \leq e \\ & x \geq 0 \end{aligned} \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\left(\mathrm{LP}\right)

  我们松弛第一个等于约束,得到一个松弛后的拉格朗日问题(LRuLR_u),其中u={u1,u2,...um}u=\{u_1,u_2,...u_m\}是拉格朗日乘子。

ZD(u)=mincx+u(Axb) s.t. Dxex0 and integral (LRu)\begin{aligned} Z_D(u)=& \min c x + u(Ax-b) \\ \text { s.t. } & D x \leq e \\ & x \geq 0 \text { and integral } \end{aligned} \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\left(\mathrm{LR_u}\right)

  设xx^*PP问题的最优解,此时,有:

ZD(u)=mincx+u(Axb)cx+u(Axb)=cx=ZZ_D(u)= {\rm{min}}\,cx + u(Ax-b)\le cx^*+u(Ax^*-b) = cx^* = Z

  这说明,ZD(u)Z_D(u)的值一定小于等于ZZ的值。不等号的来源是松弛,因为LRuLR_uPP的约束更少,所以LRuLR_u的最优解一定小于等于把xx^*直接带入LRuLR_u得到的目标函数值。由于在PP中,Ax=bAx^* =b,所以cx+u(Axb)=cx=Zcx^*+u(Ax^*-b) = cx^* = Z
  如果Ax=bAx=b的约束变成了AxbAx\le b,则需要求u0u\ge 0,如果Ax=bAx=b的约束变成了AxbAx\ge b,则需要求u0u\le 0
  总之,不管怎么样,ZD(u)ZZ_D(u)\le Z在一定条件下成立,即ZD(u)Z_D(u)小于等于原问题的最优目标函数值。

乘子uu取值

拉格朗日对偶问题D{D}

   首先,应明确在uu的特定取值下,ZD(u)Z_D(u)可以等于ZZ。此时,这个问题就变成了跟uu相关的问题。如何给uu取值,使得ZD(u)Z_D(u)尽可能取最大值以接近ZZ的问题,称作拉格朗日对偶问题DD,即:

ZD=maxuZD(u)(D)Z_D = \max _u Z_D(u) \tag{D}

该问题的决策变量是uu,目标函数是最大化ZD(u)Z_D(u)的值。也就是说,求解原问题PP的最小化目标函数值ZZ已经转换成求解拉格朗日对偶问题DD的目标函数值ZD(u)Z_D(u)了。

   那么问题来了,拉格朗日对偶问题的形式很抽象,我们如何具象描述它呢?

拉格朗日对偶重构问题Dˉ\bar{D}

   假设拉格朗日松弛LRuLR_u的可行解集X={xDxe,x0 and integer}X=\{x|Dx\le e ,x\ge 0 \text{ and integer}\}是有限集,则我们可以令X={xt,t=1,...,T}X=\{x^t,t=1,...,T\}

这样,问题DD可重构为Dˉ\bar{D}

ZD=maxws.t.wcxt+u(Axtb),t=1,...,T(Dˉ)\begin{aligned} Z_D&=\quad {\rm{max}}\,w\\ \text{s.t.}\quad w &\le cx^t + u(Ax^t-b),t=1,...,T\\ \end{aligned} \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\left(\mathrm{\bar{D}}\right)

问:为什么可以这样重构?

*答:令w=ZD(u)w=Z_D(u),问题DD想求ZD(u)Z_D(u)关于uu的最大值,所以Dˉ\bar{D}的目标函数是求最大值。ZD(u)Z_D(u)是最小化cx+u(Axb)c x + u(Ax-b),那么ZD(u)Z_D(u)一定小于等于LRuLR_u的任意一个可行解xtx^t带入该表达式的值,即

mincx+u(Axb)=ZD(u)=wcxt+u(Axtb)\min c x + u(Ax-b) = Z_D(u) = w \le cx^t + u(Ax^t-b)

xtx^tLRuLR_u问题的最优解时等号成立。*

拉格朗日对偶重构问题的线性规划对偶Pˉ\bar{P}

  这时,再求Dˉ\bar{D}的线性规划对偶Pˉ\bar{P}

ZD=mint=1Tλtcxt s.t. t=1TλtAxt=bt=1Tλt=1λt0,t=1,,T(Pˉ)\begin{aligned} Z_{D}=& \min \sum_{t=1}^{T} \lambda_{t} c x^{t} \\ \text { s.t. } & \sum_{t=1}^{T} \lambda_{t} A x^{t}=b \\ & \sum_{t=1}^{T} \lambda_{t}=1 \\ & \lambda_{t} \geq 0, t=1, \ldots, T \end{aligned} \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\left(\mathrm{\bar{P}}\right)

  对偶推导:从Pˉ\bar{P}Dˉ\bar{D}推导,把bb分解成凸组合;从Dˉ\bar{D}Pˉ\bar{P}推导,把ww看成1w+0u1w+0u,其中wwuu是无约束的决策变量。

  虽然Pˉ\bar{P}LPLP不是等价问题,即Pˉ\bar{P}并不是原问题PP的线性松弛版本,但是当λt\lambda_t是整数(0或1)时,Pˉ\bar{P}等价于PP。理由如下:xtx^tLRuLR_u的可行解,一定满足约束DxeDx\le e。既然满足了这个约束,在所有的可行解中,也肯定存在一个xtx^t满足Axt=bAx^t=b,那么令对应的λt\lambda _t等于1即可。(满足条件a的所有解中,一定有一个解同时满足a和b,子集关系)

拉格朗日对偶重构问题Dˉ\bar{D}的意义

  问题Dˉ\bar{D}表明,ZD(u)Z_D(u)是一系列线性函数的下限值。为了方便理解,假设xx的变量数只有一个,T=4T=4表示对于问题LRuLR_u仅有4个可行解。那么,ZD(u)Z_D(u)uu变化的图像如图所示:
来源:Fisher: The Lagrangian Relaxation Method for Solving Integer Programming Problems  Management Science 50(12S), pp. 1861–1871, ©2004 INFORMS

  在这个图中,xtx^t是已知的,是常数,那么得到了四个关于uu的线性函数。取这些函数在uu不同取值的最小值,即为函数ZD(u)Z_D(u),如图中加粗线条所示。

  我们发现,ZD(u)Z_D(u)是连续的,是凹函数(参照国际定义)。这样找最大值就很简单,比如,我们使用爬山算法,但是我们不能求导,因为最优点处不可导。

  既然不可导,那就用次梯度法

次梯度法

次梯度概念

   满足如下公式的 yy 值为 ZD(u)Z_D(u)uˉ\bar{u} 处的次梯度。

y(uuˉ)ZD(u)ZD(u),uy(u-\bar{u}) \ge Z_D(u) - Z_D(u), \forall u

次梯度性质

  • 向量AxtbAx^t-bxtx^t求解 LRuLR_u 对应位置的次梯度。其余的次梯度都是这些“基础”次梯度的凸组合。
  • 当且仅当uu^*λ\lambda^*是可行的且满足互补松弛定理时,uu^*Dˉ\bar{D}的最优解且λ\lambda^*Pˉ\bar{P}的最优解,这等价于当且仅当ZD(u)Z_D(u)uu^* 处的次梯度为0时,uu^*DD的最优解。(说白了就是ZD(u)Z_D(u)取到了关于uu的最大值)

次梯度法更新乘子

   给定一个初始的乘子值 u0u^0,后续乘子第kk次迭代的值为uku^k,迭代公式如下:

uk+1=uk+tk(Axkb)u^{k+1} = u^{k} + t_k(Ax^k-b)

其中xkx^k(LRuk)(LR_{u^k})的最优解,tkt_k是一个正数,称为迭代步长。

Goffin (1977)表明:

tk0t_k→0i=0kti=0\sum_{i=0}^kt_i=0时,ZD(uk)ZDZ_D(u^k)→Z_D

   常用的迭代步长公式为:

tk=λk(ZZD(uk))Axkb2t_k = \frac{\lambda_k(Z^*-Z_D(u^k))} {||Ax^k-b||^2}

其中,λk\lambda_k是一个(0,2](0,2]之间的标量,ZZ^*ZDZ_D的上界,且使用启发式修改为PP的可行解。通常,λk\lambda_k的初始值设置为2,当一定迭代次数后,ZD(u)Z_D(u)的值仍未增加,λk\lambda_k的值减半。

   注意,这是一个经验性的方法,并不一定能满足最优收敛。

总结

上述的内容只是一个方法论,我们想求解一个问题,还是面临很多的困难的。具体的问题需要具体的分析,包含但不限于松弛哪个约束、获取上界的启发式方法、算法参数的调整等。具体的例子,可参考本人的硕士毕设(在github仓库中)使用拉格朗日松弛求解了一个选址问题。