这是我的Cplex代码的一部分。我将PreReq定义为布尔变量,但是在约束条件下,我得到了PreReq的错误,即“表达式必须具有布尔类型”我在做什么错了?
replaceAll()
答案 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))