gpt4 book ai didi

java - CPLEX If-then 二元约束不更新

转载 作者:行者123 更新时间:2023-12-02 09:39:53 28 4
gpt4 key购买 nike

我是 cplex 的新人,我正在尝试通过在约束中创建一个二进制变量来优化 x 的函数,这样:

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

然后约束是 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.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”。

关于java - CPLEX If-then 二元约束不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57181547/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com