如何更改 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 是否适合您。