在给定等式约束的情况下,CPLEX拒绝找到解决方案

时间:2017-02-23 01:50:54

标签: optimization mathematical-optimization cplex

我遇到涉及连续和二进制变量的问题。完成创建目标函数后,我添加了导致CPLEX无法找到解决方案的约束。请让我知道我做错了什么。

IloNumExpr cbin1 = cplex.prod(EB_s[a-1],binHandelSprzedaj[a-1]);
cplex.addEq(EB[a],cbin1);

“binHandelSprzedaj”是二进制变量数组。 “EB_s”和“EB”是连续cplex浮点变量的数组。

代码工作如果不是“cbin1”我把“EB_s [a-1]”或“binHandelSprzedaj [a-1]”。我认为这是因为我最终得到了二次约束。然而,CPLEX之一提供的示例“QCPex1”提供了具有“不太相等”的二次约束的解决方案,并且代码看起来与我所写的非常相似。我不明白为什么我的代码不起作用。是因为约束是二次的,还是因为它是二元和连续变量的混合,或者它是“相等”类型的约束。

收到错误消息:CPLEX错误5002:目标中的Q不是正半正确的

我是优化的大菜鸟。我该如何处理这个问题?我更喜欢CPLEX为我做尽可能多的数学运算(也许你可以建议一些神奇的命令)。

它的最终形式中的约束更加复杂,因此简单的变量松弛(如此处所示http://orinanobworld.blogspot.com/2010/10/binary-variables-and-quadratic-terms.html)将不起作用。完全定义的问题中的约束看起来像这样:

a = b + c + d +二进制* f - (1-二进制)* g

其中a - g是连续变量。

任何帮助都将深受赞赏。

1 个答案:

答案 0 :(得分:0)

Cplex可以处理凸MIQP(二次目标)和MIQCP(二次约束)问题。它还可以处理非凸MIQP(通过参数SolutionTarget)。我们留下了二次约束的非凸问题,它无法处理。

幸运的是,我们总是能够线性化二元和连续变量的乘积。对Paul Rubin的博客的引用实际上是有效的。 (Here是另一个食谱)。

为此替换你的:

 a = b + c + d + binary * f - (1-binary)*g

通过

 a = b + c + d + binary * f - g + z
 z = binary*g

其中z是另一个连续变量。等式

 z = binary*g

可以直接线性化。