Генетичні алгоритми: як еволюція розв'язує складні задачі

Еволюція створила око, крило й імунну систему без жодного проєктувальника, що спрямовував би процес. Генетичні алгоритми запозичують цей прийом — кодуючи кандидатні розв'язки як цифрові хромосоми та дозволяючи відбору, схрещуванню й мутації обшукувати величезні простори, де перебір грубою силою був би обчислювально безнадійним.

Еволюція як оптимізація

У 1975 році інформатик Джон Голланд опублікував працю Adaptation in Natural and Artificial Systems ("Адаптація в природних і штучних системах"), заклавши теоретичний фундамент для генетичних алгоритмів. Його центральна ідея була елегантною: природний відбір — це алгоритм пошуку. Еволюція не слідує плану чи градієнту — вона підтримує популяцію кандидатних розв'язків, перевіряє кожен на відповідність середовищу й дозволяє найкращим розмножуватися, тоді як решта гине. З покоління в покоління цей сліпий процес знаходить надзвичайно витончені розв'язки надзвичайно складних задач.

Паралель із комп'ютерною оптимізацією пряма. Визначте функцію пристосованості — міру того, наскільки хороший будь-який заданий розв'язок. Почніть із випадкової популяції кандидатних розв'язків. Багаторазово відбирайте більш пристосованих особин для розмноження, комбінуйте їхній "генетичний матеріал", вносьте випадкові зміни й оцінюйте нове покоління. Повторюйте, доки не з'явиться достатньо хороший розв'язок.

Похідна не потрібна. Гладкий ландшафт не передбачається. Попереднє знання структури розв'язку не потрібне. Алгоритм шукає, пробуючи різні варіанти, зберігаючи те, що працює, і відкидаючи те, що не працює — так само, як чотири мільярди років біологічної еволюції породили все розмаїття життя на Землі.

Кодування розв'язків у вигляді хромосом

Перш ніж еволюція зможе працювати над задачею, задачу потрібно перекласти у форму, з якою еволюція може діяти. У біологічній еволюції хромосома — це послідовність нуклеотидів, що кодує інструкції для побудови організму. У генетичних алгоритмах хромосома — це рядок бітів, чисел або символів, що кодує кандидатний розв'язок.

Вибір кодування не тривіальний — він кардинально визначає, що алгоритм може знайти і як швидко він це знаходить. Розгляньмо задачу комівояжера: за списком міст знайти найкоротший маршрут, що відвідує кожне рівно один раз і повертається до початку. Природне кодування — це перестановка індексів міст: для п'яти міст хромосома може мати вигляд [3, 1, 4, 2, 5], тобто "відвідати місто 3, потім 1, потім 4, потім 2, потім 5". Функція пристосованості — просто обернена до загальної довжини маршруту: коротші маршрути мають вищу пристосованість.

Інші стилі кодування підходять для інших задач. Задачі неперервної оптимізації часто використовують хромосоми з дійсними значеннями. Архітектури нейронних мереж можна кодувати як рядки, що вказують розміри шарів і схеми з'єднань. Задачі планування кодують хромосоми як упорядковані списки завдань. У кожному випадку кодування має допускати змістовну рекомбінацію — змішування двох хороших розв'язків має мати реальний шанс дати ще один хороший розв'язок, а не випадковий шум.

Генетичні оператори

Еволюційний пошук рухають три операції:

Разом ці три оператори реалізують паралельний пошук: уся популяція одночасно досліджує простір розв'язків, а інформація про хороші області передається через схрещування щопокоління.

Збіжність і різноманітність

Центральне протиріччя будь-якого генетичного алгоритму — це баланс між дослідженням і використанням. Популяція, що збігається надто швидко — коли всі особини стають майже ідентичними — застрягає в тому локальному оптимумі, який знайшла першим, і не може відкрити кращі розв'язки в інших частинах простору пошуку. Це називається передчасною збіжністю, і це найпоширеніша причина невдач генетичних алгоритмів.

Кілька технік допомагають підтримувати різноманітність. Розподіл пристосованості (fitness sharing) штрафує особини, надто схожі на інших у популяції, розподіляючи пошук по кількох піках ландшафту пристосованості. Острівні моделі запускають кілька підпопуляцій паралельно з періодичною міграцією між ними — кожен острів може збігатися незалежно, але мігранти запобігають повній ізоляції. Ніширування явно резервує місце в популяції для розв'язків із різних областей простору пошуку.

Правильний баланс залежить від задачі. Для задач із єдиним глобальним оптимумом на відносно гладкому ландшафті добре працює агресивний відбір і низька мутація. Для сильно мультимодальних задач із багатьма локальними оптимумами схожої пристосованості підтримка різноманітності критично важлива — мета полягає в тому, щоб картографувати весь ландшафт, а не просто піднятися на найближчий пагорб.

Спостерігайте за еволюцією популяцій у реальному часі: наш симулятор еволюційної теорії ігор дозволяє засіяти популяцію різними стратегіями й спостерігати за природним відбором — співпрацею, зрадою і всім, що між ними — упродовж поколінь. Динаміка збіжності й різноманітності стає видимою одразу.

Реальні застосування

Генетичні алгоритми знайшли розв'язки інженерних задач, які людям-конструкторам було б непросто знайти самостійно — а в деяких випадках навіть уявити:

Генетичні алгоритми проти інших методів оптимізації

Генетичні алгоритми не завжди правильний інструмент. Градієнтний спуск — робочий кінь машинного навчання — набагато швидший, коли ландшафт пристосованості гладкий і диференційовний, бо він може напряму слідувати градієнту до локального оптимуму. ГА потребують багатьох оцінок пристосованості й повільніші порівняно з ним у задачах, де застосовний числовий аналіз.

Але ГА розкриваються там, де градієнтні методи зазнають невдачі:

Імітація відпалу (simulated annealing) розв'язує деякі з тих самих задач, що й ГА — вона може вибиратися з локальних оптимумів, іноді приймаючи гірші розв'язки, причому ймовірність цього зменшується з часом, як охолодження металу. Але вона працює з єдиним розв'язком, а не з популяцією, втрачаючи перевагу паралельного пошуку. Оптимізація роєм часток (particle swarm optimization) використовує популяцію, подібно до ГА, але оновлює розв'язки за допомогою векторів швидкості, а не генетичних операторів, і чудово підходить для задач неперервної оптимізації.

Тривкий урок генетичних алгоритмів полягає не в тому, що вони завжди перемагають — а в тому, що еволюція як алгоритм набагато загальніша й потужніша, ніж здається на перший погляд. Маючи лише функцію пристосованості й достатньо поколінь, вона здатна підкорити гори складності, які жодному інженерові не подужати самотужки.

Часті запитання

Що таке генетичний алгоритм?

Генетичний алгоритм (ГА) — це метод оптимізації та пошуку, натхненний біологічною еволюцією. Він підтримує популяцію кандидатних розв'язків, оцінює кожен за допомогою функції пристосованості, а потім створює нові покоління через відбір (перевагу отримують більш пристосовані особини), схрещування (комбінування розв'язків батьків) та мутацію (випадкові зміни). З покоління в покоління популяція еволюціонує в бік кращих розв'язків.

Що таке функція пристосованості?

Функція пристосованості оцінює, наскільки добре кожен кандидатний розв'язок вирішує задачу. Вона присвоює кожній особині в популяції числовий бал — вища пристосованість означає кращий розв'язок. Функція пристосованості кодує мету оптимізації: для задачі комівояжера це може бути від'ємна загальна довжина маршруту, для машинного навчання — точність прогнозу.

Що таке схрещування в генетичних алгоритмах?

Схрещування (рекомбінація) поєднує генетичний матеріал двох батьківських розв'язків для створення нащадка. У одноточковому схрещуванні випадкова точка розриву ділить хромосому кожного з батьків; нащадок отримує першу частину від батька A, а другу — від батька B. Інші варіанти включають двоточкове схрещування, рівномірне схрещування (кожен ген незалежно обирається від одного з батьків) та специфічні для задачі оператори для структурованих кодувань.

Як працює відбір у генетичних алгоритмах?

Відбір визначає, які особини розмножуються. Поширені методи: турнірний відбір (випадково обирається k особин, розмножується найпристосованіша), відбір методом рулетки (ймовірність пропорційна пристосованості), ранговий відбір (ймовірність базується на ранзі пристосованості, а не на її абсолютному значенні) та елітизм (найкращі особини завжди зберігаються в наступному поколінні). Тиск відбору визначає, наскільки швидко алгоритм збігається.

Що таке мутація в генетичних алгоритмах і чому вона важлива?

Мутація випадково змінює один або кілька генів особини з невеликою ймовірністю (зазвичай 0,1–5%). Вона запобігає передчасній збіжності до локальних оптимумів, вносячи новий генетичний матеріал, відсутній у поточній популяції. Без мутації алгоритм може досліджувати лише комбінації вже наявних шаблонів і ризикує назавжди застрягти в неоптимальних розв'язках.

Що таке генетичне програмування і чим воно відрізняється від генетичних алгоритмів?

Генетичне програмування (ГП) еволюціонує програми або символьні вирази (зазвичай представлені у вигляді дерев), а не рядки фіксованої довжини. У той час як ГА оптимізують фіксований набір параметрів, ГП здатне виявити саму структуру розв'язку — знайти форму рівняння, дерева рішень чи програми. ГП застосовували для повторного відкриття фізичних законів і автоматичного проєктування електронних схем.

Які обмеження мають генетичні алгоритми?

ГА мають кілька обмежень: вони потребують багатьох оцінок пристосованості (що дорого для повільних симуляцій), кодування розв'язку у вигляді хромосоми нетривіальне для складних задач, вони можуть передчасно збігатися до локальних оптимумів, налаштування гіперпараметрів (розмір популяції, частота мутацій, частота схрещування) суттєво впливає на продуктивність, і вони не дають гарантій збіжності, на відміну від градієнтних методів для опуклих задач.

Що таке схема в теорії генетичних алгоритмів?

Схема (множина: схемата) — це шаблон, що представляє підмножину хромосом, які поділяють конкретні значення на деяких позиціях. Теорема схем (Голланд, 1975) описує, як короткі схеми з вищою за середню пристосованістю та низькою ймовірністю позиційного руйнування зростають у частоті експоненційно з покоління в покоління. Ця гіпотеза будівельних блоків пояснює, чому працюють ГА: короткі високопристосовані шаблони поєднуються, утворюючи довші, ще пристосованіші шаблони.

Як генетичні алгоритми порівнюються з градієнтним спуском?

Градієнтний спуск ефективно оптимізує гладкі, неперервні, диференційовні функції, слідуючи градієнту вниз. ГА працюють без градієнтної інформації, обробляючи недиференційовні, розривні або зашумлені ландшафти пристосованості, комбінаторні задачі та мультимодальні функції. ГА досліджують широко (глобальний пошук), тоді як градієнтний спуск використовує локально. Гібридні підходи поєднують дослідження ГА з локальним уточненням градієнтом.

Які є успішні реальні застосування генетичних алгоритмів?

Помітні застосування ГА включають: еволюціоновані конструкції антен NASA (нерегулярні, але вкрай ефективні форми), оптимізацію розкладу авіакомпаній і маршрутизацію екіпажів, проєктування молекул ліків і згортання білків, ігровий ШІ (еволюціоновані стратегії для Doom, Тетрісу), пошук архітектур нейронних мереж для глибокого навчання, оптимізацію портфеля у фінансах та інженерне проєктування (лопаті турбін, оптимізація топології конструкцій).