matlab 用Numpy编写的二次规划?

hfwmuf9z  于 2022-11-15  发布在  Matlab
关注(0)|答案(4)|浏览(220)

我正在将一些MatLab代码翻译成Python。有一句话给我带来了一点麻烦:

[q,f_dummy,exitflag, output] = quadprog(H,f,-A,zeros(p*N,1),E,qm,[],[],q0,options);

我在MatLab中查阅了相关文档,发现了用于优化(特别是最小化)的函数为Quadprog。
我试图在Python中找到类似的函数(使用NumPy),但似乎没有。
有没有更好的方法将这行代码转换成Python?或者有其他可以使用的包吗?我需要创建一个完成相同任务的新函数吗?
感谢您的时间和帮助!

yh2wf1be

yh2wf1be1#

有一个名为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]
0s0u357o

0s0u357o2#

我首先要指出的是,“二次规划”问题是“凸优化”问题的子集,而“凸优化”问题是“优化”问题的子集。
有多个解决二次编程问题的Python包,值得注意的是
1.cvxopt--解决各种“凸优化”问题(包括二次规划问题)。这是上一个cvx MATLAB package的python版本。
1.quadprog--这是专门针对二次编程问题的,但似乎没有太多的文档。
1.scipy.optimize.minimize--这是一个非常通用的最小化程序,可以解决二次规划问题,以及其他优化问题(凸和非凸)。
您还可以查看this stackoverflow post的答案,其中包含更多详细信息和参考资料。
注意:用户1911226的答案中的代码片段似乎来自这篇博客文章:https://scaron.info/blog/quadratic-programming-in-python.html,它比较了一些二次编程包。我不能评论他们的回答,但他们声称提到的是cvxopt解决方案,但代码实际上是为Quadprog解决方案编写的。

cngwdvgl

cngwdvgl3#

OSQP是一个基于ADMM的专用免费QP求解器。我已经针对您的问题修改了qpsolvers repository中的OSQP documentation demo和OSQP调用。
请注意,假设矩阵HGCSC format中是稀疏的。这是剧本

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)
smtd7mpg

smtd7mpg4#

您可以使用qpsolvers中的solve_qp函数。它可以通过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)

相关问题