1

파이썬에서 CVXOPT를 사용하여 상당히 간단한 2 차 프로그래밍 문제를 해결하려고합니다. 내 매개 변수의 일부 값은 완벽하게 작동하지만 다른 매개 변수는 실패하는 것으로 나타났습니다.파이썬에서 CVXOPT가 간단한 2 차 프로그래밍 문제를 해결하지 못합니다.

아래 그림은 세 가지 예제 중 하나에 대해 실패한 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 그룹의 누군가가 대답을 지적했습니다. 내 문제가 잘 조정되지 않았다는 것입니다. 그것은 h의 요소에 대한 가장

1. 그래서 500 옵티마이 완벽하게 작동하고 위의 모든 경우에 정확한 답을 줄 수에 의해 통해 모두 Gh를 분할에 근접하는 것입니다.

이상하게도 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'