在建立优化问题的模型时,目标函数和约束条件中出现非线性项,会导致模型呈现非线性,即NLP问题,采用商业求解器一般很难求解,故需要对非线性项进行线性化处理。下面用于记录阅读文献时遇到的线性化方法,不做过多定义,分别进行举例说明便于理解。
一、bigM法
1、两个连续变量相乘带来的非线性项
出现在约束中:
如KKT条件的互补松弛约束
λ(x−y−b)=0\lambda(x-y-b)=0λ(x−y−b)=0
λ≥0 \lambda \ge 0 λ≥0
x−y−b≥0x-y-b\ge 0x−y−b≥0
x,y为连续变量,其中λ\lambdaλ为对偶乘子,b为常数,上述等式约束构成了两个连续变量的相乘,采用bigM法线性化过程如下式所示
λ≤Mz\lambda \le Mzλ≤Mz
x−y−b≤M(1−z)x-y-b\le M(1-z)x−y−b≤M(1−z)
出现在目标函数中:
minx,y xy\underset{x,y}{\mathop{\min }}\,xyx,yminxy
当x和y都为连续变量,非线性项由两个连续变量相乘带来,进行如下处理:
y=∑j=1JΔy⋅zjy=\sum\limits_{j=1}^{J}{\Delta y\cdot {{z}_{j}}}y=j=1∑JΔy⋅zj
∑j=1Jzj≤Zmax\sum\limits_{j=1}^{J}{{{z}_{j}}}\le {{Z}^{\max }}j=1∑Jzj≤Zmax
Δy\Delta yΔy为对y切割的大小,为一个固定的常数,具体值根据所求精度来定,zj{{z}_{j}}zj为01变量,这样两个连续变量相乘也就变为01变量与连续变量相乘∑j=1JΔy⋅xzj=∑j=1JUj\sum\limits_{j=1}^{J}{\Delta y\cdot x{{z}_{j}}}=\sum\limits_{j=1}^{J}{{{U}_{j}}}j=1∑JΔy⋅xzj=j=1∑JUj,目标函数替换为∑j=1JUj\sum\limits_{j=1}^{J}{{{U}_{j}}}j=1∑JUj,可以采用2中出现在约束中的线性化方法,表示如下:
Uj=Δy⋅xzj{{U}_{j}}=\Delta y\cdot x{{z}_{j}}Uj=Δy⋅xzj
−M(1−zj)≤Uj−Δy⋅x≤M(1−zj)-M(1-{{z}_{j}})\le {{U}_{j}}-\Delta y\cdot x\le M(1-{{z}_{j}})−M(1−zj)≤Uj−Δy⋅x≤M(1−zj)
−Mzj≤Uj≤Mzj-M{{z}_{j}}\le {{U}_{j}}\le M{{z}_{j}}−Mzj≤Uj≤Mzj
2、01变量与连续变量相乘带来的非线性项
出现在约束中:
在选址优化问题中经常出现,如发电机定容选址
x≤yzx\le yzx≤yz
x,y为连续变量,z为01变量,非线性项为yz,采用bigM法线性化过程如下式所示
n=yzn=yzn=yz
x≤nx\le nx≤n
−M(1−z)≤n−y≤M(1−z)-M(1-z)\le n-y\le M(1-z)−M(1−z)≤n−y≤M(1−z)
−Mz≤n≤Mz-Mz\le n\le Mz−Mz≤n≤Mz
3、用if语句表示约束条件时,一些求解器写约束时可能不支持if判断(非线性项问题,看到了就一并记录)
{y≤b if x≥ay≤c if x<a\left\{ \begin{align}
& y\le b\text{ if }x\ge a \\
& y\le c\text{ if }x<a \\
\end{align} \right.
{y≤b if x≥ay≤c if x<a
为变量,采用bigM法进行表示上述if约束条件
{a+(z−1)M≤x<a+zMy≤b+(1−z)My≤c+zM\left\{ \begin{align}
& a+(z-1)M\le x<a+zM \\
& y\le b+(1-z)M \\
& y\le c+zM \\
\end{align} \right.
⎩⎨⎧a+(z−1)M≤x<a+zMy≤b+(1−z)My≤c+zM
上述M都为较大的正值,如何选取合适的M值是bigM法的难点
持续更新,敬请期待!!(哈哈哈哈哈,得多看文献啊,有任何问题欢迎评论区讨论)