1

私は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' 
+0

なぜ失敗するのかは分かりませんが、QPは自明ではなく、ソルバーは完璧ではないことに注意してください。そのような小さな問題にそれが起こるのであれば、ちょっと面倒ですが、面倒な例が常にあります。反復の回数を増やすことは役に立たないので、ここでは何とか分岐しています。商用ソルバMOSEKはまったく問題ありません。 – sascha

答えて

1

謝罪、私は私の質問を編集するのに十分な評判を持っていません。

Googleグループの誰かが答えを指摘しました。私の問題はうまく調整されていないということです。それはとても500の両方によってGhスルーはオプティマイザが完全に動作し、上記のすべての場合に正しい答えを与えることを許さ除1.

に近いことがhの要素のための最善の方法です。

私はCVXOPTのドキュメントでこのスケーリングのことについて言及がありません。

とにかく、私はこの質問と回答が誰かにとって有益であることを証明したいと思います。

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.]]) 

# Divide by 500 to get scaling correct 
G /= 500 
h /= 500 

results = qp(
    matrix(P), 
    matrix(q), 
    matrix(G), 
    matrix(h), 
) 
print results # Works fine, {'status': 'optimal'} 
print 'Works fine' 
関連する問題