\doxysubsubsection{Evolve optimizer }
\hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r}{}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r}\index{Evolve optimizer@{Evolve optimizer}}


Библиотека для эволюционного подбора параметров  


Collaboration diagram for Evolve optimizer\+:\nopagebreak
\begin{figure}[H]
\begin{center}
\leavevmode
\includegraphics[width=280pt]{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r}
\end{center}
\end{figure}
\doxysubsubsubsubsection*{Classes}
\begin{DoxyCompactItemize}
\item 
struct \mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}}
\begin{DoxyCompactList}\small\item\em Структура эволюционного оптимизатора \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsubsubsubsection*{Macros}
\begin{DoxyCompactItemize}
\item 
\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaff223481fcffea77394a331afde29fdc}{PARAM\+\_\+\+SCALE\+\_\+\+Q16}}(x,  min\+\_\+val,  max\+\_\+val)
\begin{DoxyCompactList}\small\item\em Линейное масштабирование x из диапазона \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]} в Q16.\+16 \mbox{[}0, 65536) \end{DoxyCompactList}\item 
\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga71a0c240c667e976d9caef391ab767ba}{PARAM\+\_\+\+UNSCALE\+\_\+\+Q16}}(q16\+\_\+val,  min\+\_\+val,  max\+\_\+val)
\begin{DoxyCompactList}\small\item\em Обратное линейное масштабирование Q16.\+16 значения в диапазон \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]}. \end{DoxyCompactList}\item 
\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga9c853b02c22f26023c34d1d404b6d653}{local\+\_\+time}}()
\begin{DoxyCompactList}\small\item\em Локальное время \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsubsubsubsection*{Functions}
\begin{DoxyCompactItemize}
\item 
\+\_\+\+\_\+\+STATIC\+\_\+\+INLINE int \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gadaf3a90724197e1737d5c70c7bcc75e1}{Evolve\+Optimizer\+\_\+\+Init}} (\mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \texorpdfstring{$\ast$}{*}opt, uint16\+\_\+t n\+\_\+params, uint16\+\_\+t n\+\_\+cand, uint16\+\_\+t n\+\_\+best, uint16\+\_\+t iq\+\_\+mutation, int32\+\_\+t \texorpdfstring{$\ast$}{*}start\+\_\+params)
\begin{DoxyCompactList}\small\item\em Инициализация эволюционного оптимизатора. \end{DoxyCompactList}\item 
\+\_\+\+\_\+\+STATIC\+\_\+\+INLINE int \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga75acd71c85d4e60dc0eb31bc5780086a}{Evolve\+Optimizer\+\_\+\+Step}} (\mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \texorpdfstring{$\ast$}{*}opt, int32\+\_\+t \texorpdfstring{$\ast$}{*}params, int32\+\_\+t loss)
\begin{DoxyCompactList}\small\item\em Один шаг эволюционного оптимизатора. \end{DoxyCompactList}\end{DoxyCompactItemize}


\doxysubsubsubsection{Detailed Description}
Библиотека для эволюционного подбора параметров 

Поддерживает\+:
\begin{DoxyItemize}
\item Любое количество параметров
\item Генерацию новых параметров на основе лучших кандидатов
\item Мутацию для поиска оптимальных параметров
\item Несколько независимых оптимизаторов в одной программе
\end{DoxyItemize}

Параметры для конфигурации\+:
\begin{DoxyItemize}
\item \doxylink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga2cac097081444a7a9b040f4b11550e47}{ENABLE\+\_\+\+EVOLVE\+\_\+\+OPTIMIZATION} -\/ Включить оптимизацию параметров Если библиотека отключена \doxylink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga2cac097081444a7a9b040f4b11550e47}{ENABLE\+\_\+\+EVOLVE\+\_\+\+OPTIMIZATION}, то вставляются заглушки, никак не влияющие на параметры и остальную программу
\item \doxylink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee}{EVOLVE\+\_\+\+MAX\+\_\+\+PARAMS} -\/ Максимальное количество параметров
\item \doxylink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\+\_\+\+MAX\+\_\+\+CANDIDATES} -\/ Максимальное количество кандидатов для обучения
\end{DoxyItemize}

\begin{DoxyParagraph}{Пример использования\+:}

\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{evolve__optimizer_8h}{evolve\_optimizer.h}}"{}}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ N\_PARAMS\ \ \ \ \ \ \ \ 4}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ N\_CANDIDATES\ \ \ \ 100}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ N\_BEST\ \ \ \ \ \ \ \ \ \ 10}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ IQ\_MUTATION\ \ \ \ \ (PARAM\_SCALE\_Q16(0.1,\ 0,\ 1))}}
\DoxyCodeLine{int32\_t\ params[N\_PARAMS];}
\DoxyCodeLine{\mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}}\ optimizer;}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{comment}{//\ Формирование\ параметров}}
\DoxyCodeLine{uint16\_t\ \ param\_u16\ =\ 800;}
\DoxyCodeLine{\textcolor{keywordtype}{float}\ \ \ \ \ param\_f\ \ \ =\ 0.01f;}
\DoxyCodeLine{uint8\_t\ \ \ param\_u8\ \ =\ 40;}
\DoxyCodeLine{int16\_t\ \ \ param\_i16\ =\ 1600;}
\DoxyCodeLine{params[0]\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaff223481fcffea77394a331afde29fdc}{PARAM\_SCALE\_Q16}}(param\_u16,\ \ 0,\ \ \ \ \ \ 1000);}
\DoxyCodeLine{params[1]\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaff223481fcffea77394a331afde29fdc}{PARAM\_SCALE\_Q16}}(param\_f,\ \ \ \ 0.001f,\ 0.1f);}
\DoxyCodeLine{params[2]\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaff223481fcffea77394a331afde29fdc}{PARAM\_SCALE\_Q16}}(param\_u8,\ \ \ 10,\ \ \ \ \ 100);}
\DoxyCodeLine{params[3]\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaff223481fcffea77394a331afde29fdc}{PARAM\_SCALE\_Q16}}(param\_i16,\ \ 500,\ \ \ \ 5000);}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{comment}{//\ Инициалиазция}}
\DoxyCodeLine{\mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gadaf3a90724197e1737d5c70c7bcc75e1}{EvolveOptimizer\_Init}}(\&optimizer,\ N\_PARAMS,\ N\_CANDIDATES,\ N\_BEST,\ IQ\_MUTATION,\ params);}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{comment}{//\ Шаг\ эволюции}}
\DoxyCodeLine{int32\_t\ loss\ =\ calc\_iq\_loss();\ \textcolor{comment}{//\ расчет\ эффективности\ параметров}}
\DoxyCodeLine{\mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga75acd71c85d4e60dc0eb31bc5780086a}{EvolveOptimizer\_Step}}(\&optimizer,\ params,\ loss);}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{comment}{//\ Взятие\ следующих\ для\ эволюции\ параметров}}
\DoxyCodeLine{param\_u16\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga71a0c240c667e976d9caef391ab767ba}{PARAM\_UNSCALE\_Q16}}(params[0],\ \ 0,\ \ \ \ \ \ 1000);}
\DoxyCodeLine{param\_f\ \ \ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga71a0c240c667e976d9caef391ab767ba}{PARAM\_UNSCALE\_Q16}}(params[1],\ \ 0.001f,\ 0.1f);}
\DoxyCodeLine{param\_u8\ \ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga71a0c240c667e976d9caef391ab767ba}{PARAM\_UNSCALE\_Q16}}(params[2],\ \ 10,\ \ \ \ \ 100);}
\DoxyCodeLine{param\_i16\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga71a0c240c667e976d9caef391ab767ba}{PARAM\_UNSCALE\_Q16}}(params[3],\ \ 500,\ \ \ \ 5000);}

\end{DoxyCode}
 
\end{DoxyParagraph}


\label{doc-define-members}
\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_doc-define-members}
\doxysubsubsubsection{Macro Definition Documentation}
\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaff223481fcffea77394a331afde29fdc}\index{Evolve optimizer@{Evolve optimizer}!PARAM\_SCALE\_Q16@{PARAM\_SCALE\_Q16}}
\index{PARAM\_SCALE\_Q16@{PARAM\_SCALE\_Q16}!Evolve optimizer@{Evolve optimizer}}
\doxysubsubsubsubsection{\texorpdfstring{PARAM\_SCALE\_Q16}{PARAM\_SCALE\_Q16}}
{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaff223481fcffea77394a331afde29fdc} 
\#define PARAM\+\_\+\+SCALE\+\_\+\+Q16(\begin{DoxyParamCaption}\item[{}]{x}{, }\item[{}]{min\+\_\+val}{, }\item[{}]{max\+\_\+val}{}\end{DoxyParamCaption})}

{\bfseries Value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{((int32\_t)((((float)(x)\ -\/\ (float)(min\_val))\ /\ ((float)(max\_val)\ -\/\ (float)(min\_val)))\ *\ 65536.0f))}

\end{DoxyCode}


Линейное масштабирование x из диапазона \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]} в Q16.\+16 \mbox{[}0, 65536) 



Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00071}{71}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}.

\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga71a0c240c667e976d9caef391ab767ba}\index{Evolve optimizer@{Evolve optimizer}!PARAM\_UNSCALE\_Q16@{PARAM\_UNSCALE\_Q16}}
\index{PARAM\_UNSCALE\_Q16@{PARAM\_UNSCALE\_Q16}!Evolve optimizer@{Evolve optimizer}}
\doxysubsubsubsubsection{\texorpdfstring{PARAM\_UNSCALE\_Q16}{PARAM\_UNSCALE\_Q16}}
{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga71a0c240c667e976d9caef391ab767ba} 
\#define PARAM\+\_\+\+UNSCALE\+\_\+\+Q16(\begin{DoxyParamCaption}\item[{}]{q16\+\_\+val}{, }\item[{}]{min\+\_\+val}{, }\item[{}]{max\+\_\+val}{}\end{DoxyParamCaption})}

{\bfseries Value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{(((float)(q16\_val)\ /\ 65536.0f)\ *\ ((float)(max\_val)\ -\/\ (float)(min\_val))\ +\ (float)(min\_val))}

\end{DoxyCode}


Обратное линейное масштабирование Q16.\+16 значения в диапазон \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]}. 



Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00077}{77}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}.

\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga9c853b02c22f26023c34d1d404b6d653}\index{Evolve optimizer@{Evolve optimizer}!local\_time@{local\_time}}
\index{local\_time@{local\_time}!Evolve optimizer@{Evolve optimizer}}
\doxysubsubsubsubsection{\texorpdfstring{local\_time}{local\_time}}
{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga9c853b02c22f26023c34d1d404b6d653} 
\#define local\+\_\+time(\begin{DoxyParamCaption}{}{}\end{DoxyParamCaption})}

{\bfseries Value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{HAL\_GetTick()}

\end{DoxyCode}


Локальное время 



Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00081}{81}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}.



\label{doc-func-members}
\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_doc-func-members}
\doxysubsubsubsection{Function Documentation}
\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gadaf3a90724197e1737d5c70c7bcc75e1}\index{Evolve optimizer@{Evolve optimizer}!EvolveOptimizer\_Init@{EvolveOptimizer\_Init}}
\index{EvolveOptimizer\_Init@{EvolveOptimizer\_Init}!Evolve optimizer@{Evolve optimizer}}
\doxysubsubsubsubsection{\texorpdfstring{EvolveOptimizer\_Init()}{EvolveOptimizer\_Init()}}
{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gadaf3a90724197e1737d5c70c7bcc75e1} 
\+\_\+\+\_\+\+STATIC\+\_\+\+INLINE int Evolve\+Optimizer\+\_\+\+Init (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \texorpdfstring{$\ast$}{*}}]{opt}{, }\item[{uint16\+\_\+t}]{n\+\_\+params}{, }\item[{uint16\+\_\+t}]{n\+\_\+cand}{, }\item[{uint16\+\_\+t}]{n\+\_\+best}{, }\item[{uint16\+\_\+t}]{iq\+\_\+mutation}{, }\item[{int32\+\_\+t \texorpdfstring{$\ast$}{*}}]{start\+\_\+params}{}\end{DoxyParamCaption})}



Инициализация эволюционного оптимизатора. 


\begin{DoxyParams}{Parameters}
{\em opt} & Указатель на структуру оптимизатора \\
\hline
{\em n\+\_\+params} & Количество параметров в одном кандидате \\
\hline
{\em n\+\_\+cand} & Количество кандидатов \\
\hline
{\em n\+\_\+best} & Количество лучших, усредняемых \\
\hline
{\em iq\+\_\+mutation} & Амплитуда мутации в Q16.\+16 \\
\hline
{\em start\+\_\+params} & Начальные параметры (Q16.\+16) \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
0 — если окей, -\/1 — если ошибка 
\end{DoxyReturn}


Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00132}{132}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}.

\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga75acd71c85d4e60dc0eb31bc5780086a}\index{Evolve optimizer@{Evolve optimizer}!EvolveOptimizer\_Step@{EvolveOptimizer\_Step}}
\index{EvolveOptimizer\_Step@{EvolveOptimizer\_Step}!Evolve optimizer@{Evolve optimizer}}
\doxysubsubsubsubsection{\texorpdfstring{EvolveOptimizer\_Step()}{EvolveOptimizer\_Step()}}
{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga75acd71c85d4e60dc0eb31bc5780086a} 
\+\_\+\+\_\+\+STATIC\+\_\+\+INLINE int Evolve\+Optimizer\+\_\+\+Step (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \texorpdfstring{$\ast$}{*}}]{opt}{, }\item[{int32\+\_\+t \texorpdfstring{$\ast$}{*}}]{params}{, }\item[{int32\+\_\+t}]{loss}{}\end{DoxyParamCaption})}



Один шаг эволюционного оптимизатора. 


\begin{DoxyParams}{Parameters}
{\em opt} & Указатель на структуру оптимизатора \\
\hline
{\em params} & Массив параметров, которые будут обновлены (на выходе — новые параметры) \\
\hline
{\em loss} & Loss текущего кандидата (Q16.\+16) \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
0 — если окей, -\/1 — если ошибка
\end{DoxyReturn}
Сохраняет loss текущего кандидата и формирует параметры следующего кандидата. Если накоплено n\+\_\+cand кандидатов, генерируется новое поколение. Новое поколение формируется случайным выбором из n\+\_\+best лучших с добавлением мутации.

На выходе params содержит параметры следующего кандидата для измерений. \begin{DoxyNote}{Note}
Функция использует глобальную внутреннюю переменную для сортировки. Надо убедится что только один экземпляр функции запущен в момент времени 
\end{DoxyNote}


Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00187}{187}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}.

