我遇到涉及连续和二进制变量的问题。完成创建目标函数后,我添加了导致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是连续变量。
任何帮助都将深受赞赏。
答案 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
可以直接线性化。