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))
이 방법을 사용할 수 있습니다.
'constr_a'는 행렬 (2n, n)이고, 미지 변수 배열은 (n, 1)이며, 행렬 곱셈 결과는 (2n, 1) 배열'constr_b'입니다. 나는 여기에 실수가없는 것 같다. – Inna
@Inna'constr_a'의 처음 몇 요소를 출력하고 확인하십시오. – tihom
제안 해 주셔서 감사합니다. 게시물에 답변 됨. – Inna