문제

나는 Python 2.5를 사용합니다.

나는 Cobyla 최적화에 한계를 전달하고있다 :

import numpy 
from numpy import asarray

Initial = numpy.asarray [2, 4, 5, 3]       # Initial values to start with

#bounding limits (lower,upper) - for visualizing

#bounds = [(1, 5000), (1, 6000), (2, 100000), (1, 50000)] 

# actual passed bounds

b1 = lambda  x: 5000 - x[0]      # lambda x: bounds[0][1] - Initial[0]

b2 = lambda  x: x[0] - 2.0       # lambda x: Initial[0] - bounds[0][0]

b3 = lambda  x: 6000 - x[1]      # same as above

b4 = lambda  x: x[1] - 4.0

b5 = lambda  x: 100000 - x[2]

b6 = lambda  x: x[2] - 5.0

b7 = lambda  x: 50000 - x[3]

b8 = lambda  x: x[3] - 3.0

b9 = lambda  x: x[2] >  x[3]  # very important condition for my problem!


opt= optimize.fmin_cobyla(func,Initial,cons=[b1,b2,b3,b4,b5,b6,b7,b8,b9,b10],maxfun=1500000)

초기 값에 따라 Initial 그리고 바운드 내에서/로 b1 에게 b10 값이 전달됩니다 opt(). 그러나 값은 특히 다루고 있습니다 b9. 이것은 내 문제에 매우 중요한 경계 조건입니다!

"의 가치 x[2] 내 기능으로 전달되었습니다 opt() 모든 반복에서는 항상보다 커야합니다 x[3]" - 이것을 어떻게 달성 할 수 있습니까?

내 경계에 잘못된 것이 있습니까 (b1 에게 b9) 정의 ?

아니면 내 경계를 정의하는 더 좋은 방법이 있습니까?

도와주세요.

도움이 되었습니까?

해결책

fmin_cobyla() 내부 포인트 방법이 아닙니다. 즉, OptMization 실행 과정에서 경계 외부 ( "Infeasible Points")를 기능으로 전달합니다.

당신이 해결해야 할 것은 b9 그리고 b10 그 형태가 아닙니다 fmin_cobyla() 기대합니다. 바운드 함수는 바운드 내에있는 경우 양수를 반환해야합니다. 이상적으로는 이러한 기능이 매끄럽게되어야합니다. fmin_cobyla() 실행 가능한 영역으로 돌아가는 방법을 알려주기 위해 이러한 기능의 수치 도함수를 취하려고 노력할 것입니다.

b9 = lambda x: x[2] - x[3]

구현 방법을 잘 모르겠습니다 b10 그런 식으로 fmin_cobyla() 그래도 사용할 수 있습니다.

다른 팁

B10의 경우 가능한 옵션은 다음과 같습니다.

b10 = lambda x: min(abs(i-j)-d for i,j in itertools.combinations(x,2))

어디 변수간에 원하는 최소 차이보다 델타가 더 큽니다 (예 : 0.001)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top