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

乘积式

(1) y = x 1 ∗ x 2 , x 1 , x 2 ∈ { 0 , 1 } y=x_{1} * x_{2}, x_{1}, x_{2} \in\{0,1\} y=x1x2,x1,x2{0,1}
{ y ≤ x 1 y ≤ x 2 y ≥ x 1 + x 2 − 1 y ∈ { 0 , 1 } \left\{\begin{array}{l} y \leq x_{1} \\ y \leq x_{2} \\ y \geq x_{1}+x_{2}-1 \\ y \in\{0,1\} \end{array}\right. yx1yx2yx1+x21y{0,1}
(2) y = x 1 ∗ x 2 , x 1 ∈ { 0 , 1 } , x 2 ∈ [ 0 , u ] y=x_{1} * x_{2}, x_{1} \in\{0,1\}, x_{2} \in[0, u] y=x1x2,x1{0,1},x2[0,u]
{ y ≤ u x 1 y ≤ x 2 y ≥ x 2 − u ( 1 − x 1 ) y ∈ [ 0 , u ] \left\{\begin{array}{l} y \leq u x_{1} \\ y \leq x_{2} \\ y \geq x_{2}-u\left(1-x_{1}\right) \\ y \in[0, u] \end{array}\right. yux1yx2yx2u(1x1)y[0,u]
(3) y = x 1 ∗ x 2 , x 1 ∈ { 0 , 1 } , x 2 ∈ [ l , u ] , l ≥ 0 y=x_{1} * x_{2}, x_{1} \in\{0,1\}, x_{2} \in[l, u], l \geq 0 y=x1x2,x1{0,1},x2[l,u],l0
{ y ≤ x 2 y ≥ x 2 − u ( 1 − x 1 ) l x 1 ≤ y ≤ u x 1 \left\{\begin{array}{l} y \leq x_{2} \\ y \geq x_{2}-u\left(1-x_{1}\right) \\ l x_{1} \leq y \leq u x_{1} \end{array}\right. yx2yx2u(1x1)lx1yux1

绝对值

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")
  • 38
    点赞
  • 161
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值