私はPythonでCVXOPTを使用して、かなり単純な二次計画問題を解決しようとしています。私はそれが私のパラメータのいくつかの値に対して完全に動作することを見出していますが、他のパラメータでは失敗します。PythonのCVXOPTは簡単な二次プログラミングの問題を解決できません
以下は、3つの例のいずれかで失敗したcvxopt.solvers.qp()
の非常に単純な例です。
すべての例が本質的に非常に似ていることがわかります。 CVXOPTがなぜ3つの中間を解決できないのか誰にでも教えてもらえますか?
感謝
import numpy as np
from cvxopt.solvers import qp
from cvxopt import matrix
print '-'*70
print 'Case 1:'
P = np.array([[ 0.0084, 0.003 ],
[ 0.003, 0.0017]])
q = np.array([[-0.36],
[-0.02]])
G = np.array([[ 1., 0.],
[ 0., 1.]])
h = np.array([[ 500.],
[ 500.]])
results = qp(
matrix(P),
matrix(q),
matrix(G),
matrix(h),
)
print results # Works fine, {'status': 'optimal'}
print results['x']
print 'Works fine'
print '-'*70
print 'Case 2:'
P = np.array([[ 0.0042 , 0.0015 ],
[ 0.0015 , 0.00085]])
q = np.array([[-0.48],
[-0.06]])
G = np.array([[ 1., 0.],
[ 0., 1.]])
h = np.array([[ 500.],
[ 500.]])
results = qp(
matrix(P),
matrix(q),
matrix(G),
matrix(h),
)
print results # Fails, reaches max_iter, {'status': 'unknown'}
print '***Fails***'
print '-'*70
print 'Case 3:'
P = np.array([[ 0.0021 , 0.00075 ],
[ 0.00075 , 0.000425]])
q = np.array([[-0.54],
[-0.08]])
G = np.array([[ 1., 0.],
[ 0., 1.]])
h = np.array([[ 500.],
[ 500.]])
results = qp(
matrix(P),
matrix(q),
matrix(G),
matrix(h),
)
print results # Works fine, {'status': 'optimal'}
print results['x']
print 'Works fine'
なぜ失敗するのかは分かりませんが、QPは自明ではなく、ソルバーは完璧ではないことに注意してください。そのような小さな問題にそれが起こるのであれば、ちょっと面倒ですが、面倒な例が常にあります。反復の回数を増やすことは役に立たないので、ここでは何とか分岐しています。商用ソルバMOSEKはまったく問題ありません。 – sascha