Cplex If-then 二进制约束未更新



我是 cplex 的新手,我正在尝试通过在约束中创建二进制变量来优化 x 的函数,例如:

如果 x[i]> 0,则 y[i] = 1,或者如果 x[i] = 0,

则 y[i] = 0

然后约束是 y

我通过将每个 y 相加创建了一个表达式,该表达式后来与上限和下限一起在约束中使用。

IloNumVar[] y = cplex.numVarArray(size, 0, 1);
IloLinearNumExpr expr = cplex.linearNumExpr();
for (int k = 0; k < size; k++) {
      cplex.ifThen(cplex.ge(x[k], 1), cplex.eq(y[k], 1));
      cplex.ifThen(cplex.eq(x[k], 0), cplex.eq(y[k], 0));
      expr.addTerm(1, y[k]);
      }
cplex.addLe(expr,ub);
cplex.addGe(expr,lb);

.lp 给了我适当的约束,但在解决它时并没有更新 y 值,这就是为什么结果没有意义的原因。我想知道是否有办法。我尝试做cplex.addTerm(cplex(ifThen...((,但它不接受约束作为输入。提前谢谢。

您的状况格式不正确。你有

  cplex.ifThen(cplex.ge(x[k], 0), cplex.eq(y[k], 1));
  cplex.ifThen(cplex.eq(x[k], 0), cplex.eq(y[k], 0));

第一种情况是x[k] >= 0,第二种情况是x[k] == 0。因此,x[k] == 0的情况是模棱两可的。如果x[k]是整数,则在第一种情况下使用>= 1,否则使用适当的 epsilon。

此外,您没有将这些约束添加到模型中(所以我不清楚如何在 .lp 中看到它们(。只需调用cplex.ifThen()构造约束。您仍然需要添加它们:

  cplex.add(cplex.ifThen(cplex.ge(x[k], 0), cplex.eq(y[k], 1)));
  cplex.add(cplex.ifThen(cplex.eq(x[k], 0), cplex.eq(y[k], 0)));

评论后编辑:如果你想在 if-then 约束的 "then" 部分有一个更复杂的表达式,你可以像往常一样构建更复杂的表达式:

IloLinearNumExpr sum = cplex.linearNumExpr();
for (int k : ...) sum.addTerm(y[k], 1.0);
cplex.add(cplex.ifThen(cplex.ge(x[k], 0), cplex.eq(sum, 1)));

这将添加一个约束"如果 x[k]>= 0,则 y[k] 的总和必须为 1"。

最新更新