如何更改 Gurobi C++ 模型中的 Objective 值系数
How to change the Objective Value Coefficients in Gurobi C++ Model
我构建了一个 MIP 模型,我想使用一组不同的 objective 函数系数多次求解(我意识到热启动不会很有帮助,我只是想避免模型构建时间)。
我通过将每个变量的 obj 系数设置为 0.0
来构建可重用模型。
我现在想将所有变量的 objective 系数添加到一个 std::vector
值中,然后优化模型并将所有 objective 系数再次设置为 0。
我目前正在这样做:
auto vars = model.getVars();
auto cols = model.get(GRB_IntAttr_NumVars);
for (int i =0; i < cols; ++i) {
std::cout << vars[i].get(GRB_StringAttr_VarName) << "\n";
vars[i].set(GRB_DoubleAttr_Obj, obj_val[i]);
}
//after doing stuff with the rebuilt-model setting all obj coeffs to 0
for (int i =0; i < cols; ++i) {
vars[i].set(GRB_DoubleAttr_Obj, 0.0);
}
delete[] vars;
有没有更快更优雅的方法来做到这一点?
要重置 objective,您可以使用 setObjective() 并将 0
作为线性表达式传递。
您还可以使用 array set methods 在一次调用中传递所有 objective 系数。这应该是执行此操作的最快方法,并且可以在您的代码中节省一个 for 循环。
如果您在设置新 objective 时无论如何都要遍历所有变量,为什么还要费心首先将其重置为 0?
您还应该检查 multi-objective feature 是否适合您。
我构建了一个 MIP 模型,我想使用一组不同的 objective 函数系数多次求解(我意识到热启动不会很有帮助,我只是想避免模型构建时间)。
我通过将每个变量的 obj 系数设置为 0.0
来构建可重用模型。
我现在想将所有变量的 objective 系数添加到一个 std::vector
值中,然后优化模型并将所有 objective 系数再次设置为 0。
我目前正在这样做:
auto vars = model.getVars();
auto cols = model.get(GRB_IntAttr_NumVars);
for (int i =0; i < cols; ++i) {
std::cout << vars[i].get(GRB_StringAttr_VarName) << "\n";
vars[i].set(GRB_DoubleAttr_Obj, obj_val[i]);
}
//after doing stuff with the rebuilt-model setting all obj coeffs to 0
for (int i =0; i < cols; ++i) {
vars[i].set(GRB_DoubleAttr_Obj, 0.0);
}
delete[] vars;
有没有更快更优雅的方法来做到这一点?
要重置 objective,您可以使用 setObjective() 并将 0
作为线性表达式传递。
您还可以使用 array set methods 在一次调用中传递所有 objective 系数。这应该是执行此操作的最快方法,并且可以在您的代码中节省一个 for 循环。
如果您在设置新 objective 时无论如何都要遍历所有变量,为什么还要费心首先将其重置为 0?
您还应该检查 multi-objective feature 是否适合您。