系列文章目录
前言
该 Python 库提供一站式 solve_qp 函数,用于求解凸二次规划:
向量不等式逐个坐标应用。函数返回后端 QP 求解器找到的初等解 ,如果求解失败/问题不可行,则返回 None。所有求解器都要求问题是凸的,这意味着矩阵 应该是半正定的。有些求解器还要求问题是严格凸的,这意味着 应该是正定的。
对偶乘法器:还有一个 solve_problem 函数,它不仅能返回初等解,还能返回其对偶乘法器和后端求解器计算的所有其他相关量。
一、示例
要求解二次规划,请构建定义该二次规划的矩阵,然后调用 solve_qp,并通过求解器关键字参数选择后端 QP 求解器:
import numpy as np
from qpsolvers import solve_qpM = np.array([[1.0, 2.0, 0.0], [-8.0, 3.0, 2.0], [0.0, 1.0, 1.0]])
P = M.T @ M # this is a positive definite matrix
q = np.array([3.0, 2.0, 3.0]) @ M
G = np.array([[1.0, 2.0, 1.0], [2.0, 0.0, 1.0], [-1.0, 2.0, -1.0]])
h = np.array([3.0, 2.0, -2.0])
A = np.array([1.0, 1.0, 1.0])
b = np.array([1.0])x = solve_qp(P, q, G, h, A, b, solver="proxqp")
print(f"QP solution: {x = }")
本例输出解 [0.30769231,-0.69230769,1.38461538]。如本例所示,也可以在解中得到对偶乘数。
二、安装
2.1 PyPI
安装带有开源 QP 求解器的库:
pip install qpsolvers[open_source_solvers]
这种一刀切的安装方式可能无法在所有系统上立即运行(例如,如果求解器试图从源代码编译)。如果遇到任何问题,请查看以下变体:
- pip install qpsolvers[wheels_only] 只安装预编译二进制文件的求解器、
- pip install qpsolvers[clarabel,daqp,proxqp,scs](例如)将安装列出的 QP 求解器、
- pip install qpsolvers 只安装库本身。
导入后,qpsolvers 会加载所有能找到的求解器,并在 qpsolvers.available_solvers 中列出。
2.2 Conda
conda install -c conda-forge qpsolvers
三、求解器
Solver | Keyword | Algorithm | API | License | Warm-start |
---|---|---|---|---|---|
Clarabel | clarabel | Interior point | Sparse | Apache-2.0 | ✖️ |
CVXOPT | cvxopt | Interior point | Dense | GPL-3.0 | ✔️ |
DAQP | daqp | Active set | Dense | MIT | ✖️ |
ECOS | ecos | Interior point | Sparse | GPL-3.0 | ✖️ |
Gurobi | gurobi | Interior point | Sparse | Commercial | ✖️ |
HiGHS | highs | Active set | Sparse | MIT | ✖️ |
HPIPM | hpipm | Interior point | Dense | BSD-2-Clause | ✔️ |
MOSEK | mosek | Interior point | Sparse | Commercial | ✔️ |
NPPro | nppro | Active set | Dense | Commercial | ✔️ |
OSQP | osqp | Augmented Lagrangian | Sparse | Apache-2.0 | ✔️ |
PIQP | piqp | Proximal Interior Point | Dense & Sparse | BSD-2-Clause | ✖️ |
ProxQP | proxqp | Augmented Lagrangian | Dense & Sparse | BSD-2-Clause | ✔️ |
QPALM | qpalm | Augmented Lagrangian | Sparse | LGPL-3.0 | ✔️ |
qpOASES | qpoases | Active set | Dense | LGPL-2.1 | ➖ |
qpSWIFT | qpswift | Interior point | Sparse | GPL-3.0 | ✖️ |
quadprog | quadprog | Active set | Dense | GPL-2.0 | ✖️ |
SCS | scs | Augmented Lagrangian | Sparse | MIT | ✔️ |
密集求解器的矩阵参数是 NumPy 数组,稀疏求解器的矩阵参数是 SciPy 压缩稀疏列 (CSC) 矩阵。
四、常见问题
- 我可以打印机器上可用的求解器列表吗?
- 可以求解最小二乘法而不是二次规划吗?
- 我的成本函数中有一个平方准则,如何将 QP 求解器应用于我的问题?
- 我有一个非凸二次规划,有求解器可以用吗?
- 我有二次等式约束条件,有求解器可以用吗?
- 错误: 在 Windows 上需要 Mircrosoft Visual C++ 14.0 或更高版本
- 能否像脊回归或 LASSO 那样添加惩罚项?
五、基准测试
下面的结果来自 qpbenchmark,它是 Python 中 QP 求解器的基准。在下表中,求解器以默认设置调用,并通过移位几何平均数(简称 "shm")对整个测试集进行比较。越低越好,1.0 代表最佳求解器。
5.1 马罗斯-梅萨罗斯(难题)
查看高精度和低精度求解器设置的完整报告。
5.2 马罗斯-梅萨罗斯密集问题(密集问题子集)
查看完整报告,了解高精度和低精度求解器设置。
六、引用 qpsolvers
如果你觉得这个项目有用,请考虑给它一个 ⭐ 或者如果你的工作是科学性的,请引用它:
@software{qpsolvers2024,
author = {Caron, Stéphane and Arnström, Daniel and Bonagiri, Suraj and Dechaume, Antoine and Flowers, Nikolai and Heins, Adam and Ishikawa, Takuma and Kenefake, Dustin and Mazzamuto, Giacomo and Meoli, Donato and O'Donoghue, Brendan and Oppenheimer, Adam A. and Pandala, Abhishek and Quiroz Omaña, Juan José and Rontsis, Nikitas and Shah, Paarth and St-Jean, Samuel and Vitucci, Nicola and Wolfers, Soeren and Yang, Fengyu and @bdelhaisse and @MeindertHH and @rimaddo and @urob and @shaoanlu},
license = {LGPL-3.0},
month = mar,
title = {{qpsolvers: Quadratic Programming Solvers in Python}},
url = {https://github.com/qpsolvers/qpsolvers},
version = {4.3.2},
year = {2024}
}