이 패키지 (DPEA)는 개별 작업을위한 Hill Climbing 알고리즘 구현을 제공합니다.
pip install DiscreteHillClimbing
언덕 등반 ( 좌표 최소화 )은 개별 작업을위한 가장 간단한 알고리즘입니다 (하나는 완전히 무작위로 최선을 다하는 것입니다). 불연속 작업에서 각 예측 변수는 유한 한 세트에서 값을 가질 수 있으므로 예측 변수 (변수)의 모든 값 (변수) 또는 일부 예측 변수에 의해 최적화를 수행 할 수 있습니다. 그 후 우리는 다른 예측 변수 등을 최적화 할 수 있습니다. 또한 1, 2, 3, 예측 변수를 사용하여 더 나은 솔루션을 찾아서 최상의 구성 만 선택할 수 있습니다.
언덕 등반을 실현하는 다양한 방법이 있으므로 단순하고 보편적 인 구현을 만들려고 노력했습니다. 확실히, (더 빠른) 구현을 만드는 것이 더 나을 수 있지만, 자신의 작업에 따라 다르지만이 패키지는 처음에는 유연한 선택입니다.
언덕 등반은 해결책을 찾기 시작할 때 완벽한 기준입니다. 실제로 도움이되고 실제로 50-200 기능 평가를 사용하여 매우 좋은 결과를 얻을 수 있습니다.
이 의사 코드에서 내 구현의 주요 아이디어를 참조하십시오.
best solution < - start_solution
best value < - func ( start_solution )
while functions evaluates_count < max_function_evals :
predictors < - get greedy_step random predictors ( variables )
for each predictor from predictors :
choose random_counts_by_predictors values from available values of this predictor
for each chosen value :
replace predictor value with chosen
evaluate function
remember best result as result of this predictor
select best predictor with its best configuration
replace values in solution
it is new best solution 로드 패키지 :
import numpy as np
from DiscreteHillClimbing import Hill_Climbing_descent최적화 된 기능 결정 :
def func ( array : np . ndarray ) -> float :
return ( np . sum ( array ) + np . sum ( array ** 2 )) / ( 1 + array [ 0 ] * array [ 1 ])각 예측 변수에 사용 가능한 세트를 결정하십시오 .
available_predictors_values = [
np . array ([ 10 , 20 , 35 , 50 ]),
np . array ([ - 5 , 3 , - 43 , 0 , 80 ]),
np . arange ( 40 , 500 ),
np . linspace ( 1 , 100 , num = 70 ),
np . array ([ 65 , 32 , 112 ]),
np . array ([ 1 , 2 , 3 , 0 , 9 , 8 ]),
np . array ([ 1 , 11 , 111 , 123 , 43 ]),
np . array ([ 8 , 9 , 0 , 5 , 4 , 3 ]),
np . array ([ - 1000 , - 500 , 500 , 1000 ])
]솔루션 생성 :
solution , value = Hill_Climbing_descent ( function = func ,
available_predictors_values = available_predictors_values ,
random_counts_by_predictors = 4 ,
greedy_step = 1 ,
start_solution = None ,
max_function_evals = 1000 ,
maximize = False ,
seed = 1 )
print ( solution )
print ( value )
# [ 10. -5. 493. 98.56521739 112. 9. 123. 9. 1000. ]
# -26174.972801975237 function : func np.array-> float/int; 호출 가능한 최적화 된 기능은 Numpy 1D-Array를 인수로 사용합니다.
available_predictors_values : int 시퀀스 각 예측 변수에 대한 사용 가능한 값 목록 (각 인수의 차원).
random_counts_by_predictors : int 또는 int sequence, 선택 사항 각 변수에 대해 얼마나 많은 임의 선택을 사용해야합니까? 각 예측 변수에 대한 선택 옵션에 목록/Numpy 배열을 사용하십시오 (또는 각 예측기에 대해 int- 숫자 1 개). 기본값은 3입니다.
greedy_step : int, 옵션은 greedy_step predictors의 등반 후 더 나은 솔루션을 선택합니다. 기본값은 1입니다.
start_solution : 없음 또는 int 시퀀스, 알고리즘이 시작될 때 선택 사항. 기본값은 없음 - 임의의 시작 솔루션입니다
max_function_evals : int, 옵션 최대 기능 평가. 기본값은 1000입니다.
maximize : bool, 선택 사항 기능을 최대화합니까? (기본적으로 최소화). 기본값은 False입니다.
seed : int 또는 없음. 임의의 종자 (중요하지 않은 경우). 기본값은 없음입니다
반품 : 튜플에는 최상의 솔루션과 최상의 기능 값이 포함되어 있습니다.
u는 각 예측기에 대해 다른 random_counts_by_predictors 값을 설정할 수 있습니다. 예를 들어, 사용 가능한 예측기 세트에 3-5 값 만 포함 된 경우 모든 값을 확인하는 것이 좋습니다. 그러나 100 개 이상의 값이 있으면 5가 아닌 20-40을 확인하는 것이 좋습니다. 예를 참조하십시오.
import numpy as np
from DiscreteHillClimbing import Hill_Climbing_descent
def func ( array ):
return ( np . sum ( array ) + np . sum ( array ** 2 )) / ( 1 + array [ 0 ] * array [ 1 ])
available_predictors_values = [
np . array ([ 10 , 20 , 35 , 50 ]),
np . array ([ - 5 , 3 , - 43 , 0 , 80 ]),
np . arange ( 40 , 500 ),
np . linspace ( 1 , 100 , num = 70 ),
np . array ([ 65 , 32 , 112 ]),
np . array ([ 1 , 2 , 3 , 0 , 9 , 8 ]),
np . array ([ 1 , 11 , 111 , 123 , 43 ]),
np . array ([ 8 , 9 , 0 , 5 , 4 , 3 ]),
np . array ([ - 1000 , - 500 , 500 , 1000 ])
]
solution , value = Hill_Climbing_descent ( function = func ,
available_predictors_values = available_predictors_values ,
random_counts_by_predictors = [ 4 , 5 , 2 , 20 , 20 , 3 , 6 , 6 , 4 ],
greedy_step = 1 ,
start_solution = None ,
max_function_evals = 1000 ,
maximize = False ,
seed = 1 )
print ( solution )
print ( value )
# [ 10. -5. 494. 100. 112. 9. 123. 9. 1000.]
# -26200.979591836734 greedy_step 매개 변수는 일부 작업에서 중요 할 수 있습니다. 기본 greedy_step = 2 greedy_step = 1 대신 greedy_step = 2 또는 greedy_step = 3 사용하는 것이 좋습니다. 최적화 된 기능을 여러 번 평가할 여유가 없다면 Big greedy_step 을 사용하는 것은 좋은 선택이 아닙니다.
import numpy as np
from DiscreteHillClimbing import Hill_Climbing_descent
def func ( array ):
return ( np . sum ( array ) + np . sum ( np . abs ( array ))) / ( 1 + array [ 0 ] * array [ 1 ]) - array [ 3 ] * array [ 4 ] * ( 25 - array [ 5 ])
available_predictors_values = [
np . array ([ 10 , 20 , 35 , 50 ]),
np . array ([ - 5 , 3 , - 43 , 0 , 80 ]),
np . arange ( 40 , 500 ),
np . linspace ( 1 , 100 , num = 70 ),
np . array ([ 65 , 32 , 112 ]),
np . array ([ 1 , 2 , 3 , 0 , 9 , 8 ]),
np . array ([ 1 , 11 , 111 , 123 , 43 ]),
np . array ([ 8 , 9 , 0 , 5 , 4 , 3 ]),
np . array ([ - 1000 , - 500 , 500 , 1000 ])
]
seeds = np . arange ( 100 )
greedys = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
results = np . empty ( len ( greedys ))
for i , g in enumerate ( greedys ):
vals = []
for s in seeds :
_ , value = Hill_Climbing_descent ( function = func ,
available_predictors_values = available_predictors_values ,
random_counts_by_predictors = [ 4 , 5 , 2 , 20 , 20 , 3 , 6 , 6 , 4 ],
greedy_step = g ,
start_solution = [ v [ 0 ] for v in available_predictors_values ],
max_function_evals = 100 ,
maximize = True ,
seed = s )
vals . append ( value )
results [ i ] = np . mean ( vals )
import pandas as pd
print ( pd . DataFrame ({ 'greedy_step' : greedys , 'result' : results }). sort_values ([ 'result' ], ascending = False ))
# greedy_step result
# 1 2 1634.172483
# 0 1 1571.038514
# 2 3 1424.222610
# 3 4 1320.051325
# 4 5 1073.783527
# 5 6 847.873058
# 6 7 362.113555
# 7 8 24.729801
# 8 9 -114.200000