[英]Quadratic Programming in Python using Numpy?
我正在将一些 MATLAB 代码翻译成 Python。有一行给我带来了一些麻烦:
[q,f_dummy,exitflag, output] = quadprog(H,f,-A,zeros(p*N,1),E,qm,[],[],q0,options);
查阅了MATLAB中的文档,发现quadprog function是用于优化(特别是最小化)的。
我试图在 Python(使用 numpy)中找到类似的 function,但似乎没有。
有没有更好的办法把这行代码翻译成Python呢? 或者有没有其他的包可以用? 我是否需要制作一个新的 function 来完成相同的任务?
感谢您的时间和帮助!
有一个名为CVXOPT的库,其中包含二次规划。
def quadprog_solve_qp(P, q, G=None, h=None, A=None, b=None):
qp_G = .5 * (P + P.T) # make sure P is symmetric
qp_a = -q
if A is not None:
qp_C = -numpy.vstack([A, G]).T
qp_b = -numpy.hstack([b, h])
meq = A.shape[0]
else: # no equality constraint
qp_C = -G.T
qp_b = -h
meq = 0
return quadprog.solve_qp(qp_G, qp_a, qp_C, qp_b, meq)[0]
OSQP是一个基于 ADMM 的专门的免费 QP 求解器。 我已经针对您的问题调整了qpsolvers 存储库中的OSQP 文档演示和 OSQP 调用。
请注意,矩阵H
和G
在CSC 格式中应该是稀疏的。 这是脚本
import numpy as np
import scipy.sparse as spa
import osqp
def quadprog(P, q, G=None, h=None, A=None, b=None,
initvals=None, verbose=True):
l = -np.inf * np.ones(len(h))
if A is not None:
qp_A = spa.vstack([G, A]).tocsc()
qp_l = np.hstack([l, b])
qp_u = np.hstack([h, b])
else: # no equality constraint
qp_A = G
qp_l = l
qp_u = h
model = osqp.OSQP()
model.setup(P=P, q=q,
A=qp_A, l=qp_l, u=qp_u, verbose=verbose)
if initvals is not None:
model.warm_start(x=initvals)
results = model.solve()
return results.x, results.info.status
# Generate problem data
n = 2 # Variables
H = spa.csc_matrix([[4, 1], [1, 2]])
f = np.array([1, 1])
G = spa.csc_matrix([[1, 0], [0, 1]])
h = np.array([0.7, 0.7])
A = spa.csc_matrix([[1, 1]])
b = np.array([1.])
# Initial point
q0 = np.ones(n)
x, status = quadprog(H, f, G, h, A, b, initvals=q0, verbose=True)
我会提的是,二次规划问题是它们的最优化问题的一个子集凸优化问题的一个子集开始。
有多个 python 包可以解决二次规划问题,特别是
cvxopt——解决各种凸优化问题(包括二次规划问题)。 这是以前的cvx MATLAB 包的 python 版本。
quadprog - 这专门用于二次规划问题,但似乎没有太多文档。
scipy.optimize.minimize——这是一个非常通用的最小化器,可以解决二次规划问题以及其他优化问题(凸和非凸)。
您还可以从查看此 stackoverflow 帖子的答案中受益,其中包含更多详细信息和参考资料。
注意:user1911226'答案中的代码片段似乎来自这篇博文: https ://scaron.info/blog/quadratic-programming-in-python.html,它比较了其中一些二次编程包。 我无法评论他们的回答,但他们声称提到了 cvxopt 解决方案,但代码实际上是针对 quadprog 解决方案的。
您可以使用solve_qp
中的 solve_qp function 。 可以通过pip install qpsolvers[open_source_solvers]
它以及开源求解器的入门工具包。 然后你可以用以下内容替换你的行:
from qpsolvers import solve_qp
solver = "proxqp" # or "osqp", "quadprog", "cvxopt", ...
x = solve_qp(H, f, G, h, A, b, initvals=q_0, solver=solver, **options)
Python 中有许多求解器可用,每个求解器各有利弊。 确保为solver
关键字参数尝试不同的值,以找到最适合您的问题的值。
这是一个基于您的问题和其他评论的独立示例:
import numpy as np
from qpsolvers import solve_qp
H = np.array([[4.0, 1.0], [1.0, 2.0]])
f = np.array([1.0, 1])
G = np.array([[1.0, 0.0], [0.0, 1.0]])
h = np.array([0.7, 0.7])
A = np.array([[1.0, 1.0]])
b = np.array([1.0])
q_0 = np.array([1.0, 1.0])
solver = "cvxopt" # or "osqp", "proxqp", "quadprog", ...
options = {"verbose": True}
x = solve_qp(H, f, G, h, A, b, initvals=q_0, solver=solver, **options)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.