在CPLEX中使用布尔变量编写if语句的问题

时间:2019-09-05 20:29:34

标签: c++ cplex

这是我的Cplex代码的一部分。我将PreReq定义为布尔变量,但是在约束条件下,我得到了PreReq的错误,即“表达式必须具有布尔类型”我在做什么错了?

replaceAll()

2 个答案:

答案 0 :(得分:2)

扩展Alex的答案:您的问题是您将约束与约束生成混合在一起:在语句if ( PreReq[c][d] == 1 )中,operator==被重载以生成约束,该约束要求PreReq[c][d]接受约束。值1。因此,此表达式中的结果为IloConstraint类型,该类型不是布尔类型(而是约束对象)。这就是为什么您收到错误消息的原因。相反,您想要在模型中添加一个约束,这种约束在情况PreReq[c][d] is 1下需要附加约束。

所以您可能想要这样的东西:

for (d = 0; d < NumberOfCourses; d++) {
   for (s = 0; s < NumberOfSemesters; s++) {
      mod.add(IloIfThen(PreReq[c][d] == 1, constraint6a + X[d][s] <= constraint6b + X[c][s]));
      mod.add(IloIfThen(PreReq[c][d] == 0, constraint6a <= constraint6b));
   }
}

其中添加了约束的两个变体,其中只有一个会被激活(取决于PreReq[c][d]的值)。另请参见reference documentation of class IloIfThen

答案 1 :(得分:1)

您宁愿使用IloIfThen(逻辑约束)

CPLEX documentation中的示例:

IloIfThen(env, (x >= y && x >= z), IloNot(x <= 300 || y >= 700))