как получить доступ к атрибутам переменных Gurobi перед оптимизацией модели

Я хотел проверить имя переменной, верхнюю и нижнюю границы перед вызовом метода optimize () в gurobi. Когда я попробовал это, это дает мне ошибку. Но то же самое работает нормально, если вызывается после оптимизации метода.

В приведенном ниже коде:
Во-первых, не работает x.get (GRB_StringAttr_VarName), который я вызывал перед optimize ().
Где второй «x.get (GRB_StringAttr_VarName)» работает нормально.
Для моей работы мне нужно вызвать get name и верхнюю границу, прежде чем оптимизировать метод.
Пожалуйста помоги

    GRBEnv env = GRBEnv();

GRBModel model = GRBModel(env);

// Create variables

GRBVar x = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, "x");
GRBVar y = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, "y");
GRBVar z = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, "z");

// Set objective: maximize x + y + 2 z
cout << x.get(GRB_StringAttr_VarName) << " " << endl;

model.setObjective(x + y + 2 * z, GRB_MAXIMIZE);
// Add constraint: x + 2 y + 3 z <= 4
model.addConstr(x + 2 * y + 3 * z <= 4, "c0");
// Add constraint: x + y >= 1
model.addConstr(x + y >= 1, "c1");
// Optimize model
model.optimize();

cout << x.get(GRB_StringAttr_VarName) << " "<< x.get(GRB_DoubleAttr_X) << endl;
cout << y.get(GRB_StringAttr_VarName) << " "

0

Решение

Gurobi имеет ленивый подход обновления. После того, как вы создадите свои переменные, вам нужно запустить model.update() написать изменения в вашу модель. Только после этого вы можете использовать методы объекта переменной:

#include "gurobi_c++.h"using namespace std;

int main(int argc, char *argv[]){
GRBEnv env = GRBEnv();

GRBModel model = GRBModel(env);

// Create variables

GRBVar x = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, "x");
GRBVar y = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, "y");
GRBVar z = model.addVar(0.0, 1.0, 0.0, GRB_BINARY, "z");
model.update();

// Set objective: maximize x + y + 2 z
cout << x.get(GRB_StringAttr_VarName) << " " << endl;

model.setObjective(x + y + 2 * z, GRB_MAXIMIZE);
// Add constraint: x + 2 y + 3 z <= 4
model.addConstr(x + 2 * y + 3 * z <= 4, "c0");
// Add constraint: x + y >= 1
model.addConstr(x + y >= 1, "c1");
// Optimize model
model.optimize();

cout << x.get(GRB_StringAttr_VarName) << " " << x.get(GRB_DoubleAttr_X) << endl;
cout << y.get(GRB_StringAttr_VarName) << " ";
}

Обратите внимание, что model.write() а также model.optimize() оба позвонят model.update() автоматически. Вот почему ваш второй

 cout << x.get(GRB_StringAttr_VarName) << " " << x.get(GRB_DoubleAttr_X) << endl;

работает.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]