高级建模方法(Gurobi):线性化、分段线性函数、逻辑变量/约束

乘积式

(1) y = x 1 ∗ x 2 y = x_{1}*x_{2} y=x1x2, x 1 , x 2 x_{1},x_{2} x1,x2 ∈ \in {0,1}
x 1 = 0 x_{1} = 0 x1=0, 则 y ≤ M x 1 = x 1 y\leq Mx_{1}=x_{1} yMx1=x1
x 2 = 0 x_{2} = 0 x2=0, 则 y ≤ M x 2 = x 2 y\leq Mx_{2}=x_{2} yMx2=x2
x 1 = 1 x_{1} = 1 x1=1, 则 y ≤ x 1 ∗ x 2 = x 2 y\leq x_{1}*x_{2}=x_{2} yx1x2=x2 x 2 − y ≤ M ( 1 − x 1 ) = ( 1 − x 1 ) x_{2} - y \leq M(1-x_{1})=(1-x_{1}) x2yM(1x1)=(1x1),即 x 1 + x 2 − 1 ≤ y x_{1}+x_{2}-1\leq y x1+x21y

(2) y = x 1 ∗ x 2 y = x_{1}*x_{2} y=x1x2, x 1 x_{1} x1 ∈ \in {0,1}, x 2 ∈ [ 0 , u ] x_{2}\in [0,u] x2[0,u]
x 1 = 0 x_{1} = 0 x1=0, 则 y ≤ M x 1 = x 1 y\leq Mx_{1}=x_{1} yMx1=x1
x 2 ∈ [ 0 , u ] x_{2} \in [0,u] x2[0,u], 则 0 ≤ y ≤ M x 2 = u ∗ x 2 0 \leq y\leq Mx_{2}=u*x_{2} 0yMx2=ux2
x 1 = 1 x_{1} = 1 x1=1, 则 y ≤ x 1 ∗ x 2 = x 2 y\leq x_{1}*x_{2}=x_{2} yx1x2=x2 x 2 − y ≤ M ( 1 − x 1 ) = u ( 1 − x 1 ) x_{2} - y \leq M(1-x_{1})=u(1-x_{1}) x2yM(1x1)=u(1x1),即 x 2 − u ( 1 − x 1 ) ≤ y x_{2}-u(1-x_{1})\leq y x2u(1x1)y

(3) y = x 1 ∗ x 2 y = x_{1}*x_{2} y=x1x2, x 1 x_{1} x1 ∈ \in {0,1}, x 2 ∈ [ l , u ] , 0 ≤ l x_{2}\in [l,u],0 \leq l x2[l,u],0l
m ∗ x 1 ≤ x 1 ∗ x 2 ≤ M ∗ x 1 m*x_{1} \leq x_{1}*x_{2} \leq M*x_{1} mx1x1x2Mx1, 则 l x 1 ≤ y ≤ u ∗ x 1 lx_{1} \leq y\leq u*x_{1} lx1yux1
m ∗ x 2 ≤ y ≤ M ∗ x 2 m*x_{2} \leq y\leq M*x_{2} mx2yMx2, 则 0 ≤ y ≤ x 2 0 \leq y\leq x_{2} 0yx2
x 1 = 1 x_{1} = 1 x1=1, 则 y ≤ x 1 ∗ x 2 = x 2 y\leq x_{1}*x_{2}=x_{2} yx1x2=x2 x 2 − y ≤ M ( 1 − x 1 ) = u ( 1 − x 1 ) x_{2} - y \leq M(1-x_{1})=u(1-x_{1}) x2yM(1x1)=u(1x1),即 x 2 − u ( 1 − x 1 ) ≤ y x_{2}-u(1-x_{1})\leq y x2u(1x1)y

绝对值

max ⁡ ∣ x ∣ \max |x| maxx, big-M

max ⁡ z z = x p + x n max ⁡ ∣ x ∣ ⟶ x = x p − x n x p ≤ M y x n ≤ M ( 1 − y ) y ∈ { 0 , 1 } , 0 ≤ x p , x n \begin{array}{ll} &\max z \\ & z=x_{p}+x_{n} \\ \max |x| \quad \longrightarrow \quad & x=x_{p}-x_{n} \\ & x_{p} \leq M y \\ & x_{n} \leq M(1-y) \\ & y \in\{0,1\}, 0 \leq x_{p}, x_{n} \end{array} maxxmaxzz=xp+xnx=xpxnxpMyxnM(1y)y{ 0,1},0xp,xn

  • 优点:LP relaxation更紧,当M较小时表现会更好;
  • 缺点:当x可以为无穷大/没有约束时,big-M不能取到。

max ⁡ ∣ x ∣ \max |x| maxx, SOS-1约束

max ⁡ z z = x p + x n max ⁡ ∣ x ∣ ⟶ x = x p − x n x p , x n ∈ S O S − 1 \begin{array}{ll} &\max z \\ & z=x_{p}+x_{n} \\ \max |x| \quad \longrightarrow \quad& x=x_{p}-x_{n} \\ & x_{p}, x_{n} \in SOS-1 \end{array} maxxmaxzz=xp+xnx=xpxnxp,xnSOS1

  • 优点:不需要big-M,且总是成立的。
  • SOS(special ordered sets,特殊顺序集)是指一组有序集合里,顶多有一个非零值(SOS1 型),或顶多有两个非零值(SOS2 型)
    Note: gurobi在presolve的时候往往会将SOS约束转换成Big-M的约束
addGenConstrAbs(y, x)

分段线性函数

在这里插入图片描述

SOS2表示法

假设 ( x i , y i ) (x_{i},y_{i}) (xi,yi)是第 i t h i^{th} ith的端点,当 y = f ( x ) y=f(x) y=f(x)是凸函数时,则SOS-2约束时冗余的。
x = ∑ i λ i x i y = ∑ i λ i y i ∑ i λ i = 1 λ i ≥ 0 ,  SOS2  \begin{array}{c} x=\sum_{i} \lambda_{i} x_{i} \\ y=\sum_{i} \lambda_{i} y_{i} \\ \sum_{i} \lambda_{i}=1 \\ \lambda_{i} \geq 0, \text { SOS2 } \end{array} x=iλixiy=iλiyiiλi=1λi0, SOS2 

0-1变量表示法

z 1 ⩽ y 1 z 2 ⩽ y 1 + y 2 z 3 ⩽ y 2 + y 3 … z n − 1 ⩽ y n − 2 + y n − 1 z n ⩽ y n − 1 y 1 + y 2 + … + y n − 1 = 1 z 1 + z 2 + … + z n = 1 x = z 1 x 1 + z 2 x 2 + … + z n x n y = z 1 y 1 + z 2 y 2 + … + z n y n y i ∈ { 0 , 1 } ∀ i = 1 , 2 , ⋯   , n − 1 z i ⩾ 0 , ∀ i = 1 , 2 , ⋯   , n \begin{aligned} &z_{1} \leqslant y_{1}\\ &z_{2} \leqslant y_{1}+y_{2}\\ &z_{3} \leqslant y_{2}+y_{3}\\ &\ldots\\ &z_{n-1} \leqslant y_{n-2}+y_{n-1}\\ &z_{n} \leqslant y_{n-1}\\ &y_{1}+y_{2}+\ldots+y_{n-1}=1\\ &z_{1}+z_{2}+\ldots+z_{n}=1\\ &x=z_{1} x_{1}+z_{2} x_{2}+\ldots+z_{n} x_{n}\\ &y=z_{1} y_{1}+z_{2} y_{2}+\ldots+z_{n} y_{n}\\ &y_{i} \in\{0,1\}\\ &\forall i=1,2, \cdots, n-1\\ &z_{i} \geqslant 0, \quad \forall i=1,2, \cdots, n \end{aligned} z1y1z2y1+y2z3y2+y3zn1yn2+yn1znyn1y1+y2++yn1=1z1+z2++zn=1x=z1x1+z2x2++znxny=z1y1+z2y2++znynyi{ 0,1}i=1,2,,n1zi0,i=1,2,,n

min ⁡ \min min/ max ⁡ \max max

min ⁡ \min min max ⁡ \max max

min ⁡ { max ⁡ i x i } ⟶ min ⁡ z z ≥ x i ∀ i \min \left\{\max _{i} x_{i}\right\}\longrightarrow\begin{array}{l} \min z \\ z \geq x_{i} \forall i \end{array} min{ imaxxi}minzzxii

min ⁡ \min min min ⁡ \min min

min ⁡ z min ⁡ { min ⁡ i x i } ⟶ z ≥ x i − M ( 1 − y i ) ∑ i y i = 1 y i ∈ { 0 , 1 } \begin{array}{l} & \min _{z} \\ \min \left\{\min _{i} x_{i}\right\}\longrightarrow& z \geq x_{i}-M\left(1-y_{i}\right) \\ & \sum_{i} y_{i}=1 \\ & y_{i} \in\{0,1\} \end{array} min{ minixi}minzzxiM(1yi)iyi=1yi{ 0,1}

变量-逻辑表达式

注意,以下 y y y ∈ \in {0,1}

x 1 = 1 ∧ x 2 = 1 x 1 + x 2 = 2 x_{1}=1 \wedge x_{2}=1 \quad x_{1}+x_{2}=2 x1=1x2=1x1+x2=2
y = ( x 1 = 1 ∧ x 2 = 1 ) ⟶ y ≤ x 1 y ≤ x 2 y ≥ x 1 + x 2 − 1 \begin{aligned} y=\left(x_{1}=1 \wedge x_{2}=1\right) & \longrightarrow &y & \leq x_{1} \\ && y& \leq x_{2} \\ && y & \geq x_{1}+x_{2}-1 \end{aligned} y=(x1=1x2=1)yyyx1x2x1+x21

addGenConstrAnd(y, [x1,x2])

x 1 = 1 ∨ x 2 = 1 , x 1 + x 2 ≥ 1 x_{1}=1 \vee x_{2}=1,x_{1}+x_{2} \geq 1 x1=1x2=1x1+x21
y = ( x 1 = 1 ∨ x 2 = 1 ) ⟶ y ≥ x 1 y ≥ x 2 y ≤ x 1 + x 2 \begin{aligned} y=\left(x_{1}=1 \vee x_{2}=1\right) & \longrightarrow &y & \geq x_{1} \\ && y& \geq x_{2} \\ && y & \leq x_{1}+x_{2} \end{aligned} y=(x1=1x2=1)yyyx1x2x1+x2

addGenConstrOr(y, [x1,x2])

异或

x 1 = 1  xor  x 2 = 1 x 1 + x 2 = 1 x_{1}=1 \text { xor } x_{2}=1 \quad x_{1}+x_{2}=1 x1=1 xor x2=1x1+x2=1
y = ( x 1 = 1  xor  x 2 = 1 ) ⟶ y ≥ x 1 − x 2 y ≥ x 2 − x 1 y ≤ x 1 + x 2 y ≤ 2 − x 1 − x 2 \begin{aligned} y=\left(x_{1}=1 \text { xor } x_{2}=1\right) & \longrightarrow&y & \geq x_{1}-x_{2} \\ && y& \geq x_{2}-x_{1} \\ && y & \leq x_{1}+x_{2} \\ && y & \leq 2-x_{1}-x_{2} \end{aligned} y=(x1=1 xor x2=1)yyyyx1x2x2x1x1+x22x1x2

If-then条件

  • if x 1 = 1 x_{1}=1 x1=1 then x 2 = 1 x_{2}=1 x2=1,则 x 1 ≤ x 2 x_{1} \leq x_{2} x1x2
  • if z = 1 z=1 z=1, then x 1 + 2 ∗ x 2 − x 3 ≥ 2 x_{1}+2*x_{2}-x_{3} \geq 2 x1+2x2x32
addGenConstrIndicator(z, 1, x1+2*x2-x3 >= 2)

半连续变量

半连续变量的表示

x = 0 ∨ 40 ≤ x ≤ 100 x=0 \vee 40 \leq x \leq 100 x=040x100
⟶ \quad \longrightarrow \quad 40 y ≤ x ≤ 100 y 40y \leq x \leq 100y 40yx100y, y y y ∈ \in {0,1}

x = model.addVar(vtype=GRB.SEMICONT, lb=40, ub=100, name="x") 
x = model.addVar(vtype=GRB.SEMIINT, lb=40, ub=100, name="x")

限制半连续变量的数量

40 y i ≤ x i ≤ 100 y i 40y_{i} \leq x_{i} \leq 100y_{i} 40yixi100yi, y i y_{i} yi ∈ \in {0,1}, ∑ i y i ≤ 30 \sum_{i}y_{i} \leq 30 iyi30

大M的取值选择

x 1 + x 2 ≤ 10 + M y  if  x 1 , x 2 ≤ 100 ,  then  M = 190 \begin{array}{c} x_{1}+x_{2} \leq 10+M y \\ \text { if } x_{1}, x_{2} \leq 100,\text { then } M=190 \end{array} x1+x210+My if x1,x2100, then M=190

约束-逻辑不等式(或)

在这里插入图片描述

约束-逻辑等式(或)

在这里插入图片描述

至少(at least)

至少m个约束满足,则 ∑ i = 1 k y i ≥ m \sum _{i=1}^{k}y_{i} \geq m i=1kyim

max_(), min_(), abs_(), and_(), or_(), any_()
model.addConstr(x == abs_(y)) 
model.addConstr(x == or_(y,z,w))
X, Y, Gcons =
model.addVars(10),model.addVars(10), {
    
    } 
for i in X:
  Gcons[i] = model.addGenConstrMin(X[i], [Y[i], 10], name="Gc")

猜你喜欢

转载自blog.csdn.net/weixin_43464554/article/details/113843411