Cplex C++ 接口:如何快速添加许多约束?

计算科学 优化 线性规划 混合整数规划
2021-12-26 04:07:47

我注意到IloModel逐个添加约束可能会非常缓慢。(我指的是模型的构建,而不是优化。)

假设我有许多具有相同数量变量的约束,我可以在一个函数调用中添加约束矩阵吗?

还有其他方法可以加快模型的构建吗?

2个回答

我最近遇到了这个问题,并发现如果您首先将约束添加到 IloRangeArray,然后将该对象添加到模型中,您会看到显着的加速。如果约束包含在 IloRangeArray 等容器对象中,则移除约束也会更快。

我最近遇到了类似的问题,并注意到由于某种原因使用 IloRange 比使用 IloNumExpr 慢得多。以前我添加约束如下:

IloEnv env;
IloNumVarArray vars(env, stl_vars.size(), 0, IloInfinity);
IloRangeArray constrs(env, stl_constrs.size(), 0, 1);
for (size_t i = 0; i < stl_constrs.size(); ++i) {
    constrs[i].setUB(stl_constrs[i].ub);
    for (size_t j = 0; j < stl_constrs[i].vars.size(); ++j)
        constrs[i].setLinearCoef(vars[stl_constrs[i].vars[j].ind], stl_constrs[i].vars[j].coefficient);
}
model.add(constrs);

用以下代码替换此代码:

IloEnv env;
IloNumVarArray vars(env, stl_vars.size(), 0, IloInfinity);
for (size_t i = 0; i < stl_constrs.size(); ++i) {
    IloNumExpr row(env);
    for (size_t j = 0; j < stl_constrs[i].vars.size(); ++j)
        row += stl_constrs[i].vars[j].coefficient * vars[stl_constrs[i].vars[j].ind];
    model.add(row <= stl_constrs[i].ub);
    row.end();
}

显着提高了速度。

希望,这会帮助某人。