scipy.differential_evolution использует только последний из моего начального вектора населения - PullRequest
0 голосов
/ 15 октября 2019

Я использую алгоритм DE для функции с 13 параметрами, используя scipy.

Вот как выглядит мое начальное население:

0,1,2,3,4,5,6,7,8,9,10,11,12
96.28880548973896,48.804820556705806,22.485370509306634,5.946815520135948,0.735972820252201,52.684579758835504,27.407236056476712,0.4483418824870886,0.16568587262694967,21.011787818638105,34.201065397852425,23.160343905652315,114.28955631194192
98.98075798556066,29.418151110394227,10.741655889217935,7.926127577536695,0.28105392124067197,36.52633484062768,89.69493644316826,0.4487649383329635,0.4664805079849226,28.63025292821525,42.601971488914195,37.40851712255458,7.371134508594639
99.28673122419487,30.855299269449397,25.573366765785522,6.2301666497167085,0.7005619353274553,88.97850103369059,60.17381715425877,0.5299621884560591,0.047360080563793705,58.36755201039816,9.155844515324885,4.944844049867303,95.75168960112383
95.13225996797387,34.07282616500967,44.65320745890842,8.376788696688834,0.6416949949574503,10.249766780064407,44.94527947448271,0.0024953006762077345,0.2820361372774376,71.3992429847289,34.98772290562721,37.28231469070598,21.092294532570346
92.60523483552561,3.447731062817648,16.38721263201253,5.809016040598004,0.7245714662107606,13.409039281523416,44.313707860997376,0.8577929112872776,0.39278101662558973,3.105807954109663,28.72114934045002,5.9745055554488395,72.19846981306672
95.88544328854769,41.906136339963496,26.882481691268815,6.647793753007139,0.8390205851287027,46.54568782738628,49.35926328607698,0.7013776725062634,0.98676284740549,61.21512150330859,40.61976700396496,11.447996117524518,50.40751754946851
93.83111509446024,27.76671524090963,38.38781459196116,7.195451258315416,0.15938747169216483,70.96785374701177,25.73037658408467,0.8472443913634211,0.5672649199760871,40.63439709450134,29.440531915877138,18.785625280849043,18.70286687341472
95.67258049245449,49.96514963181139,42.639181555368445,0.03218649961530207,0.579035598674307,26.232307040881487,35.820295404368295,0.2151857439516971,0.5930100133523251,73.88744995550348,25.896695727908725,2.868615869361718,9.491072141520512
90.21112277738575,35.81620550311042,42.88389844507943,0.8934622216196841,0.47910990393588737,58.99675290575501,61.37753250701271,0.867701842126682,0.2642067835866093,49.35487832793467,26.067290186967305,27.94898471146144,55.3030164163344
99.22705190503555,42.12358864397629,15.477756465413929,5.395554142394333,0.26907831324501497,33.76193120238838,14.047932157101005,0.6590855040310848,0.12187733415979862,65.97904057141655,43.12656869134969,37.54490150384394,33.496316226188014
99.8,10.0,0.15,1.0,1.0,80.0,60.0,0.9988,0.988,2.1,36.0,20.0,33.0

, которое я получаю (все имена переменныхСамоочевиден и определен ранее)

pop = np.random.rand(10, len(init_params))
min_b = [x[0] for x in bounds]
diff = [x[1] - x[0] for x in bounds]
pop_denorm = min_b + pop * diff
pop_denorm = np.vstack((pop_denorm, np.array(init_params)))

Итак, 11 начальных векторов для 13 параметров.

Затем я начинаю оптимизацию следующим образом:

result_diff_evo = differential_evolution(func=optimizer_function, bounds=bounds, init=pop_denorm,maxiter=4, workers=-1, mutation=(0.5, 1.5), recombination=0.8)

Но когда япосмотрите на фактический список векторов, которые пробовал алгоритм, похоже, что это только очень небольшое отклонение от последней строки pop_denorm. Алгоритм не использует всю ширину моих определенных границ или любых других начальных векторов в pop_denorm для объединения.

Я что-то упускаю здесь очевидное?

...