通常我一直在使用GNU Octave解决二次编程问题。

我解决类似的问题

x = 1/2x'Qx + c'x

与受制于
A*x <= b
lb <= x <= ub

其中lbub是下界和上限,例如x的限制

解决时,我的Octave代码看起来像这样。只需一条简单的线
U = quadprog(Q, c, A, b, [], [], lb, ub);

方括号[]为空,因为我不需要相等约束
Aeq*x = beq,

所以我的问题是:
Python中是否有易于使用的二次求解器来解决问题
x = 1/2x'Qx + c'x

与受制于
A*x <= b
lb <= x <= ub

或服从
b_lb <= A*x <= b_ub
lb <= x <= ub

最佳答案

如果您需要像quadprog这样的通用二次方编程求解器,我建议使用其中之一注释中提到的开源软件cvxopt。这是强大的,而且确实是最先进的。主要贡献者是该领域的主要专家,并且是凸优化classic book的合著者。

您要使用的函数是cvxopt.solvers.qp。下面是在Numpy中像quadprog一样使用它的简单包装器。请注意,可以将边界作为不等式约束的一种特殊情况。

import numpy as np
from cvxopt import matrix, solvers

def quadprog(P, q, G=None, h=None, A=None, b=None, options=None):
     """
    Quadratic programming problem with both linear equalities and inequalities

        Minimize      0.5 * x @ P @ x + q @ x
        Subject to    G @ x <= h
        and           A @ x = b
    """
    P, q = matrix(P), matrix(q)

    if G is not None:
        G, h = matrix(G), matrix(h)

    if A is not None:
        A, b = matrix(A), matrix(b)

    sol = solvers.qp(A, b, G, h, A, b, options=options)

    return np.array(sol['x']).ravel()
cvxopt以前很难安装,但是现在也包含在Anaconda distribution中,并且可以使用conda install cvxopt安装(甚至在Windows上)。

如果相反,您对带边界的线性最小二乘优化的更具体情况感兴趣,这是常规二次规划的子集,即
Minimize || A @ x - b ||
subject to lb <= x <= ub

然后Scipy具有特定功能scipy.optimize.lsq_linear(A, b, bounds)

请注意,可接受的答案是一种非常低效的方法,因此不建议使用。它没有利用至关重要的事实,即您要优化的函数是二次函数,而是使用通用的非线性优化程序,甚至没有指定分析梯度。

10-06 01:46