Python中的CVXOPT无法解决简单的二次规划问题

时间:2016-11-16 14:22:38

标签: python mathematical-optimization cvxopt quadratic-programming

我在Python中使用CVXOPT试图解决一个相当简单的二次规划问题。我发现它对于我的参数的某些值非常有效,但对其他值则无效。

下面显示的是一个非常简单的cvxopt.solvers.qp()失败的例子。

您可以看到所有示例在性质上都非常相似。谁能告诉我为什么CVXOPT无法解决三个中间的问题?

非常感谢

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'

1 个答案:

答案 0 :(得分:2)

道歉,我没有足够的声誉来编辑我的问题。

Google小组的某个人指出了答案。这是我的问题没有很好地扩展。 h的元素最好接近1。

因此将Gh分为500可以使优化器完美地工作,并在上述所有情况下给出正确的答案。

奇怪的是,我在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'