# Генетические алгоритмы ## [Тест перед лекцией](https://ff-quizzes.netlify.app/en/ai/quiz/41) **Генетические алгоритмы** (GA) основаны на **эволюционном подходе** к искусственному интеллекту, где методы эволюции популяции используются для получения оптимального решения заданной задачи. Они были предложены в 1975 году [Джоном Генри Холландом](https://wikipedia.org/wiki/John_Henry_Holland). Генетические алгоритмы базируются на следующих идеях: * Валидные решения задачи могут быть представлены в виде **генов** * **Скрещивание** позволяет объединить два решения, чтобы получить новое валидное решение * **Отбор** используется для выбора более оптимальных решений с помощью некоторой **функции приспособленности** * **Мутации** вводятся для дестабилизации оптимизации и выхода из локального минимума Если вы хотите реализовать генетический алгоритм, вам потребуется следующее: * Найти способ кодирования решений задачи с помощью **генов** g∈Γ * На множестве генов Γ необходимо определить **функцию приспособленности** fit: Γ→**R**. Меньшие значения функции соответствуют лучшим решениям. * Определить механизм **скрещивания**, чтобы объединить два гена и получить новое валидное решение crossover: Γ2→Γ. * Определить механизм **мутации** mutate: Γ→Γ. Во многих случаях скрещивание и мутация представляют собой достаточно простые алгоритмы для манипуляции генами как числовыми последовательностями или битовыми векторами. Конкретная реализация генетического алгоритма может варьироваться в зависимости от задачи, но общая структура выглядит следующим образом: 1. Выбрать начальную популяцию G⊂Γ 2. Случайным образом выбрать одну из операций, которая будет выполнена на этом шаге: скрещивание или мутация 3. **Скрещивание**: * Случайным образом выбрать два гена g1, g2 ∈ G * Вычислить скрещивание g=crossover(g1,g2) * Если fit(g)1) или fit(g)2) - заменить соответствующий ген в популяции на g. 4. **Мутация** - выбрать случайный ген g∈G и заменить его на mutate(g) 5. Повторять с шага 2, пока не будет достигнуто достаточно малое значение fit или пока не будет достигнут лимит на количество шагов. ## Типичные задачи Задачи, которые обычно решаются с помощью генетических алгоритмов: 1. Оптимизация расписания 1. Оптимальная упаковка 1. Оптимальная нарезка 1. Ускорение полного перебора ## ✍️ Упражнения: Генетические алгоритмы Продолжите обучение в следующих ноутбуках: Перейдите в [этот ноутбук](Genetic.ipynb), чтобы увидеть два примера использования генетических алгоритмов: 1. Справедливое разделение сокровищ 1. Задача о 8 ферзях ## Заключение Генетические алгоритмы используются для решения множества задач, включая логистику и задачи поиска. Эта область вдохновлена исследованиями, которые объединили темы психологии и компьютерных наук. ## 🚀 Задание "Генетические алгоритмы легко реализовать, но их поведение сложно понять." [источник](https://wikipedia.org/wiki/Genetic_algorithm) Проведите исследование, чтобы найти реализацию генетического алгоритма, например, для решения головоломки Судоку, и объясните, как он работает, в виде схемы или блок-схемы. ## [Тест после лекции](https://ff-quizzes.netlify.app/en/ai/quiz/42) ## Обзор и самостоятельное изучение Посмотрите [это отличное видео](https://www.youtube.com/watch?v=qv6UVOQ0F44), в котором рассказывается, как компьютер может научиться играть в Super Mario, используя нейронные сети, обученные генетическими алгоритмами. Мы узнаем больше о том, как компьютеры учатся играть в такие игры [в следующем разделе](../22-DeepRL/README.md). ## [Задание: Диофантово уравнение](Diophantine.ipynb) Ваша цель — решить так называемое **Диофантово уравнение** — уравнение с целыми корнями. Например, рассмотрим уравнение a+2b+3c+4d=30. Вам нужно найти целые корни, которые удовлетворяют этому уравнению. *Это задание вдохновлено [этой статьей](https://habr.com/post/128704/).* Подсказки: 1. Вы можете рассматривать корни в интервале [0;30] 1. В качестве гена можно использовать список значений корней Используйте [Diophantine.ipynb](Diophantine.ipynb) как отправную точку. ---