相关文章推荐
乐观的松球  ·  .Net ...·  1 年前    · 
爱逃课的牛排  ·  数据库 - ...·  1 年前    · 

CPLEX C++学习笔记(3) - 二次约束 (QCP) 问题求解

6 个月前

原文 [1]


1. 识别二次约束规划

该章节定义CPLEX可求解的二次约束规划的类型.

1.1. 二次约束规划的特征

区别QCP的特征是: 二次项可能出现在问题的一个或多个约束中. 但 此类问题的目标函数可能包含也可能不包含二次项. 因此QCP的最一般形式如下:

Minimize \frac{1}{2} x^T Q x + c^T x

subject to Ax \sim b

with these bounds l \leq x \leq u

符号 \sim 可以是等于, 小于等于, 大于等于, 甚至是范围约束的任意组合. l u 分别表示上下限. Q 是目标函数系数的矩阵. 也就是说, 元素 Q_{jj} 是二次项 x_j^2 的系数, 元素 Q_{ij} Q_{ji} 加在一起作为项 x_i x_j 的系数. CPLEX区分下面两种 Q 矩阵:

  • 在可分离问题中, 仅有矩阵的对角项被定义了, 所有的非对角项都为0.
  • 在不可分离的问题中, 矩阵中至少一个有一个非对角项为非零值.

CPLEX可以求解有着 凸二次目标函数的 最小化 问题. 同样, 它可以求解有着 凹二次目标函数 的 最大化 问题. 对于最小化和最大化, 所有线性目标函数都满足这一属性. 但是对于二次目标函数并非总是如此.

CPLEX也可以计算局部最优点, 也就是满足具有任意二次目标函数的模型的 一阶最优条件 (也就是局部最优) . 这些模型包括有着凹目标函数的最小化问题, 有着凸目标函数的最大化问题, 以及有着既不凸也不凹的目标函数最小化或者最大化问题. 这样的点也许不是模型的全局最优解.

连接目标函数上任意两点的连续线段不会低于最小化问题的目标; 同理, 该线段不会高于最大化问题的目标. 如下图所示:

更正式地说, 二次目标函数是凸还是凹的问题等价于矩阵 Q 是正半定还是负半定的问题. 对于凸QPs, Q 必须是正半定(也就是对于每个向量 x 都满足 x^T Q x \geq 0 ). 对于凹最大化问题, 要求 Q 必须是负半定 (也就是对于每个向量 x 都满足 x^T Q x \leq 0 ).

对于可分离函数, 要确定问题的凸性, 检查矩阵 Q 的各个对角元素是否有正确符号来保证其正或负半定 就已足够. 对于不可分离函数, 事先确定 Q 的凸性可能不太容易, 但CPLEX会在优化的前期检测这一属性. 默认情况下, 当CPLEX发现QP中的二次目标项为 非半正定 时终止.

作为一个二次目标函数, 凸性对二次约束至关重要. 每一项约束都必须定义一个凸域. 为确保凸性, CPLEX 要求每个 P_i 矩阵都为正半定, 或者 约束可以被转换为 二阶锥 (second order cone) .

1.2. 凸性

不等式 x^2 + y^2 \leq 1 是凸的. 下图显示了不等式的图形:

如果将 a b 视作该约束的域中的任意值, 不难发现, 它们之间的任何连续线段都完全包含在该域中.

而不等式 x^2 + y^2 \geq 1 是凹的. 下图显示了不等式的图形:

显然, cd的连续线段可能会经过此约束的域的外部. 同理, x^2 + y^2 = 1 也是非凸的.

1.3. 半定性

根据章节1.1的说明, 为保证凸性, 每项约束中的二次矩阵都必须为正半定. 对于每个向量 x , 无论 x 是否可行, 如果满足 x^T Q_i x \geq 0 , 则矩阵 Q_i 为正半定.

1.4. 二阶锥规划 (SOCP) 和 非半正定

半正定需求有一个例外情况: 有一种额外的二次约束, 该约束未被包含在章节1.1的一般形式中. 技术上来说, barrier优化器求解的二次约束问题是一个 二阶锥规划(SOCP). CPLEX可以通过其预处理功能来执行转换到SCOP, 并返回原始formulation的解. 如果约束可以转换为下面的凸二阶锥约束, 那么barrier优化器将接受该约束以求解:

-c_0 x_0^2 + \sum c_i x_i^2 \leq 0

CPLEX自动换这些类型的二次约束至二阶锥约束:

x^T Q x \leq y^2 , 其中 y \geq 0 Q 为正半定

x^T Q x \leq y z , 其中 y \geq 0, z \geq 0 Q 为正半定

注意, 当 Q 为单位矩阵时, 这个formulation被称为旋转锥.

1.5. 以拉格朗日表示SOCP

SOCP是特殊的因为任意QCP都可以被转换成等价的SOCP. CPLEX利用这一等价性来返回更多信息, 例如对偶值, 和缩减代价. 一个SOCP是一个优化问题, 其中 x_i 是一对对不相交的向量 x_i = (x_{i, 1}, ..., x_{i, i_n}) :

min c_1^T x_1 + ... + c_r^T x_r

s.t. A_1 x_1 + ... + A_r x_r = b

x_i \succeq 0

其中对变量 x_i 的二阶锥约束定义如下:

x_i \succeq 0 \quad \Longleftrightarrow \quad x_{i, 1} \geq ||(x_{i, 2}, ..., x_{i, n_i})||

|| \cdot || 表示向量的欧几里得范数. 且当 n_i = 1 时, x_i \succeq 0 将缩减至 x_{i,1} \succeq 0 的形式. 也就是说, 一个二阶锥约束, 如下不等式:

x_{i, 1} \geq ||(x_{i, 2}, ..., x_{i, n_i})||

等价于这两个约束:

-x_{i, 1}^2 + \sum_{k = 2}^{n_i} x_{i,k}^2 \leq 0

x_{i, 1} \geq 0

有了二阶锥约束的标准形式, 我们可以指定目标函数, 以及SOCP的线性约束. 然后, 还可以为模型中的每个二阶锥约束另外指定上述两个相等的约束.

为了阐明指定 SOCP 的过程,我们考虑以下模型:

min x_1 + x_2 + x_3 + x_4 + x_5 + x_6

s.t. x_1 + x_2 + x_5 = 8

x_3 + x_5 + x_6 = 10

(x_1, x_2, x_3) \geq 0

(x_4, x_5) \geq 0

(x_6) \geq 0

上面的模型中有两个普通的线性约束:

x_1 + x_2 + x_5 = 8

x_3 + x_5 + x_6 = 10

乍看之下, 似乎有三个要考虑的二阶锥:

(x_1, x_2, x_3) \geq 0

(x_4, x_5) \geq 0

(x_6) \geq 0

根据过程, 必须对模型中的每个二阶锥约束指定两个等同的约束. 对于第一个二阶锥, 考虑 x_1 \geq ||(x_2, x_3)|| , 则会产生如下约束:

-x_1^2 + x_2^2 + x_3^2 ≤ 0 x_1 ≥ 0

同样地, 根据这一过程, 考虑第二个二阶锥:

-x_4^2 + x_5^2 \leq 0 x_4 \geq 0

第三个二阶锥仅有一个变量, 这意味着 x_6 有下限0. 最终结果如下所示:

Minimize
   obj: x1 + x2 + x3 + x4 + x5 + x6
Subject To
    c1: x1 + x2 +           x5      = 8
    c2:           x3 +      x5 + x6 = 10
    q1: [ -x1^2 + x2^2 + x3^2 ] <= 0
    q2: [ -x4^2 + x5^2 ] <= 0
Bounds
    0 <= x1