как получить доступ к атрибутам переменных Gurobi перед оптимизацией модели - PullRequest
0 голосов
/ 27 ноября 2018

Я хотел проверить имя переменной, верхнюю и нижнюю границу перед вызовом метода 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) << " "

1 Ответ

0 голосов
/ 27 ноября 2018

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;

работает.

...