【问题标题】:CPLEX Error 5002: %s is not convex - Least Square Problem with binary formulationCPLEX 错误 5002:%s 不是凸的 - 二进制公式的最小二乘问题
【发布时间】:2020-03-30 10:00:52
【问题描述】:

关于 SO 的第一篇文章。

我正在研究一个二次优化问题。
我收到以下错误:

Aeq = beq = sostype =sosind = soswt = [] % for my specific problem

其他参数看起来定义正确。

Error using cplexmiqp
CPLEX Error  5002: %s is not convex.
Error in MIP_CPLEX_OptL2_CstrL0 (line 78)
        [x,z,exitflag,output] = cplexmiqp(Hprim'*Hprim,(-y'*Hprim)',Aineq,bineq,Aeq,beq,sostype,sosind,soswt,lb,ub,ctype,z0,solveur);

我已经检查了矩阵的属性(它是半 PSD)。

只有大于 600 个变量的维度才会出现错误(连续和二进制 -> MIQP)。 低于此值,模型可以正常工作。

有人有什么想法吗?谢谢很多:)

【问题讨论】:

  • 欢迎来到stackoverflow。请编辑您的问题以包含minimal, reproducible, example
  • 矩阵Q=Hprim'*Hprim 不是半正定的(您可能需要打印带有更多小数的东西才能看到)。除了修复 Q,您还可以重新表述问题(参见 link 示例)。

标签: matlab mathematical-optimization cplex quadratic-programming


【解决方案1】:

正如错误消息所述,问题在于您的目标函数不是凸函数。默认情况下,CPLEX 仅处理二次规划中的凸目标函数。但是,您可以切换一些参数以使 CPLEX 接受(并求解)非凸目标函数。

您可以在CPLEX > User's Manual for CPLEX > Continuous optimization > Solving problems with a quadratic objective (QP)部分的用户手册中找到详细信息。

为了求解具有非凸二次目标的模型,您必须将参数 Cplex.Param.optimalitytarget 设置为 3(找到全局最优值)。

【讨论】:

  • 感谢您的回答。问题显然来自矩阵的定义,它必须是正定义的,而不是半定正的。奇怪的复杂条件!我研究稀疏近似,这实际上使我能够对子矩阵建立一个强有力的假设。我通过修改目标函数并在模型中添加等式约束找到了解决方案。 @DanielJunglas 再次感谢您的建议和回答:)
猜你喜欢
  • 2019-07-19
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
相关资源
最近更新 更多