1

Python で CVXOPT を使用して、かなり単純な二次計画問題を解決しようとしています。パラメータの一部の値では完全に機能しますが、他の値では失敗します。

以下に示すのは、cvxopt.solvers.qp()3 つの例のうちの 1 つが失敗する非常に単純な例です。

すべての例が本質的に非常に似ていることがわかります。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'
4

1 に答える 1

3

申し訳ありませんが、質問を編集するのに十分な評判がありません。

Google グループの誰かが答えを指摘しました。私の問題は十分にスケーリングされていないということです。hの要素が1 に近いことが最適です。

したがって、 と の両方Gh500 で割ると、オプティマイザーは完全に機能し、上記のすべてのケースで正しい答えを出すことができました。

奇妙なことに、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'
于 2016-11-18T09:30:28.733 に答える