0
this question과 같은 문제가 있지만 최적화 문제에 하나만 있지만 몇 가지 제약 조건을 추가하고 싶지는 않습니다.differential_evolution에 여러 제약 조건을 추가하는 방법은 무엇입니까?
예. 나는 x1
과 x2
의 합보다 작은 5
및 x2
실제 문제는 훨씬 더 복잡하고 그냥이 하나 scipy.optimize.minimize
에 던져 질 수 없다는 말보다 작은 3
(불필요한입니다 제약과 x1 + 5 * x2
을 극대화하려면, 그냥 제공 문제를 설명하기 위해 ...).
내가 할 수있는 하나는 기대하는 것처럼
from scipy.optimize import differential_evolution
import numpy as np
def simple_test(x, more_constraints):
# check wether all constraints evaluate to True
if all(map(eval, more_constraints)):
return -1 * (x[0] + 5 * x[1])
# if not all constraints evaluate to True, return a positive number
return 10
bounds = [(0., 5.), (0., 5.)]
additional_constraints = ['x[0] + x[1] <= 5.', 'x[1] <= 3']
result = differential_evolution(simple_test, bounds, args=(additional_constraints,), tol=1e-6)
print(result.x, result.fun, sum(result.x))
이
[ 1.99999986 3. ] -16.9999998396 4.99999985882
를 인쇄합니다.
오히려 '위험한' 'eval
'을 사용하는 것보다 몇 가지 제약 조건을 추가하는 더 직접적인 방법이 있습니까?
당신은 평가하지 않아도됩니다. scipy.optimize.minimize 예제에서 사용 된 접근 방식을 따르십시오. 함수 또는 람다 함수를 작성하고 테스트에서 모두 평가하십시오. simple_test에서 호출되면 이미 x에 액세스 할 수 있으며 전달할 수 있습니다. (이 접근법이 실제로 좋은 것이라면 더 중요한 DE의 기본 이론이 될 것입니다.) – sascha
@sascha : 아래 코드에서 답을 추가 하시겠습니까? 그것이 유용하다면 upvote보다 행복하다. – Cleb
필자는 필요성을 느끼지 못하지만 일반 개념이 제대로 작동하는지 확신 할 수는 없지만 모든 글로벌 opt 휴리스틱과 관련하여 약간 편향되어 있습니다. 나는 단지 당신이 [여기]와 같은 lambda 나 함수를 만들었다 고 말하고있다. (https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.minimize.html#scipy.optimize. 최소화). 물론 당신의 경우에 당신은'''simple_test'''에서 이것을 호출 할 것입니다. 유일한 이득은 평판이없는 사용법입니다. 예 :'''check_0 = lambda x : x [0] + x [1] <= 5'''. – sascha