使用 Numpy 在 Python 中进行二次规划?

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函数用于优化(特别是最小化)。

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

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

感谢您的宝贵时间和帮助!

有一个名为 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 is a specialized free QP solver based on ADMM. I have adapted the OSQP documentation demo and the OSQP call in the qpsolvers repository 解决你的问题。

请注意,矩阵 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)

我首先要提到 二次规划 问题是 凸优化 问题的子集,后者是 优化个问题。

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

  1. cvxopt -- which solves all kinds of convex optimization problems (including quadratic programming problems). This is a python version of the previous cvx MATLAB package.

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

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

您还可以从查看 this Whosebug post 的答案中获益,其中包含更多详细信息和参考资料。

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