2017-02-23 42 views
0

我有一个涉及连续变量和二元变量的问题。完成创建目标函数后,我添加了导致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

其中 - 克是连续变量。

任何帮助将深表谢意。

回答

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 

可以直接线性化。

+0

谢谢,到目前为止工作:) – t4u

相关问题