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'