例如:(6-z)(x1+x2+x3)<40。z 是一个正整数变量。x1,x2 和 x3 都是实变量。那么如何判断函数是凸函数还是非凸函数。
1 回答
这实际上是一个比人们想象的更复杂的问题。
这不是一个函数,而是一个约束。
约束不应该有一个<,而应该有一个<=。
凸约束的一种定义
f(x) <= c
是f(lambda*x1+(1-lambda)*x2) <= lambda*f(x1)+(1-lambda)*f(x2)
对所有x1,x2,0<lambda<1
. (严格凸性需要 < 而不是 <=)通常更容易证明二阶导数矩阵(Hessian)对于所有 x 都是对称的和半正定的。
对于二次约束,就像在您的示例中一样,形成约束
x'Qx + a'x <= c
(这只是一个不同的符号)并证明Q
是半正定的。例如,通过查看特征值。另一种方法是尝试使用 CVXPY 解决问题。如果问题不是凸的,它会抱怨。
如果模型根据起点收敛到不同的解决方案(具有不同的目标值),则问题是非凸的。
我经常使用的另一个启发式方法:放入全局求解器(例如 Baron),检查日志,看看它是否进行任何分支。如果是这样,则问题是非凸的。
对于二次问题:把它扔给 Cplex 或 Gurobi,看看它是否抱怨非凸性。Gurobi 有一个解决非凸二次问题的选项(但它需要设置一个选项)。
对于某些问题类别,我们知道问题是否是凸的(熟悉这方面的文献)。
如果松弛是凸的(即忽略整数限制),则整数变量的约束是凸的。
具有整数/二进制变量的约束通常可以重新表述为一组线性不等式。