如何解决如何判断函数是非凸的还是凸的
例如:(6-z)(x1 + x2 + x3)<40。 z是一个正整数变量.x1,x2和x3都是实数变量。那么如何判断函数是凸函数还是非凸函数。
解决方法
这实际上是一个比人们预期的更为复杂的问题。
-
这不是函数,而是约束。
-
约束永远不应包含
-
凸约束
f(x) <= c
的一个定义是所有f(lambda*x1+(1-lambda)*x2) <= lambda*f(x1)+(1-lambda)*f(x2)
的{{1}}。 (严格凸度需要 -
通常容易的是证明对于所有x,二阶导数(Hessian)矩阵都是对称且正半定的。
-
对于二次约束,例如在您的示例中,形成约束
x1,x2,0<lambda<1
(这只是一种不同的表示法),并证明x'Qx + a'x <= c
是正半确定的。例如。通过查看特征值。 -
另一种方法是尝试使用CVXPY解决问题。如果问题不是凸面的,它将抱怨。
-
如果模型根据起点收敛到不同的解决方案(具有不同的目标值),则问题将是非凸的。
-
我经常使用的另一种启发式方法:放入诸如Baron之类的全局求解器,然后检查日志并查看它是否进行了分支。如果是这样,则说明问题不存在。
-
对于二次问题:将其扔到Cplex或Gurobi上,看看它是否抱怨非凸性。 Gurobi有一个选项可以解决非凸二次问题(但是需要设置一个选项)。
-
对于某些问题类别,我们知道问题是否是凸的(请对此问题熟悉文献)。
-
如果松弛为凸(即忽略整数限制),则具有整数变量的约束为凸。
-
具有整数/二进制变量的约束通常可以重新构造为一组线性不等式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。