60#ifndef __EVOLVE_OPTIMIZER_H_
61#define __EVOLVE_OPTIMIZER_H_
67#ifdef ENABLE_EVOLVE_OPTIMIZATION
71#define PARAM_SCALE_Q16(x, min_val, max_val) \
72((int32_t)((((float)(x) - (float)(min_val)) / ((float)(max_val) - (float)(min_val))) * 65536.0f))
77#define PARAM_UNSCALE_Q16(q16_val, min_val, max_val) \
78(((float)(q16_val) / 65536.0f) * ((float)(max_val) - (float)(min_val)) + (float)(min_val))
81#define local_time() HAL_GetTick()
103#define Q16_MUL(a,b) ((int32_t)(((int64_t)(a) * (int64_t)(b)) >> 16))
108static int cmp_idx(
const void *a,
const void *b) {
109 if (g_sort_opt->
loss[*(
const uint16_t*)a] < g_sort_opt->
loss[*(
const uint16_t*)b])
111 if (g_sort_opt->
loss[*(
const uint16_t*)a] > g_sort_opt->
loss[*(
const uint16_t*)b])
136 uint16_t iq_mutation,
137 int32_t* start_params)
139 if((opt = NULL) || (start_params == NULL))
154 if(iq_mutation > 32768)
158 for (uint16_t i = 0; i < n_cand; i++) {
159 for (uint16_t j = 0; j < n_params; j++) {
164 uint32_t seed =
local_time() + (ADC1->DR & 0xFF);
191 if((opt = NULL) || (params == NULL))
198 uint16_t n_cand = opt->
n_cand;
202 uint16_t n_best = opt->
n_best;
216 for(uint16_t i = 0; i < opt->
n_cand; i++)
239 uint16_t n_elite = 2;
240 for (uint16_t c = 0; c < n_cand; c++) {
243 for (uint16_t i = 0; i < n_params; i++) {
249 for (uint16_t i = 0; i < n_params; i++) {
250 int32_t noise = (rand() % (2 * mut)) - mut;
261 for (uint16_t i = 0; i < opt->
n_params; i++)
272 uint16_t iq_mutation;
274 int32_t candidates[0][0];
276#define EvolveOptimizer_Init(opt, n_params, n_cand, n_best, iq_mutation, start_params)
277#define EvolveOptimizer_Step(opt, params, LossFunc)
278#define PARAM_SCALE_Q16(x, min_val, max_val) (x)
279#define PARAM_UNSCALE_Q16(q16_val, min_val, max_val) (q16_val)
#define EVOLVE_MAX_CANDIDATES
Максимальное количество кандидатов для обучения
#define EVOLVE_MAX_PARAMS
Максимальное количество параметров
__STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t *opt, int32_t *params, int32_t loss)
Один шаг эволюционного оптимизатора.
#define local_time()
Локальное время
__STATIC_INLINE int EvolveOptimizer_Init(EvolveOptimizer_t *opt, uint16_t n_params, uint16_t n_cand, uint16_t n_best, uint16_t iq_mutation, int32_t *start_params)
Инициализация эволюционного оптимизатора.
Заголочный файл для дефайнов библиотеки MyLibsGeneral.
Структура эволюционного оптимизатора
uint16_t cand_index
Индекс кандидата для обработки
uint16_t n_params
Количество параметров
uint16_t iq_mutation
Амплитуда мутации в Q16.16.
int32_t candidates[100][20]
Параметры кандидатов
uint16_t sorted_idx[100]
Индексы отсортированных кандидатов
uint16_t n_best
Количество лучших, усредняемых
uint16_t n_cand
Количество кандидатов
int32_t loss[100]
Loss для каждого кандидата