当 Gurobi 中的指示变量为 true 时,强制执行分段线性约束

问题描述 投票:0回答:1

我想在指示变量为真时触发 Gurobi 中的分段线性 (PWL) 约束,否则可能会违反 PWL。有办法实现这一点吗?我在使用 Gurobi 中的

addGenConstrIndicator
功能时遇到一些困难。

linear-programming mixed-integer-programming
1个回答
0
投票

我认为我们不能直接声明

b = 1 => y = f(x)
,其中b是指示变量,f是任何一般约束,例如分段线性约束。但是我们可以通过另一个中间变量来达到目的,比如,
z
,并将约束写为:

b = 1 => z = y

所以你可以用z代替y(y现在变得多余了)。每当 b 为真时,z = y(强制执行 PWL 约束),否则当 b 为假时,可能会违反约束 (z = y)。

示例

import gurobipy as gp
from gurobipy import GRB

model = gp.Model("")

x = model.addVar(vtype = GRB.INTEGER, lb = 0, ub = 10)
y = model.addVar(vtype = GRB.CONTINUOUS, lb = 0, ub = 100)

z = model.addVar(vtype = GRB.CONTINUOUS, lb = 0, ub = 100)
b = model.addVar(vtype = GRB.BINARY)

model.addGenConstrPWL(x, y, [0, 1, 2, 3, 4, 5], [1.5, 0, 3, 5, 7, 2], "myPWLConstr")

model.addGenConstrIndicator(b, 1, z == y)

# artificially making the indicator variable true,
# thus enforcing PWL constraint
model.addConstr(b == 1)

model.setObjective(z, sense = GRB.MAXIMIZE)

model.optimize()

print("x = " + str(x.X)) #4
print("b = " + str(b.X)) #1
print("z = " + str(z.X)) #7

PWL 约束被强制执行,并且 z 的值 = 7,这是在 PWL 约束到位的情况下可以达到的最大值。

但是,如果使 b = 0,则 z 的值(我们正在最大化)将达到 100,这是 z 的上限

© www.soinside.com 2019 - 2024. All rights reserved.