diff --git a/lab1/report/.gitignore b/lab1/report/.gitignore new file mode 100644 index 0000000..3cb5fd3 --- /dev/null +++ b/lab1/report/.gitignore @@ -0,0 +1,6 @@ +* + +!**/ +!.gitignore +!report.tex +!img/*.png \ No newline at end of file diff --git a/lab1/report/img/alg.png b/lab1/report/img/alg.png new file mode 100644 index 0000000..f55b76f Binary files /dev/null and b/lab1/report/img/alg.png differ diff --git a/lab1/report/img/cross1.png b/lab1/report/img/cross1.png new file mode 100644 index 0000000..f562b15 Binary files /dev/null and b/lab1/report/img/cross1.png differ diff --git a/lab1/report/img/cross2.png b/lab1/report/img/cross2.png new file mode 100644 index 0000000..d83f499 Binary files /dev/null and b/lab1/report/img/cross2.png differ diff --git a/lab1/report/report.tex b/lab1/report/report.tex new file mode 100644 index 0000000..e8af135 --- /dev/null +++ b/lab1/report/report.tex @@ -0,0 +1,308 @@ +\documentclass[a4paper, final]{article} +%\usepackage{literat} % Нормальные шрифты +\usepackage[14pt]{extsizes} % для того чтобы задать нестандартный 14-ый размер шрифта +\usepackage{tabularx} +\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{Лабораторная работа №1}\\ + \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{Дано:} Функция одной переменной $f(x) = \frac{\sin(x)}{x^2}$; промежуток нахождения решения $x \in [3.1, 20.0]$. + + \vspace{0.3cm} + \textbf{Требуется:} + + \begin{enumerate} + \item Разработать простой генетический алгоритм для нахождения минимума данной функции в заданном промежутке; + \item Исследовать зависимость времени поиска, числа поколений (генераций) и точности нахождения решения от числа особей в популяции и вероятности кроссинговера и мутации; + \item Вывести на экран график функции с указанием найденного экстремума для каждого поколения; + \item Сравнить найденное решение с действительным. + \end{enumerate} + + \textbf{Ограничения:} + \begin{enumerate} + \item $ \min f(x) = \frac{\sin(x)}{x^2} \approx -0.04957 $ + \item Точность решения составляет 3 знака после запятой. + \end{enumerate} + + + \newpage + \section{Теоретические сведения} + + Генетиче ские алгоритмы (ГА) используют принципы и терминологию, заимствованные у биологической науки – генетики. В ГА каждая особь представляет потенциальное решение некоторой + проблемы. В классическом ГА особь кодируется строкой двоичных символов – хромосомой, каждый + бит которой называется геном. Множество особей – потенциальных решений составляет популяцию. Поиск (суб)оптимального решения проблемы выполняется в процессе эволюции популяции + - последовательного преобразования одного конечного множества решений в другое с помощью + генетических операторов репродукции, кроссинговера и мутации. + + Предварительно простой ГА случайным образом генерирует начальную популяцию стрингов + (хромосом). Затем алгоритм генерирует следующее поколение (популяцию), с помощью трех основных генетических операторов: + + \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$). + + \textbf{Локус} -- местоположение (позиция, номер бита) данного гена в хромосоме. + + \textbf{Аллель} -- значение, которое принимает данный ген (например, 0 или 1). + + \textbf{Особь} -- одно потенциальное решение задачи (представляемое хромосомой). + + \textbf{Популяция} -- множество особей (хромосом), представляющих потенциальные решения. + + \textbf{Поколение} -- текущая популяция ГА на данной итерации алгоритма. + + \textbf{Генотип} -- набор хромосом данной особи. В популяции могут использоваться как отдельные + хромосомы, так и целые генотипы. + + \textbf{Генофонд} -- множество всех возможных генотипов. + + \textbf{Фенотип} -- набор значений, соответствующий данному генотипу. Это декодированное множество + параметров задачи (например, десятичное значение $x$, соответствующее двоичному коду). + + \textbf{Размер популяции $N$} -- число особей в популяции. + + \textbf{Число поколений} -- количество итераций, в течение которых производится поиск. + + \textbf{Селекция} -- совокупность правил, определяющих выживание особей на основе значений целевой функции. + + \textbf{Эволюция популяции} -- чередование поколений, в которых хромосомы изменяют свои признаки, + чтобы каждая новая популяция лучше приспосабливалась к среде. + + \textbf{Фитнесс-функция} -- функция полезности, определяющая меру приспособленности особи. + В задачах оптимизации она совпадает с целевой функцией или описывает близость к оптимальному решению. + + \subsection{Генетические операторы} + + \subsubsection{Оператор репродукции} + + Репродукция -- процесс копирования хромосом в промежуточную популяцию для дальнейшего + ``размножения'' в соответствии со значениями фитнесс-функции. В данной работе рассматривается метод колеса рулетки. Каждой хромосоме соответствует сектор, пропорциональный значению фитнесс-функции. + Хромосомы с большим значением имеют больше шансов попасть в следующее поколение. + + \subsubsection{Оператор скрещивания (кроссинговера)} + + Одноточечный кроссинговер выполняется следующим образом: + \begin{enumerate} + \item Из промежуточной популяции выбираются две хромосомы (родители). + \item Определяется случайная точка скрещивания $k \in [1, n-1]$, где $n$ -- длина хромосомы. + \begin{figure}[h!] + \centering + \includegraphics[width=0.5\linewidth]{img/cross1.png} + \label{fig:cross1} + \end{figure} + \item Две новые хромосомы (потомки) формируются путём обмена подстрок после точки $k$. + \begin{figure}[h!] + \centering + \includegraphics[width=0.35\linewidth]{img/cross2.png} + \label{fig:cross2} + \end{figure} + \end{enumerate} + + \subsubsection{Оператор мутации} + + Мутация применяется с малой вероятностью $P_M \approx 0.001$: + \begin{enumerate} + \item В хромосоме $A = a_1a_2 \ldots a_n$ выбирается случайная позиция $k$. + \item Ген $a_k$ инвертируется: $a_k' = \lnot a_k$. + \end{enumerate} + + + + \newpage + \section*{Заключение} + \addcontentsline{toc}{section}{Заключение} + + В ходе первой лабораторной работы: + + \begin{enumerate} + \item Был изучен теоретический материал, основная терминология ГА, генетические операторы, + использующиеся в простых ГА; + \item Реализована программа на языке Python для нахождения минимума заданной функции; + \item Проведено исследование зависимости времени выполнения программы и поколения от мощности популяции и коэффициентов кроссинговера и мутации. + \end{enumerate} + +\newpage +\section*{Список литературы} +\addcontentsline{toc}{section}{Список литературы} + +\vspace{-1.5cm} +\begin{thebibliography}{0} + \bibitem{vostrov} + Методические указания по выполнению лабораторных работ к курсу «Генетические алгоритмы», 119 стр. +\end{thebibliography} + +\end{document} \ No newline at end of file