【问题标题】:how to access Gurobi variable attributes before optimizing model如何在优化模型之前访问 Gurobi 变量属性
【发布时间】:2018-11-27 11:51:00
【问题描述】:

我想在 gurobi 中调用 optimize() 方法之前检查变量名、上限和下限。当我尝试这个时,它给了我错误。但如果在优化方法之后调用,同样可以正常工作。

在下面的代码中: 第一个“x.get(GRB_StringAttr_VarName)”不起作用,我在优化()之前调用了它。 第二个“x.get(GRB_StringAttr_VarName)”工作正常。 对于我的工作,我需要在优化方法之前调用获取名称和上限。 请帮忙

    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) << " "

【问题讨论】:

  • 如果我的回答对您有帮助,您可以考虑accepting it

标签: c++ optimization gurobi mixed-integer-programming


【解决方案1】:

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;

有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2023-02-14
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多