Python QP 求解器

简介: Python QP 求解器

系列文章目录


前言

       该 Python 库提供一站式 solve_qp 函数,用于求解凸二次规划:

       向量不等式逐个坐标应用。函数返回后端 QP 求解器找到的初等解 ,如果求解失败/问题不可行,则返回 None。所有求解器都要求问题是凸的,这意味着矩阵 应该是半正定的。有些求解器还要求问题是严格凸的,这意味着 应该是正定的。

       对偶乘法器:还有一个 solve_problem 函数,它不仅能返回初等解,还能返回其对偶乘法器和后端求解器计算的所有其他相关量。


一、示例

       要求解二次规划,请构建定义该二次规划的矩阵,然后调用 solve_qp,并通过求解器关键字参数选择后端 QP 求解器:

import numpy as np
from qpsolvers import solve_qp
M = 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}

}



目录
相关文章
|
4月前
|
机器学习/深度学习 算法 Python
傅里叶变换算法和Python代码实现
傅立叶变换是物理学家、数学家、工程师和计算机科学家常用的最有用的工具之一。本篇文章我们将使用Python来实现一个连续函数的傅立叶变换。
73 8
|
4月前
|
人工智能 机器人 测试技术
【python】python求解矩阵的转置(详细讲解)
【python】python求解矩阵的转置(详细讲解)
|
4天前
|
Python
Python 练习实例44 - Python 两个矩阵相加
Python 练习实例44 - Python 两个矩阵相加
|
4月前
|
Python
用Python的Numpy求解线性方程组
用Python的Numpy求解线性方程组
|
4月前
|
机器学习/深度学习 Python
599: 拉丁方阵(python)
599: 拉丁方阵(python)
|
4月前
|
算法 计算机视觉 Python
python 插值算法
最近在做时间序列预测时,在突增或者突降的变化剧烈的情况下,拟合参数的效果不好,有用到插值的算法补全一些数据来平滑剧烈变化过程。还有在图像处理中,也经常有用到插值算法来改变图像的大小,在图像超分(Image Super-Resolution)中上采样也有插值的身影【2月更文挑战第8天】
67 2
|
4月前
|
Python
Python 高斯消元的实现
Python 高斯消元的实现
|
4月前
|
机器学习/深度学习 人工智能 BI
Python计算余弦相似度
Python计算余弦相似度
|
Python
Python: 1017 A除以B
Python: 1017 A除以B
52 0
|
10月前
|
索引 Python
Python中的序列
Python中的序列
57 1