有没有办法引入舍入约束,如下所示:
v = floor(x * y)
,其中x, y
是连续决策变量,v
是整数决策变量。本质上是想将连续决策变量的乘法转换为整数。我正在使用 Gurobi 求解器。
以上可以通过添加以下不等式约束来实现:
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
。