Python QP 求解器

系列文章目录


前言

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

$\begin{aligned} &\mathrm{minimize} \dfrac12x^TPx+q^Tx \\ &\text{subject to} Gx\leq h \\ &Ax=b \\ &lb\leq x\leq ub \end{aligned}$

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

        对偶乘法器:还有一个 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

三、求解器

SolverKeywordAlgorithmAPILicenseWarm-start
ClarabelclarabelInterior pointSparseApache-2.0✖️
CVXOPTcvxoptInterior pointDenseGPL-3.0✔️
DAQPdaqpActive setDenseMIT✖️
ECOSecosInterior pointSparseGPL-3.0✖️
GurobigurobiInterior pointSparseCommercial✖️
HiGHShighsActive setSparseMIT✖️
HPIPMhpipmInterior pointDenseBSD-2-Clause✔️
MOSEKmosekInterior pointSparseCommercial✔️
NPPronpproActive setDenseCommercial✔️
OSQPosqpAugmented LagrangianSparseApache-2.0✔️
PIQPpiqpProximal Interior PointDense & SparseBSD-2-Clause✖️
ProxQPproxqpAugmented LagrangianDense & SparseBSD-2-Clause✔️
QPALMqpalmAugmented LagrangianSparseLGPL-3.0✔️
qpOASESqpoasesActive setDenseLGPL-2.1
qpSWIFTqpswiftInterior pointSparseGPL-3.0✖️
quadprogquadprogActive setDenseGPL-2.0✖️
SCSscsAugmented LagrangianSparseMIT✔️

        密集求解器的矩阵参数是 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}
}


  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python求解二次规划(cvxopt)是使用cvxopt库中的函数来实现的。将二次规划问题转化为标准的凸优化问题,然后通过cvxopt库中的函数来求解得到问题的最优解。 首先,需要安装cvxopt库,可以使用pip install cvxopt命令进行安装。 在Python中,可以使用cvxopt库中的matrix和solvers来定义和求解二次规划问题。 首先,通过导入cvxopt库,可以使用matrix函数来定义二次规划问题的数据。matrix函数可以将数组转化为cvxopt库中的矩阵形式。 接下来,利用cvxopt库中的solvers函数来求解二次规划问题。solvers.qp函数是用于求解凸二次规划问题的主要函数。在函数中需要提供二次规划问题的参数,如目标函数的系数,不等式约束的系数矩阵以及约束条件。 最后,使用solve函数来解决二次规划问题,并返回最优解。 例如,下面是一个使用cvxopt库求解二次规划问题的例子: ```python from cvxopt import matrix, solvers # 定义二次规划问题的参数 P = matrix([[1.0, 0.0], [0.0, 1.0]]) q = matrix([-2.0, -3.0]) G = matrix([[-1.0, 0.0], [0.0, -1.0]]) h = matrix([0.0, 0.0]) A = matrix([[1.0, 1.0]]) b = matrix([1.0]) # 求解二次规划问题 sol = solvers.qp(P, q, G, h, A, b) # 输出最优解 print(sol['x']) ``` 这段代码会输出二次规划问题的最优解。其中,P、q、G、h、A、b分别代表二次规划问题的目标函数系数、不等式约束的系数矩阵以及约束条件。 这就是使用cvxopt库中的函数来求解二次规划问题的基本步骤。可以根据具体的问题进行相应的调整和设置参数,求解出问题的最优解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值