如何在 Python 中有效地解决具有“动态”约束的 QCQP?

计算科学 Python 凸优化 qcqp
2021-12-13 08:19:49

我想用 Python 解决一个 QCQP。这是一个金融问题:在给定一些线性约束和一个将其变成 QCQP 的二次约束的情况下最大化回报(线性函数)。正式地,

maximizecTxsubject toxTΣxσ2Axb

矩阵Σ称为协方差矩阵,是一个对称的半正定矩阵。然而,矩阵A不需要。A我们有类型的约束来限制子集的总和x, 喜欢

jJaijxjbi

在哪里J{1,,n}n表示尺寸x.

我想解决这个是Python。有哪些可靠的软件包可以实现这一目标?重要的是它应该很容易解决通用问题A,即我不知道其维度(有多少约束)的先验。对于凸问题,我使用cvxopt了 which 就像这种“动态”约束的魅力。

A下面给出了两行的示例:

    temp = np.asarray([[-0.02  , -0.025 , -0.0275, -0.0325, -0.035 , -0.0525, -0.05  ,
            -0.025 , -0.0525, -0.0625, -0.0525, -0.055 , -0.0675, -0.0625,
            -0.08  , -0.08  , -0.06  , -0.0725, -0.0625, -0.0425, -0.0375],
           [-1.    , -0.    , -0.    , -0.    , -0.    , -0.    , -0.    ,
            -0.    , -0.    , -0.    , -0.    , -0.    , -0.    , -0.    ,
            -0.    , -0.    , -0.    , -0.    , -0.    , -0.    , -0.    ]])

and the vector `b`

    In [367]: b = np.asarray([[-0.02],[0.]])
    Out[367]: 
    array([[-0.02],
           [ 0.  ]])
1个回答

为了使 QCQP 是凸的,二次项需要是凸的。线性项总是凸的。

关于您的具体问题,目标函数是凸的,因为它是线性的。二次不等式约束是凸的,因为是对称的半正定 (psd)。所有线性等式和不等式约束都是凸的,无论所涉及的矩阵如何(它甚至可能是正方形,在这种情况下它不能是对称的或 psd)。Σ

所以你的问题是凸QCQP。无论您是否这样输入,建模系统的 cvx“家族”通常将 QCQP 重新表述为二阶锥问题 (SOCP),并将它们提交给求解器。在你的情况下,让的上三角 Choelsky 因子,使得,然后你的二次约束是,它与 cvxopt 中 SOCP 约束的形式匹配为显示在http://cvxopt.org/userguide/coneprog.html#second-order-cone-programming或者您可以通过 cvxpy 调用 cvxopt ,这是一个更高级别且更易于使用的建模接口。CΣCTC=ΣCx2σ