Java Cplex If then二进制约束不更新

Java Cplex If then二进制约束不更新,java,if-statement,cplex,Java,If Statement,Cplex,我是cplex的新手,我试图通过在约束中创建一个二进制变量来优化x的函数,以便: 如果x[i]>0那么y[i]=1或者如果x[i]=0那么y[i]=0 然后约束是y=0,第二种情况是x[k]==0。因此,x[k]==0的情况是不明确的。如果x[k]是整数,则在第一种情况下使用>=1,否则使用适当的ε 此外,您没有将这些约束添加到模型中,因此我不清楚您如何在.lp中看到它们。如果仅构造约束,则需要调用cplex.if。您仍然需要添加它们: cplex.add(cplex.ifThen(cple

我是cplex的新手,我试图通过在约束中创建一个二进制变量来优化x的函数,以便:

如果x[i]>0那么y[i]=1或者如果x[i]=0那么y[i]=0

然后约束是y<某个数的和。约束将按照我的要求创建,但在求解优化时y不会得到更新

我通过添加每个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。AddTermCPlexifth。。。但它不接受约束作为输入。提前感谢。

您的情况不正常。你有

  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,否则使用适当的ε

此外,您没有将这些约束添加到模型中,因此我不清楚您如何在.lp中看到它们。如果仅构造约束,则需要调用cplex.if。您仍然需要添加它们:

  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,这就增加了一个约束。

嗨,丹尼尔,我的第一部分不好。我已经改正了。关于第二部分,您推荐的代码只会将y[i]添加到约束中,但我希望将y[i]上的总和添加到约束中。谢谢。我之所以能在.lp中看到它,是因为我创建了一个ILOLinerNumexpr expr并添加了它。我添加了我的答案,使y[k]的和位于约束的then部分。