# Генетичні алгоритми ## [Тест перед лекцією](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) як відправну точку. ---