1

我在Python中使用CVXOPT来尝试解决一个相当简单的二次编程问题。我发现它对我的参数的某些值完美起作用,但对其他参数无效。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' 
+0

我不能告诉你它为什么失败,但要记住QP不是微不足道的,没有求解器是完美的。总会有麻烦的情况,虽然如果它发生在如此小的问题中有点烦人。它肯定在某种程度上与此不同,因为增加迭代次数并不能提供帮助。商业求职者MOSEK根本没有问题。 – sascha

回答

1

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

某个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'