のような一般的な二次計画法ソルバーが必要な場合は、コメントの 1 つに記載されてquadprog
いるオープンソース ソフトウェアcvxoptをお勧めします。これは堅牢で、まさに最先端です。主な寄稿者は、この分野の主要な専門家であり、凸最適化に関する古典的な本の共著者です。
使用する関数は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 ディストリビューションにも含まれており、Windows でもインストールできますconda install cvxopt
。
代わりに、境界のある線形最小二乗最適化のより具体的なケースに関心がある場合、これは一般的な二次計画法のサブセットです。つまり、
Minimize || A @ x - b ||
subject to lb <= x <= ub
次にScipy
、特定の機能がありますscipy.optimize.lsq_linear(A, b, bounds)
。
受け入れられた回答は非常に非効率的なアプローチであり、推奨されないことに注意してください。最適化する関数が二次関数であるという重要な事実を利用せず、代わりに一般的な非線形最適化プログラムを使用し、解析勾配を指定しません。