我想使用 java 将这个约束添加到 cplex 中的 ILP 中。
u_jk >= (u_ik + d_i + t_ij)x_ijk
IloLinearNumExpr right = cplex.linearNumExpr();
right.addTerm(serviceDuration , x[i][j][k]);
right.addTerm(time[i][j], x[i][j][k]);
right.addTerm(u[i][k], x[i][j][k]);
cplex.addGe(u[j][k], right);
在第四行我遇到了问题,因为 u[i][k] 和 x[i][j][k] 是 IloNumVar。任何想法,如何让它发挥作用?
最佳答案
这是因为如果 u 和 x 都是变量,则 u*x 不是线性的。要使用 Ilog Concert 创建二次表达式,您需要使用 IloQuadNumExpr 。然而,一旦解决了这个问题,您就会遇到这样的问题:没有平方项(对角线上为零)的二次表达式既不是凸的也不是凹的,因此无法用 cplex 求解。如果 u 或 x 是二进制的,则可以使用前面 question 中描述的转换。 .
关于java - 具有 2 个变量的 CPLEX 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569523/