\documentclass[a4paper, final]{article}
%\usepackage{literat} % Нормальные шрифты
\usepackage[14pt]{extsizes} % для того чтобы задать нестандартный 14-ый размер шрифта
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{amsmath}
\usepackage[left=25mm, top=20mm, right=20mm, bottom=20mm, footskip=10mm]{geometry}
\usepackage{ragged2e} %для растягивания по ширине
\usepackage{setspace} %для межстрочно   го интервала
\usepackage{moreverb} %для работы с листингами
\usepackage{indentfirst} % для абзацного отступа
\usepackage{moreverb} %для печати в листинге исходного кода программ
\usepackage{pdfpages} %для вставки других pdf файлов
\usepackage{tikz}
\usepackage{graphicx}
\usepackage{afterpage}
\usepackage{longtable}
\usepackage{float}



% \usepackage[paper=A4,DIV=12]{typearea}
\usepackage{pdflscape}
% \usepackage{lscape}

\usepackage{array}
\usepackage{multirow}

\renewcommand\verbatimtabsize{4\relax}
\renewcommand\listingoffset{0.2em} %отступ от номеров строк в листинге
\renewcommand{\arraystretch}{1.4} % изменяю высоту строки в таблице
\usepackage[font=small, singlelinecheck=false, justification=centering, format=plain, labelsep=period]{caption} %для настройки заголовка таблицы
\usepackage{listings} %листинги
\usepackage{xcolor} % цвета
\usepackage{hyperref}% для гиперссылок
\usepackage{enumitem} %для перечислений

\newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}


\setlist[enumerate,itemize]{leftmargin=1.2cm} %отступ в перечислениях

\hypersetup{colorlinks,
    allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные)

% подгружаемые языки — подробнее в документации listings (это всё для листингов)
\lstloadlanguages{ SQL}
% включаем кириллицу и добавляем кое−какие опции
\lstset{tabsize=2,
    breaklines,
    basicstyle=\footnotesize,
    columns=fullflexible,
    flexiblecolumns,
    numbers=left,
    numberstyle={\footnotesize},
    keywordstyle=\color{blue},
    inputencoding=cp1251,
    extendedchars=true
}
\lstdefinelanguage{MyC}{
    language=SQL,
%    ndkeywordstyle=\color{darkgray}\bfseries,
%    identifierstyle=\color{black},
%    morecomment=[n]{/**}{*/},
%    commentstyle=\color{blue}\ttfamily,
%    stringstyle=\color{red}\ttfamily,
%    morestring=[b]",
%    showstringspaces=false,
%    morecomment=[l][\color{gray}]{//},
    keepspaces=true,
    escapechar=\%,
    texcl=true
}

\textheight=24cm % высота текста
\textwidth=16cm % ширина текста
\oddsidemargin=0pt % отступ от левого края
\topmargin=-1.5cm % отступ от верхнего края
\parindent=24pt % абзацный отступ
\parskip=5pt % интервал между абзацами
\tolerance=2000 % терпимость к "жидким" строкам
\flushbottom % выравнивание высоты страниц


% Настройка листингов
\lstset{
    language=python,
    extendedchars=\true,
    inputencoding=utf8,
    keepspaces=true,
    % captionpos=b, % подписи листингов снизу
}

\begin{document} % начало документа
    


    % НАЧАЛО ТИТУЛЬНОГО ЛИСТА
    \begin{center}
        \hfill \break
        \hfill \break
        \normalsize{МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ\\
            федеральное государственное автономное образовательное учреждение высшего образования «Санкт-Петербургский политехнический университет Петра Великого»\\[10pt]}
        \normalsize{Институт компьютерных наук и кибербезопасности}\\[10pt] 
        \normalsize{Высшая школа технологий искусственного интеллекта}\\[10pt] 
        \normalsize{Направление: 02.03.01 <<Математика и компьютерные науки>>}\\
        
        \hfill \break
        \hfill \break
        \hfill \break
        \hfill \break
        \large{Лабораторная работа №2}\\
        \large{по дисциплине}\\
        \large{<<Генетические алгоритмы>>}\\
        \large{Вариант 18}\\
        
        % \hfill \break
        \hfill \break
    \end{center}
    
    \small{ 
        \begin{tabular}{lrrl}
            \!\!\!Студент, & \hspace{2cm} & & \\
            \!\!\!группы 5130201/20101 & \hspace{2cm} & \underline{\hspace{3cm}} &Тищенко А. А. \\\\
            \!\!\!Преподаватель & \hspace{2cm} &  \underline{\hspace{3cm}} &  Большаков А. А. \\\\
            &&\hspace{4cm}
        \end{tabular}
        \begin{flushright}
            <<\underline{\hspace{1cm}}>>\underline{\hspace{2.5cm}} 2025г.
        \end{flushright}
    }
    
    \hfill \break
    % \hfill \break
    \begin{center} \small{Санкт-Петербург, 2025} \end{center}
    \thispagestyle{empty} % выключаем отображение номера для этой страницы
    
    % КОНЕЦ ТИТУЛЬНОГО ЛИСТА
    \newpage
    
    \tableofcontents

    \newpage
    \section {Постановка задачи}
    В данной работе были поставлены следующие задачи:

    \begin{itemize}
        \item Изучить теоретический материал;
        \item Ознакомиться с вариантами кодирования хромосомы;
        \item Рассмотреть способы выполнения операторов репродукции,
        кроссинговера и мутации;
        \item Выполнить индивидуальное задание на любом языке высокого
        уровня
    \end{itemize}

    \textbf{Индивидуальное задание вариант 18:}

    \textbf{Дано:} Функция Axis parallel hyper-ellipsoid function.

    Общая формула для n-мерного случая:
    $$f(\mathbf{x}) = \sum_{i=1}^{n} i \cdot x_i^2$$
    где $\mathbf{x} = (x_1, x_2, \ldots, x_n)$, область определения $x_i \in [-5.12, 5.12]$ для всех $i = 1, \ldots, n$.

    Для двумерного случая (n=2):
    $$f(x, y) = 1 \cdot x^2 + 2 \cdot y^2 = x^2 + 2y^2$$
    область нахождения решения $x \in [-5.12, 5.12], y \in [-5.12, 5.12]$.

    Глобальный минимум: $f(\mathbf{x}) = 0$ в точке $x_i = 0$ для всех $i = 1, \ldots, n$. Для двумерного случая: $\min f(x, y) = f(0, 0) = 0$.

    \vspace{0.3cm}
    \textbf{Требуется:}

    \begin{enumerate}
        \item Создать программу, использующую генетический алгоритм для нахождения минимума данной функции;
        \item Для n=2 вывести на экран график функции с указанием найденного экстремума и точек популяции. Предусмотреть возможность пошагового просмотра процесса поиска решения;
        \item Исследовать зависимость времени поиска, числа поколений (генераций), точности нахождения решения от основных параметров генетического алгоритма: числа особей в популяции, вероятности кроссинговера и мутации;
        \item Повторить процесс поиска решения для n=3, сравнить результаты и скорость работы программы.
    \end{enumerate}


    \newpage
    \section{Теоретические сведения}

    Генетические алгоритмы (ГА) используют принципы и терминологию, заимствованные у биологической науки – генетики. В ГА каждая особь представляет потенциальное решение некоторой
    проблемы. В классическом ГА особь кодируется строкой двоичных символов – хромосомой. Однако при работе с оптимизационными задачами в непрерывных пространствах вполне естественно представлять гены напрямую вещественными числами. В этом случае хромосома есть вектор вещественных чисел (real-coded алгоритмы). Их точность определяется исключительно разрядной сеткой ЭВМ. Длина хромосомы совпадает с длиной вектора-решения оптимизационной задачи, каждый ген отвечает за одну переменную. Генотип объекта становится идентичным его фенотипу.

    Множество особей – потенциальных решений составляет популяцию. Поиск (суб)оптимального решения проблемы выполняется в процессе эволюции популяции - последовательного преобразования одного конечного множества решений в другое с помощью генетических операторов репродукции, кроссинговера и мутации.

    Предварительно простой ГА случайным образом генерирует начальную популяцию стрингов
    (хромосом). Затем алгоритм генерирует следующее поколение (популяцию), с помощью трех основных генетических операторов:

    \begin{enumerate}
        \item Оператор репродукции (ОР);
        \item Оператор скрещивания (кроссинговера, ОК);
        \item Оператор мутации (ОМ).
    \end{enumerate}

    ГА работает до тех пор, пока не будет выполнено заданное количество поколений (итераций)
    процесса эволюции или на некоторой генерации будет получено заданное качество или вследствие
    преждевременной сходимости при попадании в некоторый локальный оптимум. На Рис.~\ref{fig:alg} представлен простой генетический алгоритм.

    \begin{figure}[h!]
       \centering
       \includegraphics[width=0.9\linewidth]{img/alg.png}
       \caption{Простой генетический алгоритм}
       \label{fig:alg}
    \end{figure}

    \newpage
    \subsection{Основная терминология в генетических алгоритмах}

    \textbf{Ген} -- элементарный код в хромосоме $s_i$, называемый также знаком или детектором 
    (в классическом ГА $s_i = 0, 1$).

    \textbf{Хромосома} -- упорядоченная последовательность генов в виде закодированной структуры 
    данных $S = (s_1, s_2, \ldots, s_n)$, определяющая решение. Может быть представлена как двоичная 
    последовательность (где $s_i = 0, 1$) или как вектор вещественных чисел (real-coded представление).

    \textbf{Локус} -- местоположение (позиция, номер бита) данного гена в хромосоме.

    \textbf{Аллель} -- значение, которое принимает данный ген (например, 0 или 1).

    \textbf{Особь} -- одно потенциальное решение задачи (представляемое хромосомой).

    \textbf{Популяция} -- множество особей (хромосом), представляющих потенциальные решения.

    \textbf{Поколение} -- текущая популяция ГА на данной итерации алгоритма.

    \textbf{Генотип} -- набор хромосом данной особи. В популяции могут использоваться как отдельные 
    хромосомы, так и целые генотипы.

    \textbf{Генофонд} -- множество всех возможных генотипов.

    \textbf{Фенотип} -- набор значений, соответствующий данному генотипу. Это декодированное множество 
    параметров задачи (например, десятичное значение $x$, соответствующее двоичному коду).

    \textbf{Размер популяции $N$} -- число особей в популяции.

    \textbf{Число поколений} -- количество итераций, в течение которых производится поиск.

    \textbf{Селекция} -- совокупность правил, определяющих выживание особей на основе значений целевой функции.

    \textbf{Эволюция популяции} -- чередование поколений, в которых хромосомы изменяют свои признаки, 
    чтобы каждая новая популяция лучше приспосабливалась к среде.

    \textbf{Фитнесс-функция} -- функция полезности, определяющая меру приспособленности особи. 
    В задачах оптимизации она совпадает с целевой функцией или описывает близость к оптимальному решению.

    \subsection{Генетические операторы}

    \subsubsection{Оператор репродукции}

    Репродукция -- процесс копирования хромосом в промежуточную популяцию для дальнейшего 
    ``размножения'' в соответствии со значениями фитнесс-функции. В данной работе рассматривается метод колеса рулетки. Каждой хромосоме соответствует сектор, пропорциональный значению фитнесс-функции. 
    Хромосомы с большим значением имеют больше шансов попасть в следующее поколение.

    \subsubsection{Операторы кроссинговера для real-coded алгоритмов}

    Оператор скрещивания непрерывного ГА (кроссовер) порождает одного или нескольких потомков от двух хромосом. Требуется из двух векторов вещественных чисел получить новые векторы по определённым законам. Большинство real-coded алгоритмов генерируют новые векторы в окрестности родительских пар.

    Пусть $C_1=(c_{11},c_{21},\ldots,c_{n1})$ и $C_2=(c_{12},c_{22},\ldots,c_{n2})$ -- две хромосомы, выбранные оператором селекции для скрещивания.

    \textbf{Арифметический кроссовер (arithmetical crossover):} создаются два потомка $H_1=(h_{11},\ldots,h_{n1})$, $H_2=(h_{12},\ldots,h_{n2})$, где:
    $$h_{k1}=w \cdot c_{k1}+(1-w) \cdot c_{k2}$$
    $$h_{k2}=w \cdot c_{k2}+(1-w) \cdot c_{k1}$$
    где $k=1,\ldots,n$, $w$ -- весовой коэффициент из интервала $[0;1]$.

    \begin{figure}[h!]
       \centering
       \includegraphics[width=0.5\linewidth]{img/arithmetic_crossover.png}
       \caption{Арифметический кроссовер}
       \label{fig:arithmetic_crossover}
    \end{figure}

    \textbf{Геометрический кроссовер (geometrical crossover):} создаются два потомка $H_1=(h_{11},\ldots,h_{n1})$, $H_2=(h_{12},\ldots,h_{n2})$, где:
    $$h_{k1}=(c_{k1})^w \cdot (c_{k2})^{(1-w)}$$
    $$h_{k2}=(c_{k2})^w \cdot (c_{k1})^{(1-w)}$$
    где $w$ -- случайное число из интервала $[0;1]$.

    \begin{figure}[h!]
       \centering
       \includegraphics[width=0.5\linewidth]{img/geometric_crossover.png}
       \caption{Геометрический кроссовер}
       \label{fig:geometric_crossover}
    \end{figure}

    \textbf{Смешанный кроссовер (BLX-alpha crossover):} генерируется один потомок $H=(h_1,\ldots,h_k,\ldots,h_n)$, где $h_k$ -- случайное число из интервала $[c_{min}-I \cdot \alpha, c_{max}+I \cdot \alpha]$, $c_{min}=\min(c_{k1},c_{k2})$, $c_{max}=\max(c_{k1},c_{k2})$, $I=c_{max}-c_{min}$.

    \begin{figure}[h!]
       \centering
       \includegraphics[width=0.5\linewidth]{img/blx_crossover.png}
       \caption{Смешанный кроссовер}
       \label{fig:blx_crossover}
    \end{figure}

    \textbf{SBX кроссовер (Simulated Binary Crossover):} кроссовер, имитирующий двоичный, разработанный в 1995 году исследовательской группой под руководством K. Deb'а. Моделирует принципы работы двоичного оператора скрещивания, сохраняя важное свойство -- среднее значение функции приспособленности остаётся неизменным у родителей и их потомков.

    Создаются два потомка $H_k=(h_{1k}, \ldots, h_{jk}, \ldots, h_{nk})$, $k=1,2$, где:
    $$h_{j1} = 0.5[(1+\beta_k)c_{j1} + (1-\beta_k)c_{j2}]$$
    $$h_{j2} = 0.5[(1-\beta_k)c_{j1} + (1+\beta_k)c_{j2}]$$

    где $\beta_k \geq 0$ -- число, полученное по формуле:
    $$\beta_k = \begin{cases}
    (2u)^{\frac{1}{n+1}}, & \text{при } u \leq 0.5 \\
    \left(\frac{1}{2(1-u)}\right)^{\frac{1}{n+1}}, & \text{при } u > 0.5
    \end{cases}$$

    где $u \in (0,1)$ -- случайное число, распределённое по равномерному закону, $n \in [2,5]$ -- параметр кроссовера. Увеличение $n$ повышает вероятность появления потомка в окрестности родителей.

    \begin{figure}[h!]
       \centering
       \includegraphics[width=0.7\linewidth]{img/sbx_crossover.png}
       \caption{SBX кроссовер}
       \label{fig:sbx_crossover}
    \end{figure}

    \subsubsection{Операторы мутации для real-coded алгоритмов}

    В качестве оператора мутации наибольшее распространение получили: случайная и неравномерная мутация.

    \textbf{Случайная мутация (random mutation):} ген, подлежащий изменению, принимает случайное значение из интервала своего изменения.

    \textbf{Неравномерная мутация (non-uniform mutation):} из особи случайно выбирается точка $c_k$ с разрешёнными пределами изменения $[c_{kl}, c_{kr}]$. Точка меняется на:
    $$c_k' = \begin{cases}
    c_k + \Delta(t, c_{kr} - c_k), & \text{при } a = 1 \\
    c_k - \Delta(t, c_k - c_{kl}), & \text{при } a = 0
    \end{cases}$$

    где $a$ -- случайно выбранное направление изменения, $\Delta(t, y)$ -- функция, возвращающая случайную величину в пределах $[0, y]$ таким образом, что при увеличении $t$ среднее возвращаемое значение уменьшается:
    $$\Delta(t, y) = y \cdot r \cdot \left(1 - \frac{t}{T}\right)^b$$

    где $r$ -- случайная величина на интервале $[0, 1]$, $t$ -- текущая эпоха работы генетического алгоритма, $T$ -- общее разрешённое число эпох алгоритма, $b$ -- задаваемый пользователем параметр, определяющий степень зависимости от числа эпох.

    \newpage
    \section{Особенности реализации}
    В рамках работы создана мини-библиотека \texttt{gen.py} для экспериментов с real-coded
    генетическим алгоритмом для многомерных функций. Второй модуль
    \texttt{expirements.py} организует серийные эксперименты (перебор параметров,
    форматирование и сохранение результатов).

    \begin{itemize}
        \item \textbf{Кодирование особей}: каждая хромосома представлена как \texttt{np.ndarray} вещественных чисел (\texttt{Chromosome = NDArray[np.float64]}). Длина хромосомы соответствует размерности задачи оптимизации. Популяция -- список хромосом (\texttt{Population = list[Chromosome]}). Инициализация случайными векторами в заданном диапазоне:
        \begin{itemize}
            \item \texttt{initialize\_population(pop\_size: int, x\_min: Chromosome, x\_max:}\\ \texttt{Chromosome) -> Population}
        \end{itemize}
        \item \textbf{Фитнесс и минимум/максимум}: целевая функция принимает хромосому (вектор) и возвращает скалярное значение фитнесса. Для режима минимизации используется внутреннее преобразование при селекции (сдвиг на минимальное значение), что позволяет применять рулетку при отрицательных значениях:
        \begin{itemize}
            \item \texttt{eval\_population(population: Population, fitness\_func: FitnessFn) -> Fitnesses}
            \item Логика режима минимизации в \texttt{genetic\_algorithm(config: GARunConfig) -> GARunResult}
        \end{itemize}
        \item \textbf{Селекция (рулетка)}: вероятности нормируются после сдвига на минимальное значение в поколении (устойчиво к отрицательным фитнессам). Функция:
        \texttt{reproduction(population: Population, fitnesses: Fitnesses) -> Population}.
        \item \textbf{Кроссинговер}: реализованы арифметический и геометрический кроссоверы для real-coded алгоритмов. Кроссинговер выполняется попарно по перемешанной популяции с вероятностью $p_c$. Функции:
        \begin{itemize}
            \item \texttt{arithmetical\_crossover\_fn(p1: Chromosome, p2: Chromosome, w: float) -> tuple[Chromosome, Chromosome]}
            \item \texttt{geometrical\_crossover\_fn(p1: Chromosome, p2: Chromosome, w: float) -> tuple[Chromosome, Chromosome]}
            \item \texttt{crossover(population: Population, pc: float, crossover\_fn: CrossoverFn) -> Population}
        \end{itemize}
        \item \textbf{Мутация}: случайная мутация -- с вероятностью $p_m$ на хромосому изменяется один случайно выбранный ген на случайное значение из допустимого диапазона. Функции:
        \begin{itemize}
            \item \texttt{build\_random\_mutation\_fn(x\_min: Chromosome, x\_max: Chromosome) -> MutationFn}
            \item \texttt{mutation(population: Population, pm: float, mutation\_fn: MutationFn) -> Population}
        \end{itemize}

        \item \textbf{Критерий остановки}: поддерживается критерий по среднему значению фитнесс-функции в популяции и максимальному количеству поколений. Хранится история всех поколений. Проверка выполняется в функции:
        
        \texttt{genetic\_algorithm(config: GARunConfig) -> GARunResult}.
        \item \textbf{Визуализация}: для двумерных функций реализованы 3D-графики поверхности и 2D-контурные графики с отображением популяций. Функции:
        \begin{itemize}
            \item \texttt{plot\_fitness\_surface(fitness\_func: FitnessFn, x\_min: Chromosome, x\_max: Chromosome, ax: Axes3D)}
            \item \texttt{plot\_fitness\_contour(fitness\_func: FitnessFn, x\_min: Chromosome, x\_max: Chromosome, ax: Axes)}
            \item \texttt{save\_generation(generation: Generation, history: list[Generation], config: GARunConfig)}
        \end{itemize}
        \item \textbf{Измерение времени}: длительность вычислений возвращается в миллисекундах как часть \texttt{GARunResult.time\_ms}.
        \item \textbf{Файловая организация}: результаты экспериментов сохраняются иерархически в структуре \texttt{experiments/N/} с таблицами результатов в формате CSV. Задействованные функции:
        \begin{itemize}
            \item \texttt{clear\_results\_directory(results\_dir: str) -> None}
            \item \texttt{run\_single\_experiment(pop\_size: int, pc: float, pm: float) -> tuple[float, float, float, float]}
            \item \texttt{run\_experiments\_for\_population(pop\_size: int) -> PrettyTable}
        \end{itemize}
    \end{itemize}

    В модуле \texttt{expirements.py} задаётся целевая функция axis parallel hyper-ellipsoid: $f(x, y) = x^2 + 2y^2$ и параметры экспериментов.
    Серийные запуски и сохранение результатов реализованы в функциях \texttt{run\_single\_experiment}, \texttt{run\_experiments\_for\_population} и \texttt{main}.

    \newpage
    \section{Результаты работы}
    На Рис.~\ref{fig:gen1}--\ref{fig:lastgen} представлены результаты работы генетического алгоритма со следующими параметрами:
    \begin{itemize}
        \item $N = 25$ -- размер популяции.
        \item $p_c = 0.5$ -- вероятность кроссинговера.
        \item $p_m = 0.01$ -- вероятность мутации.
        \item $0.05$ -- минимальное среднее значение фитнесс функции по популяции для остановки алгоритма. Глобальный минимум функции равен $f(0, 0) = 0$.
        \item Использован арифметический кроссовер для real-coded хромосом.
    \end{itemize}

    С каждым поколением точность найденного минимума становится выше. Популяция постепенно сходится к глобальному минимуму в точке $(0, 0)$. На графиках показаны 2D-контурный график (a) и 3D-поверхность целевой функции с точками популяции текущего поколения (b) и (c).

    \begin{figure}[h!]
       \centering
       \includegraphics[width=1\linewidth]{img/results/generation_001.png}
       \caption{График целевой функции и популяции поколения №1}
       \label{fig:gen1}
    \end{figure}

    \begin{figure}[h!]
       \centering
       \includegraphics[width=1\linewidth]{img/results/generation_002.png}
       \caption{График целевой функции и популяции поколения №2}
       \label{fig:gen2}
    \end{figure}

    \begin{figure}[h!]
       \centering
       \includegraphics[width=1\linewidth]{img/results/generation_003.png}
       \caption{График целевой функции и популяции поколения №3}
       \label{fig:gen3}
    \end{figure}


    \begin{figure}[h!]
       \centering
       \includegraphics[width=1\linewidth]{img/results/generation_005.png}
       \caption{График целевой функции и популяции поколения №5}
       \label{fig:gen5}
    \end{figure}

    \begin{figure}[h!]
       \centering
       \includegraphics[width=1\linewidth]{img/results/generation_007.png}
       \caption{График целевой функции и популяции поколения №7}
       \label{fig:gen7}
    \end{figure}

    \begin{figure}[h!]
       \centering
       \includegraphics[width=1\linewidth]{img/results/generation_010.png}
       \caption{График целевой функции и популяции поколения №10}
       \label{fig:gen10}
    \end{figure}

    \begin{figure}[h!]
       \centering
       \includegraphics[width=1\linewidth]{img/results/generation_013.png}
       \caption{График целевой функции и популяции поколения №13}
       \label{fig:lastgen}
    \end{figure}


    \newpage
    \phantom{text}
    \newpage
    \phantom{text}
    
    \newpage
    \section{Исследование реализации}
    \subsection{Проведение измерений}
    В рамках лабораторной работы необходимо было исследовать зависимость времени выполнения задачи и количества поколений от популяции и вероятностей кроссинговера и мутации хромосомы

    Для исследования были выбраны следующие значения параметров:
    \begin{itemize}
        \item $N = 10, 25, 50, 100$ -- размер популяции.
        \item $p_c = 0.3, 0.4, 0.5, 0.6, 0.7, 0.8$ -- вероятность кроссинговера.
        \item $p_m = 0.001, 0.01, 0.05, 0.1, 0.2$ -- вероятность мутации.
    \end{itemize}

    Результаты измерений представлены в таблицах \ref{tab:pc_pm_results_10}--\ref{tab:pc_pm_results_100}. В ячейках указано время в миллисекундах нахождения минимума функции. В скобках указано количество поколений, за которое было найдено решение. Если в ячейке стоит прочерк, то это означает, что решение не было найдено за 200 поколений. Лучшее значение по времени выполнения для каждого размера популяции выделено жирным шрифтом.

    \newcolumntype{Y}{>{\centering\arraybackslash}X}

    \begin{table}[h!]
        \centering
        \small
        \caption{Результаты для $N = 10$}
        \begin{tabularx}{\linewidth}{l *{5}{Y}}
        \toprule
        $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\
        \midrule
        \textbf{0.3} & — & — & 8.9 (87) & 5.3 (46) & — \\
        \textbf{0.4} & — & — & 19.1 (127) & 14.2 (111) & 2.9 (24) \\
        \textbf{0.5} & — & — & 13.3 (117) & 13.7 (123) & 10.1 (74) \\
        \textbf{0.6} & — & — & 7.8 (68) & 14.4 (100) & 7.5 (57) \\
        \textbf{0.7} & — & 6.9 (59) & — & \textbf{1.1 (9)} & — \\
        \textbf{0.8} & — & — & — & 5.4 (41) & — \\
        \bottomrule
        \end{tabularx}
        \label{tab:pc_pm_results_10}
    \end{table}


    \begin{table}[h!]
        \centering
        \small
        \caption{Результаты для $N = 25$}
        \begin{tabularx}{\linewidth}{l *{5}{Y}}
        \toprule
        $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\
        \midrule
        \textbf{0.3} & — & 3.2 (17) & 11.8 (55) & — & — \\
        \textbf{0.4} & — & 2.6 (11) & 4.8 (22) & 17.7 (85) & — \\
        \textbf{0.5} & \textbf{1.9 (10)} & — & 29.0 (137) & — & — \\
        \textbf{0.6} & — & 2.7 (13) & 17.6 (81) & 35.7 (157) & — \\
        \textbf{0.7} & — & 2.6 (13) & 9.1 (38) & 28.3 (119) & — \\
        \textbf{0.8} & — & 17.6 (76) & 13.7 (57) & 23.4 (95) & — \\
        \bottomrule
        \end{tabularx}
        \label{tab:pc_pm_results_25}
    \end{table}


    \begin{table}[h!]
        \centering
        \small
        \caption{Результаты для $N = 50$}
        \begin{tabularx}{\linewidth}{l *{5}{Y}}
        \toprule
        $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\
        \midrule
        \textbf{0.3} & 5.6 (19) & 4.7 (15) & — & — & — \\
        \textbf{0.4} & \textbf{3.3 (11)} & 48.7 (148) & — & — & — \\
        \textbf{0.5} & 4.0 (12) & 8.0 (24) & 56.5 (151) & — & — \\
        \textbf{0.6} & 3.6 (10) & 4.9 (14) & 29.3 (77) & — & — \\
        \textbf{0.7} & 3.9 (11) & 36.5 (87) & 44.2 (107) & — & — \\
        \textbf{0.8} & — & 76.4 (189) & 17.3 (41) & — & — \\
        \bottomrule
        \end{tabularx}
        \label{tab:pc_pm_results_50}
    \end{table}


    \begin{table}[h!]
        \centering
        \small
        \caption{Результаты для $N = 100$}
        \begin{tabularx}{\linewidth}{l *{5}{Y}}
        \toprule
        $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\
        \midrule
        \textbf{0.3} & 7.8 (14) & 12.6 (22) & — & — & — \\
        \textbf{0.4} & — & 14.9 (25) & — & — & — \\
        \textbf{0.5} & 7.3 (12) & 10.9 (17) & — & — & — \\
        \textbf{0.6} & 8.4 (13) & 12.4 (16) & — & — & — \\
        \textbf{0.7} & 9.9 (14) & 11.1 (15) & — & — & — \\
        \textbf{0.8} & \textbf{7.0 (10)} & 28.4 (38) & — & — & — \\
        \bottomrule
        \end{tabularx}
        \label{tab:pc_pm_results_100}
    \end{table}

        
    \newpage
    \phantom{text}
    \newpage
    \phantom{text}
    \subsection{Анализ результатов}
    
    Ключевые наблюдения:
    \begin{itemize}
        \item При небольших популяциях ($N=10$) лучший результат достигается при $p_c=0.7$, $p_m=0.1$ (1.1 мс, 9 пок.). Многие комбинации с низкой мутацией ($p_m \leq 0.01$) и высокой мутацией ($p_m=0.2$) не сходятся за 200 поколений.
        \item Для $N=25$ оптимальные параметры: $p_c=0.5$, $p_m=0.001$ (1.9 мс, 10 пок.) — лучший результат среди всех экспериментов. Большинство комбинаций с $p_m \geq 0.05$ показывают плохую сходимость.
        \item Для $N=50$ минимальное время при $p_c=0.4$, $p_m=0.001$ (3.3 мс, 11 пок.). Почти все комбинации с $p_m \geq 0.05$ не сходятся, что указывает на чувствительность к избыточной мутации.
        \item Для $N=100$ лучший результат при $p_c=0.8$, $p_m=0.001$ (7.0 мс, 10 пок.). Только комбинации с очень низкой мутацией обеспечивают сходимость.
        \item С ростом размера популяции диапазон работающих параметров сужается: для больших $N$ критична минимальная мутация ($p_m=0.001$).
    \end{itemize}
    
    Практические выводы:
    \begin{itemize}
        \item Для данной задачи axis parallel hyper-ellipsoid function оптимальная стратегия — использование очень низких значений мутации ($p_m=0.001$) для популяций $N \geq 25$.
        \item Малые популяции ($N=10$) требуют умеренной мутации ($p_m=0.1$) для обеспечения достаточного разнообразия.
        \item Функция показывает высокую чувствительность к параметрам: большинство неоптимальных комбинаций приводят к отсутствию сходимости за 200 поколений.
        \item Лучшее соотношение скорости и надёжности показывает $N=25$ с минимальной мутацией — компромисс между вычислительными затратами и качеством решения.
    \end{itemize}

    \newpage
    \section{Ответ на контрольный вопрос}

    \textbf{Вопрос}: Опишите понятие «оптимизационная задача».

    \textbf{Ответ}: Оптимизационная задача — это математическая задача, в которой требуется найти такие значения переменных, при которых некоторая функция, называемая целевой, принимает наибольшее или наименьшее значение. При этом искомые значения должны удовлетворять определённым условиям или ограничениям, задающим допустимую область решений. Цель оптимизации заключается в выборе наилучшего варианта среди множества возможных с точки зрения заданного критерия эффективности.

    Такие задачи широко применяются в науке, технике, экономике и управлении для рационального распределения ресурсов, минимизации затрат или максимизации прибыли. В зависимости от формы целевой функции и ограничений оптимизационные задачи могут быть линейными, нелинейными, дискретными или непрерывными. Их решение позволяет принимать обоснованные решения и повышать эффективность различных процессов и систем.
        

    \newpage
    \section*{Заключение}
    \addcontentsline{toc}{section}{Заключение}

    В ходе второй лабораторной работы была успешно решена задача оптимизации функции Axis parallel hyper-ellipsoid function с использованием генетических алгоритмов:

    \begin{enumerate}
        \item Изучен теоретический материал о real-coded генетических алгоритмах и различных операторах кроссинговера и мутации;
        \item Создана программная библиотека на языке Python с реализацией арифметического и геометрического кроссоверов, случайной мутации и селекции методом рулетки;
        \item Проведено исследование влияния параметров ГА на эффективность поиска для популяций размером 10, 25, 50 и 100 особей;
    \end{enumerate}

\newpage
\section*{Список литературы}
\addcontentsline{toc}{section}{Список литературы}

\vspace{-1.5cm}
\begin{thebibliography}{0}
    \bibitem{vostrov}
    Методические указания по выполнению лабораторных работ к курсу «Генетические алгоритмы», 119 стр.
\end{thebibliography}

\end{document}