如何添加舍入约束,该约束采用 2 个浮点数决策变量的下限值 - Gurobi

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

有没有办法引入舍入约束,如下所示:

v = floor(x * y)
,其中
x, y
是连续决策变量,
v
是整数决策变量。本质上是想将连续决策变量的乘法转换为整数。我正在使用 Gurobi 求解器。

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

以上可以通过添加以下不等式约束来实现:

v <= x*y <= v + 1

借助上述不等式,

v
将向下舍入为
x*y
的值。如果
x*y
是一个浮点数,那么这将完美地工作,但是,如果
x*y
是一个整数,比如 6,那么
v
可以是 5 或 6。为了避免这种情况,可以引入一个小的常数容差
 e > 0
并将其应用于其中一个不等式。

下面是一个简短的代码片段来演示上述推理:

import gurobipy as gp
from gurobipy import GRB

m = gp.Model()

x = m.addVar(vtype = GRB.CONTINUOUS, ub = 5)
y = m.addVar(vtype = GRB.CONTINUOUS, ub = 8)

int_var = m.addVar(vtype = GRB.INTEGER)

# fix x, y to some float values.
# x*y = 27.8695, so int_var should = 27, post solve 
m.addConstr(x == 4.01)
m.addConstr(y == 6.95)

e = 0.00001

m.addConstr(x*y >= int_var - e)
m.addConstr(x*y <= int_var + 1 - e)

# dummy objective, since x and y are already fixed
m.setObjective(x*y, sense = GRB.MAXIMIZE)

m.optimize()

确实,

int_var
解析为
27
,这是
x*y = 27.8695
的底板。 如果您采取
x*y=24
,则
int_var
将解析为
24
(这是预期的行为,根据上面采取的小公差
e

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