CPLEX C++ 常量约束

CPLEX C++ constant constraint

我正在用 C++ 制作一个 CPLEX 模型,我需要一个像这样的函数:

IloConstraint f(...){
  IloConstraint constr;
        
  if(condition1){
    constr = (x+y >= 1);
    return constr;
  }
          
  if(condition2){
    constr = false;
    return constr;
  }
        
  constr = true;
  return constr;
}

我认为我通过

成功创建了真假约束
constr = (x==x);  and
constr = IloNot(x==x);

我认为这种方法不是很理想,因为它增加了额外的条件和变量。有没有更优化和更易读的方法来做到这一点?像

constr = IloConstraint(IloFalse); ?

IloConstraint(IloFalse) 将不起作用,因为这将被解释为 IloConstraint((IloConstraintI*)0)IloFalse 只是扩展为文字 0(零)),这将创建一个没有实现的约束。

没有用于真或假约束的文字。如果您执行 IloExpr(env, 1) == IloExpr(env, 1) 之类的操作(并且 != 用于 false 约束,则可以不使用额外变量。常量 true 约束的另一种选择是使用空 IloAnd 或空 IloOr.

但是,仅使用 x == x1 >= 2 或类似的东西对我来说似乎更具可读性。附加表达式通常不会造成问题。引擎将在预处理中删除那些。

另一种选择是使用 IloCplex::ifThen() 创建条件约束。也许这比 returns 约束的函数更具可读性。