二次规划(Quadratic Programming, QP) 是一种优化问题,其目标函数是二次函数,约束条件是线性函数。二次规划问题的一般形式如下:

min ⁡ x 1 2 x T Q x + c T x \min_{x} \quad \frac{1}{2} x^T Q x + c^T x xmin21xTQx+cTx
subject to A x ≤ b \text{subject to} \quad A x \leq b subject toAxb
A eq x = b eq \quad \quad \quad \quad \quad A_{\text{eq}} x = b_{\text{eq}} Aeqx=beq
x min ≤ x ≤ x max \quad \quad \quad \quad \quad x_{\text{min}} \leq x \leq x_{\text{max}} xminxxmax

其中:

  • ( x ) (x) (x) 是优化变量(向量)。
  • ( Q ) (Q) (Q) 是一个对称矩阵(通常为正定或半正定)。
  • ( c ) (c) (c) 是线性项的系数向量。
  • ( A ) (A) (A) 和 (b) $是不等式约束的矩阵和向量。
  • ( A eq ) (A_{\text{eq}}) (Aeq) ( b eq ) (b_{\text{eq}}) (beq) 是等式约束的矩阵和向量。
  • ( x min ) (x_{\text{min}}) (xmin) ( x max ) (x_{\text{max}}) (xmax) 是变量的上下界。

1. 求解二次规划问题的步骤

(1)问题标准化

将问题转化为标准形式:
min ⁡ x 1 2 x T Q x + c T x \min_{x} \quad \frac{1}{2} x^T Q x + c^T x xmin21xTQx+cTx
subject to A x ≤ b \text{subject to} \quad A x \leq b subject toAxb
A eq x = b eq \quad \quad \quad \quad \quad A_{\text{eq}} x = b_{\text{eq}} Aeqx=beq

(2)选择求解方法

根据问题的规模和性质,选择合适的求解方法:

  • 小型问题:解析法或通用求解器。
  • 大型问题:迭代法或专用求解器。
(3)调用求解器

使用现有的优化工具包或库(如 MATLAB、Python 的 cvxoptquadprog)求解。

(4)验证结果

检查解是否满足约束条件,并验证目标函数值。


2. 求解方法

(1)解析法

对于无约束的二次规划问题,最优解可以通过求解线性方程组得到:
∇ f ( x ) = Q x + c = 0    ⟹    x ∗ = − Q − 1 c \nabla f(x) = Q x + c = 0 \implies x^* = -Q^{-1} c f(x)=Qx+c=0x=Q1c

(2)拉格朗日乘子法

对于有约束的二次规划问题,可以通过拉格朗日乘子法将问题转化为无约束问题:
L ( x , λ ) = 1 2 x T Q x + c T x + λ T ( A x − b ) \mathcal{L}(x, \lambda) = \frac{1}{2} x^T Q x + c^T x + \lambda^T (A x - b) L(x,λ)=21xTQx+cTx+λT(Axb)
然后求解 KKT 条件(Karush-Kuhn-Tucker 条件):
∇ x L = Q x + c + A T λ = 0 \nabla_x \mathcal{L} = Q x + c + A^T \lambda = 0 xL=Qx+c+ATλ=0
A x ≤ b , λ ≥ 0 , λ T ( A x − b ) = 0 A x \leq b, \quad \lambda \geq 0, \quad \lambda^T (A x - b) = 0 Axb,λ0,λT(Axb)=0

(3)内点法

内点法是一种迭代算法,通过在可行域内寻找路径逼近最优解。它适用于大规模问题。

(4)有效集法

有效集法通过识别活动约束(即等式约束和紧的不等式约束)来简化问题,适用于中小规模问题。

(5)梯度投影法

梯度投影法通过将梯度方向投影到可行域上来更新解,适用于简单约束问题。


3. 常用工具包

(1)MATLAB

MATLAB 提供了 quadprog 函数,可以直接求解二次规划问题:

x = quadprog(Q, c, A, b, Aeq, beq, lb, ub);
(2)Python
  • cvxopt
    from cvxopt import matrix, solvers
    Q = matrix(Q)  # 二次项矩阵
    c = matrix(c)  # 线性项向量
    G = matrix(A)  # 不等式约束矩阵
    h = matrix(b)  # 不等式约束向量
    sol = solvers.qp(Q, c, G, h)
    x = sol['x']
    
  • quadprog
    from quadprog import solve_qp
    x, fval, _, _, _ = solve_qp(Q, c, A, b, Aeq, beq)
    
(3)C++
  • Eigen:结合 Eigen 库和二次规划求解器(如 qpOASES):
    #include <qpOASES.hpp>
    qpOASES::QProblem qp(nVars, nConstraints);
    qp.init(Q.data(), c.data(), A.data(), lb.data(), ub.data(), lbA.data(), ubA.data());
    qp.getPrimalSolution(x.data());
    

4. 示例

问题描述

求解以下二次规划问题:
min ⁡ x 1 2 x 1 2 + x 2 2 + x 1 x 2 − 2 x 1 − 3 x 2 \min_{x} \quad \frac{1}{2} x_1^2 + x_2^2 + x_1 x_2 - 2 x_1 - 3 x_2 xmin21x12+x22+x1x22x13x2
subject to x 1 + x 2 ≤ 1 \text{subject to} \quad x_1 + x_2 \leq 1 subject tox1+x21
x 1 ≥ 0 , x 2 ≥ 0 \quad \quad \quad \quad \quad x_1 \geq 0, \quad x_2 \geq 0 x10,x20

标准化形式
  • 目标函数:
    Q = [ 1 0.5 0.5 2 ] , c = [ − 2 − 3 ] Q = \begin{bmatrix} 1 & 0.5 \\ 0.5 & 2 \end{bmatrix}, \quad c = \begin{bmatrix} -2 \\ -3 \end{bmatrix} Q=[10.50.52],c=[23]
  • 约束条件:
    A = [ 1 1 ] , b = [ 1 ] A = \begin{bmatrix} 1 & 1 \end{bmatrix}, \quad b = \begin{bmatrix} 1 \end{bmatrix} A=[11],b=[1]
    x min = [ 0 0 ] x_{\text{min}} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} xmin=[00]
Python 实现
from cvxopt import matrix, solvers

# 定义矩阵和向量
Q = matrix([[1.0, 0.5], [0.5, 2.0]])
c = matrix([-2.0, -3.0])
G = matrix([[1.0, 1.0], [-1.0, 0.0], [0.0, -1.0]])
h = matrix([1.0, 0.0, 0.0])

# 求解
sol = solvers.qp(Q, c, G, h)
x = sol['x']
print("Optimal solution:", x)
输出
Optimal solution: [ 0.50, 0.50 ]

5. 总结

  • 二次规划问题的求解方法包括解析法、拉格朗日乘子法、内点法、有效集法等。
  • 可以使用 MATLAB、Python、C++ 等工具包快速求解。
  • 在实际应用中,选择合适的求解方法和工具包是关键。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐