【问题标题】:CPLEX C++ constant constraintCPLEX C++ 常量约束
【发布时间】:2020-07-22 11:12:35
【问题描述】:

我正在用 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); ?

【问题讨论】:

    标签: constants constraints cplex


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 1>=2 返回错误。关于 IloCplex::ifThen(),我正在尝试优化模型,因此在执行 CPLEX 之前,所有 IfThen 都由 C++ 检查。
    • 对不起,我不清楚。 1 >= 2 我的意思是 IloExpr(env, 1) >= IloExpr(env, 2) (类似于我在回答中指出的)。如果你只写1 >= 2,那么这将只是评估为false,所以基本上与IloFalse 相同。如果将两个数字都包装在 IloExpr 中,那么结果应该是一个永远无法满足的约束(而不仅仅是一个布尔值)。捕捉这些表示常量 TRUE 和 FALSE 的约束可能是一个好主意。这可能会节省一些内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多