我有一个类似这样的功能:y = f(x) = a*(x/b) + c
我想使用Gurobi最大化y
。 x
和y
都必须是Gurobi变量。
如何为这个问题建模?
P.S:a
,b
和c
是数值。
答案 0 :(得分:0)
首先,您必须同时添加x
和y
作为变量,例如
GRBVar x = model.addVar(0.0, GRB.INFINITY, 0.0, GRB.CONTINUOUS, "x");
GRBVar y = model.addVar(0.0, GRB.INFINITY, 0.0, GRB.CONTINUOUS, "y");
然后将目标函数设置为最大化y
GRBLinExpr expr = new GRBLinExpr();
expr.addTerm(1.0, y);
model.setObjective(expr, GRB.MAXIMIZE);
并添加一个约束条件,说明该约束y = a*(x/b) + c
或等效的y - a/b * x = c
:
expr = new GRBLinExpr();
expr.addTerm(1.0, y); expr.addTerm(- a/b, x);
model.addConstr(expr, GRB.EQUAL, c, "c0");
或者,您也可以通过在变量定义中指定目标系数来设置目标。即用
代替y
的定义
GRBVar y = model.addVar(0.0, GRB.INFINITY, 1.0, GRB.CONTINUOUS, "y");
目标的定义就变成了
model.set(GRB.IntAttr.ModelSense, GRB.MAXIMIZE);
答案 1 :(得分:-1)
我想在Silke's Answer中补充一点,您可能需要打开x和y变量的范围,以便它们可以是负值,具体取决于您使用的系数。