在建立优化问题的模型时,目标函数和约束条件中出现非线性项,会导致模型呈现非线性,即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
≥
0
x-y-b\ge 0
x−y−b≥0
x,y为连续变量,其中
λ
\lambda
λ为对偶乘子,b为常数,上述等式约束构成了两个连续变量的相乘,采用bigM法线性化过程如下式所示
λ
≤
M
z
\lambda \le Mz
λ≤Mz
x
−
y
−
b
≤
M
(
1
−
z
)
x-y-b\le M(1-z)
x−y−b≤M(1−z)
2、01变量与连续变量相乘带来的非线性项
出现在约束中:
在选址优化问题中经常出现,如发电机定容选址
x
≤
y
z
x\le yz
x≤yz
x,y为连续变量,z为01变量,非线性项为yz,采用bigM法线性化过程如下式所示
n
=
y
z
n=yz
n=yz
x
≤
n
x\le n
x≤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)
−
M
z
≤
n
≤
M
z
-Mz\le n\le Mz
−Mz≤n≤Mz
3、用if语句表示约束条件时,一些求解器写约束时可能不支持if判断(非线性项问题,看到了就一并记录)
{
y
≤
b
if
x
≥
a
y
≤
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
+
z
M
y
≤
b
+
(
1
−
z
)
M
y
≤
c
+
z
M
\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法的难点
持续更新,敬请期待!!(哈哈哈哈哈,得多看文献啊,有任何问题欢迎评论区讨论)