I was struggling with similar issue recently and noticed that for some reason working with IloRange is much slower than using IloNumExpr.
Previously I was adding constraints as follows:
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);
Replacing this code with the following:
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();
}
improved speed significantly.
Hope, this will help someone.