CPLEX Java 凸二次约束(如果 x 非负,则仅 PSD)

CPLEX Java Convex Quadratic Constraint (only PSD if x non-negative)

我有一个变量 ea 的二次问题,它们都是非负的。我有一个约束,上面写着

a <= e (1 - a). 

变换后,矩阵 Q 为 [[0,-1][0,0]],对于任意 a 和 e 显然既不是正半定也不是负半定。但是,对于非负的 e 和 a,它是半负定的(或者当带到左侧时是半正定的)。因此,这应该按照https://www.ibm.com/support/knowledgecenter/en/SSSA5P_12.8.0/ilog.odms.cplex.help/refcallablelibrary/macros/CPXERR_Q_NOT_POS_DEF.html来解决。但是,我仍然收到错误 5002 Q in ''q1'' is not positive semi-definite.

我发现对于所有向量 x,Q 必须是半定的,无论它们的可行性如何 (https://www.ibm.com/support/knowledgecenter/en/SSSA5P_12.8.0/ilog.odms.cplex.help/CPLEX/UsrMan/topics/cont_optim/qp/02_convexity_defn.html),但我希望有一些方法可以解决这个问题...... 是否有变通方法来获得此 运行?

一些评论: 我创建了 a 和 e 如下:

e = cplex.numVar(0, Double.MAX_VALUE);
a = cplex.numVar(0, 1);

约束添加为

 IloLQNumExpr constr = cplex.lqNumExpr();
 constr.addTerm(1.0, e, a);
 constr.addTerm(-1.0, e);
 constr.addTerm(1, a);
 cplex.addLe(constr,0);

无论我使用什么objective,我都会遇到这个问题,我尝试了最小值、最大值、线性对象、二次对象...

非常感谢您!

在 cplex 中,我们进行了一些转换,将二次约束转换为标准的二阶锥。这些转换并没有涵盖所有的可能性,恰好也没有涵盖这个。

但是,如果您按如下方式建模,它将起作用:

x^2 - y*z <= 0
x = 1
y + a = 1
z - e = 1