2016-12-23 1 views
0

linprog를 사용하여 간단한 선형 함수를 최소화하려고합니다. 계수는 arr2의 요소에 -1을 곱한 값입니다. -1 < = x1 < = 1, -2 < = x2 < = 2 등과 같이 각 변수에 대한 부등식 제약 조건 만 있습니다. 상태 3의 파이썬 SciPy linprog 최적화가 실패합니다

A가 linprog에 경계를 지정하지 않을 경우

:

from scipy.optimize import linprog 
import numpy as np 
import pandas as pd 

numdim = 28 

arr1 = np.ones(numdim) 
arr1 = - arr1 

arr2 = np.array([ 
19.53, 
128.97, 
3538, 
931.8, 
0.1825, 
150.88, 
10315, 
0.8109, 
3.9475, 
3022, 
31.77, 
10323, 
110.93, 
220, 
2219.5, 
119.2, 
703.6, 
616, 
338, 
84.67, 
151.13, 
111.28, 
29.515, 
29.67, 
158800, 
167.15, 
0.06802, 
1179 
]) 

constr_a = [] 

for i in range(numdim): 

    constr_default = np.zeros(numdim) 
    constr_default[i] = 1 
    constr_a.append(constr_default) 

for i in range(numdim): 

    constr_default = np.zeros(numdim) 
    constr_default[i] = -1 
    constr_a.append(constr_default) 

constr_a = np.asarray(constr_a) 
constr_b = np.arange(1, 2*numdim + 1, 1) 
constr_b[numdim:] = constr_b[:numdim] 

print linprog(np.transpose(arr1 * arr2), constr_a, constr_b, bounds=(None, None)) 

나는 다음과 같은 결과를 얻을 :

재미

: -4327476.2887400016 메시지 : '최적화에 실패했습니다. 문제는 무한한 것처럼 보인다. ' 상태 : I가 마지막 행을 변경하려고했습니다 3

: 경계로 지정

print linprog(np.transpose(arr1 * arr2), constr_a, constr_b, bounds=(-1000, 1000)) 

숫자는 무작위입니다. 출력은 다음과 같습니다

재미 : -4327476.2887400296 메시지 : '최적화가 성공적으로 종료되었습니다.' 상태 : 0

약간 다른 결과와 원하는 상태를 제공합니다. 제 질문은 도서관을 오용하고 어떤 방식으로 사용합니까? 어떤 답이 맞습니까? 이 코드는 'bounds'매개 변수를 지정하지 않아도 작동 할 것으로 예상됩니다. 이 간단한 제약 조건은 각 변수마다 고유하기 때문에이 매개 변수를 사용할 수 없습니다.

저는 파이썬 2.7과 scipy 0.17.1을 사용합니다. 사전에 큰 감사드립니다. UPD

constr_a

는 문서 (https://docs.scipy.org/doc/scipy/reference/optimize.linprog-simplex.html)에 따른 행렬 실제로 코드 인 것이다. 구문이 올바른지 확인하기 위해 차원 수를 2로자를 수 있습니다.

from scipy.optimize import linprog 
import numpy as np 
import pandas as pd 

numdim = 2 

arr1 = np.ones(numdim) 
arr1 = - arr1 

arr2 = np.array([ 
19.53, 
128.97 
]) 

constr_a = [] 

for i in range(numdim): 

    constr_default = np.zeros(numdim) 
    constr_default[i] = 1 
    constr_a.append(constr_default) 

for i in range(numdim): 

    constr_default = np.zeros(numdim) 
    constr_default[i] = -1 
    constr_a.append(constr_default) 

constr_a = np.asarray(constr_a) 
constr_b = np.arange(1, 2*numdim + 1, 1) 
constr_b[numdim:] = constr_b[:numdim] 

print constr_a 
print constr_b 
print linprog(np.transpose(arr1 * arr2), constr_a, constr_b, bounds=(None, None)) 

이 방법을 사용할 수 있습니다.

답변

0

constr_a 목록이 올바르게 구성되지 않았습니다. 스칼라 배열이 아닌 배열 배열입니다. 이로 인해 최적화가 실패하는 부적절한 하한이 발생할 수 있습니다.

아마도

constr_a.append(constr_default) 

constr_a.append(constr_default[i]) 

들이 적절한 형태와 값이 있는지 확인하기 위해 두 바인딩 된 배열을 검사해야한다.

+0

'constr_a'는 행렬 (2n, n)이고, 미지 변수 배열은 (n, 1)이며, 행렬 곱셈 결과는 (2n, 1) 배열'constr_b'입니다. 나는 여기에 실수가없는 것 같다. – Inna

+0

@Inna'constr_a'의 처음 몇 요소를 출력하고 확인하십시오. – tihom

+0

제안 해 주셔서 감사합니다. 게시물에 답변 됨. – Inna