2017-11-18 27 views
0

this question과 같은 문제가 있지만 최적화 문제에 하나만 있지만 몇 가지 제약 조건을 추가하고 싶지는 않습니다.differential_evolution에 여러 제약 조건을 추가하는 방법은 무엇입니까?

예. 나는 x1x2의 합보다 작은 5x2 실제 문제는 훨씬 더 복잡하고 그냥이 하나 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'을 사용하는 것보다 몇 가지 제약 조건을 추가하는 더 직접적인 방법이 있습니까?

+1

당신은 평가하지 않아도됩니다. scipy.optimize.minimize 예제에서 사용 된 접근 방식을 따르십시오. 함수 또는 람다 함수를 작성하고 테스트에서 모두 평가하십시오. simple_test에서 호출되면 이미 x에 액세스 할 수 있으며 전달할 수 있습니다. (이 접근법이 실제로 좋은 것이라면 더 중요한 DE의 기본 이론이 될 것입니다.) – sascha

+0

@sascha : 아래 코드에서 답을 추가 하시겠습니까? 그것이 유용하다면 upvote보다 행복하다. – Cleb

+0

필자는 필요성을 느끼지 못하지만 일반 개념이 제대로 작동하는지 확신 할 수는 없지만 모든 글로벌 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

답변

2

예는 다음과 같이 ::

additional_constraints = [lambda(x): x[0] + x[1] <= 5., lambda(x):x[1] <= 3] 

def simple_test(x, more_constraints): 

    # check wether all constraints evaluate to True 
    if all(constraint(x) for constraint in more_constraints): 

     return -1 * (x[0] + 5 * x[1]) 

    # if not all constraints evaluate to True, return a positive number 
    return 10