如何在优化模型之前访问 Gurobi 变量属性
how to access Gurobi variable attributes before optimizing model
我想在调用 gurobi 中的 optimize() 方法之前检查变量名、上限和下限。当我尝试这个时,它给了我 error.But 如果在优化方法之后调用,同样可以正常工作。
在下面的代码中:
首先 "x.get(GRB_StringAttr_VarName)" 不起作用,我在 optimize() 之前调用了它。
第二个 "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) << " "
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;
有效。
我想在调用 gurobi 中的 optimize() 方法之前检查变量名、上限和下限。当我尝试这个时,它给了我 error.But 如果在优化方法之后调用,同样可以正常工作。
在下面的代码中: 首先 "x.get(GRB_StringAttr_VarName)" 不起作用,我在 optimize() 之前调用了它。 第二个 "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) << " "
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;
有效。