5

我正在将一些 MATLAB 代码翻译成 Python。有一条线给我带来了一些麻烦:

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

我在 MATLAB 中查找了文档,发现 quadprog 函数用于优化(特别是最小化)。

我试图在 Python 中找到一个类似的函数(使用 numpy),但似乎没有。

有没有更好的方法将这行代码翻译成 Python?或者还有其他可以使用的包吗?我是否需要创建一个完成相同任务的新功能?

感谢您的时间和帮助!

4

3 回答 3

3

有一个名为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] 
于 2018-07-03T23:34:57.923 回答
2

我将首先提到二次规划问题是凸优化问题的子集,凸优化问题是优化问题的子

有多个 python 包可以解决二次规划问题,特别是

  1. cvxopt——解决各种凸优化问题(包括二次规划问题)。这是以前的cvx MATLAB 包的 python 版本。

  2. quadprog - 这专门用于二次规划问题,但似乎没有太多文档。

  3. scipy.optimize.minimize - 这是一个非常通用的最小化器,可以解决二次规划问题以及其他优化问题(凸和非凸)。

查看这篇包含更多详细信息和参考资料的stackoverflow 帖子的答案可能也会使您受益。

注意:user1911226 答案中的代码片段似乎来自这篇博文: https ://scaron.info/blog/quadratic-programming-in-python.html ,它比较了其中一些二次编程包。我无法评论他们的答案,但他们声称提到了 cvxopt 解决方案,但代码实际上是针对 quadprog 解决方案的。

于 2020-10-08T17:07:03.507 回答
2

OSQP是一个基于 ADMM 的专业免费 QP 求解器。我已经针对您的问题调整了qpsolvers 存储库中的OSQP 文档演示和 OSQP 调用。

请注意,矩阵HG应该是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)
于 2018-07-05T22:21:11.057 回答