Я пишу небольшую оболочку вокруг Gurobi и Cplex, чтобы модели, которые я пишу, не были решающими.Я очень хорошо знаком с Gurobi, но я очень плохо знаком с Cplex, и у меня возникают проблемы с репликацией определенных вызовов API, которые я использую очень часто.
В частности, мне трудно понять, как передать смыслв Cplex API:
std::shared_ptr<Constraint> Model::addConstr(const std::vector<std::shared_ptr<Variable>>& vars,
const std::vector<double>& coeffs, char sense,
double rhs, const std::string& name)
#ifdef GUROBI
GRBLinExpr expr;
std::vector<GRBVar> grb_vars;
for(auto var : vars) {
grb_vars.push_back(*(var->getGRBVar()));
}
expr.addTerms(&coeffs[0], &grb_vars[0], (int) vars.size());
GRBConstr constraint = _grb_model->addConstr(expr, sense, rhs, name);
std::shared_ptr<GRBConstr> grb_constr_shared = std::make_shared<GRBConstr>(constraint);
return std::make_shared<Constraint>(grb_constr_shared);
#elif defined CPLEX
// do exactly the same process for cplex
IloExpr expr(_cplex_env);
for(int i = 0; i < vars.size(); ++i) {
expr += coeffs[i] * vars[i];
}
// this line below doesn't work -- I don't know how to pass the sense of
// the constraint. I'd like to avoid using a switch statement if possible..
IloConstraint constraint = _cplex_model.add(expr, sense, rhs);
#endif
}
И у меня возникают проблемы с выяснением, как передать коэффициент для переменной в цели.Я хотел бы иметь возможность сделать это при создании переменной (или, по крайней мере, сразу после создания переменной), чтобы у меня была функциональность, аналогичная gurobi.
std::shared_ptr<Variable> Model::addVar(double lb, double ub, double obj,
char var_type, std::string name) {
#ifdef GUROBI
GRBVar grb_var = _grb_model->addVar(lb, ub, obj, var_type, std::move(name));
std::shared_ptr<GRBVar> grb_var_shared = std::make_shared<GRBVar>(grb_var);
return std::make_shared<Variable>(grb_var_shared);
#elif defined CPLEX
// do the same process for CPLEX and return std::make_shared<Variable>(cplex_var_shared);
// this line defines the variable but doesn't set its coeff in the
// objective function -- how do I set the variable's objective coefficient?
IloNumVar var(*_cplex_env, lb, ub, IloNumVar::Int, name.c_str());
#endif
}