Функция Гуроби переменных - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть такая функция: y = f(x) = a*(x/b) + c

И я бы хотел максимизировать y, используя Gurobi. И x, и y должны быть переменными Gurobi.

Как мне смоделировать эту проблему?

P.S: a, b и c - числовые значения.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Сначала вы должны добавить как 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);
0 голосов
/ 03 мая 2019

Я бы добавил к ответу Силке, что вам, вероятно, потребуется открыть диапазон для переменных x и y, чтобы они могли принимать отрицательные значения в зависимости от используемых вами коэффициентов.

...