使用Numpy在Python中进行二次编程?

时间:2018-07-03 18:59:26

标签: python matlab numpy optimization quadratic-programming

我正在将一些MATLAB代码转换为Python。有一行让我有些麻烦:

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

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

我试图在Python中找到类似的功能(使用numpy),但似乎没有任何功能。

是否有更好的方法将这一行代码转换为Python?还是有其他可以使用的软件包?我需要做一个完成相同任务的新功能吗?

感谢您的时间和帮助!

3 个答案:

答案 0 :(得分: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] 

答案 1 :(得分:1)

OSQP是基于ADMM的专用免费QP解决程序。我为您的问题改编了OSQP documentation demo中的qpsolvers repository和OSQP呼叫。

请注意,CSC format中的矩阵HG稀疏。这是脚本

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)

答案 2 :(得分:0)

我首先要提到二次编程问题是凸优化问题的子集,而 optimization 问题是子集。 >

有多个python软件包可以解决二次编程问题,特别是

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

  2. quadprog-仅用于二次编程问题,但似乎没有太多的文档。

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

您可能还会从this stackoverflow post的答案中受益,该答案包含更多详细信息和参考。

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