如何判断函数是非凸的还是凸的

问题描述

例如:(6-z)(x1 + x2 + x3)<40。 z是一个正整数变量.x1,x2和x3都是实数变量。那么如何判断函数是凸函数还是非凸函数。

解决方法

这实际上是一个比人们预期的更为复杂的问题。

  1. 这不是函数,而是约束。

  2. 约束永远不应包含

  3. 凸约束f(x) <= c的一个定义是所有f(lambda*x1+(1-lambda)*x2) <= lambda*f(x1)+(1-lambda)*f(x2)的{​​{1}}。 (严格凸度需要

  4. 通常容易的是证明对于所有x,二阶导数(Hessian)矩阵都是对称且正半定的。

  5. 对于二次约束,例如在您的示例中,形成约束x1,x2,0<lambda<1(这只是一种不同的表示法),并证明x'Qx + a'x <= c是正半确定的。例如。通过查看特征值。

  6. 另一种方法是尝试使用CVXPY解决问题。如果问题不是凸面的,它将抱怨。

  7. 如果模型根据起点收敛到不同的解决方案(具有不同的目标值),则问题将是非凸的。

  8. 我经常使用的另一种启发式方法:放入诸如Baron之类的全局求解器,然后检查日志并查看它是否进行了分支。如果是这样,则说明问题不存在。

  9. 对于二次问题:将其扔到Cplex或Gurobi上,看看它是否抱怨非凸性。 Gurobi有一个选项可以解决非凸二次问题(但是需要设置一个选项)。

  10. 对于某些问题类别,我们知道问题是否是凸的(请对此问题熟悉文献)。

  11. 如果松弛为凸(即忽略整数限制),则具有整数变量的约束为凸。

  12. 具有整数/二进制变量的约束通常可以重新构造为一组线性不等式。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...