Генетичні алгоритми: популяція, схрещування, мутація і добір на рюкзаку для походу
Геном і пристосованість, турнірний добір, одноточкове схрещування, мутація та елітизм, теорема про схеми й передчасна збіжність — на задачі про рюкзак із відомим оптимумом, від намету до FunSearch і AlphaEvolve.
Серія Основи ШІ Частина 27 з 52
- Мапа штучного інтелекту: що є що і як усе це пов’язано
- Коротка історія штучного інтелекту: від Тюрінга до мовних моделей
- Дані, модель, тренування, інференс: основні поняття на одному прикладі
- Як читати математичний запис: символи, індекси, суми та квантори
- Множини й відношення: конструктор, з якого складаються означення в ШІ
- Функції й відображення: чому кожна модель у ШІ — це функція
- Логіка й доведення: правила, за якими міркують у ШІ
- Графи й дерева: структура, на якій тримаються пошук і нейронні мережі
- Лінійна алгебра для машинного навчання: вектори, матриці й чому ШІ передусім множить
- Похідні, градієнт і правило ланцюжка: як модель дізнається, у якому напрямку вчитися
- Градієнтний спуск: як навчається модель
- Що таке ймовірність: від кидка кубика до аксіом Колмогорова
- Умовна ймовірність і теорема Баєса: як змінити оцінку, коли дізнаєтеся щось нове
- Випадкова величина і функція розподілу: одна функція, яка каже про розподіл усе
- Функція щільності та функція маси ймовірності: чому неперервна величина має в точці ймовірність нуль
- Математичне сподівання, дисперсія і коваріація: де лежить розподіл, наскільки він широкий і що з чим пов’язано
- Огляд розподілів ймовірностей: Бернуллі, біноміальний, Пуассона, рівномірний, нормальний і експоненційний
- Закон великих чисел і центральна гранична теорема: чому середні поводяться так передбачувано
- Статистика й оцінювання параметрів: максимальна правдоподібність, MAP і довірчі інтервали
- Теорія інформації: ентропія, перехресна ентропія і KL-дивергенція — звідки беруться функції втрат
- Пошук у просторі станів: BFS, DFS, UCS і A* з анімаціями
- Ігри та суперник: мінімакс, альфа-бета відсікання і Monte Carlo tree search
- Задоволення обмежень: бектрекінг, поширення обмежень і AC-3 на судоку та мапі чеських країв
- Логіка й системи, засновані на знаннях: пряме і зворотне виведення, резолюція та експертні системи
- Планування: STRIPS, світ кубиків, евристики з релаксації та планування в AI-агентах
- Локальний пошук та імітація відпалу: комівояжер через обласні центри Чехії
- Генетичні алгоритми: популяція, схрещування, мутація і добір на рюкзаку для походу
- Еволюційні стратегії і генетичне програмування: від правила однієї п’ятої до закону Кеплера
- Оптимізація мурашиною колонією: як феромоновий слід знаходить короткий шлях
- Оптимізація роєм частинок: інерція, власний досвід і досвід рою
- Нейроеволюція: еволюція ваг і форми нейронних мереж та алгоритм NEAT
- Нечіткі множини й функції належності: як записати «трохи тепло»
- Нечітка логіка та ймовірність: чому «трохи тепло» не означає «імовірно тепло»
- Нечітка логіка: t-норми, імплікації та правила ЯКЩО–ТО
- Нечітке керування: Мамдані та Суґено від вентилятора до маятника на візку
- Нечітка кластеризація: алгоритм fuzzy c-means і точки між кластерами
- Нейро-нечіткі системи (ANFIS): нечіткі правила, які навчаються з даних
- Марковські ланцюги: матриця переходів, стаціонарний розподіл і PageRank
- Приховані марковські моделі: алгоритм Вітербі й нечесне казино
- Байєсівські мережі: чому трава мокра і що з цього випливає для дощувача
- Фільтр Калмана: як за неточними вимірюваннями оцінити, де авто і як швидко воно їде
- Види машинного навчання: з учителем, без учителя, з частковим залученням учителя та інші
- Промпти, контекст і RAG: як дати моделі правильну інформацію
- Варіаційні автокодувальники (VAE): нові зображення з неперервного латентного простору
- Генеративні змагальні мережі (GAN): фальшувальник проти детектива
- Дифузійні моделі: як із чистого шуму постає зображення
- Марковські процеси ухвалення рішень: стани, дії, винагороди й рівняння Беллмана
- Q-навчання і DQN: як навчитися цінності дій — від таблиці до нейронної мережі
- Policy gradient і PPO: навчання безпосередньо політики
- Як працює ШІ-агент: мовна модель у циклі з інструментами
- Програмування з AI-агентами: завдання, тести й перевірка
- Оцінювання і безпека систем ШІ: як вимірювати і як стежити
Повна програма серії Готово: 52 з 83 тем
- Як закодувати розв’язок як геном і як добір, схрещування та мутація покращують цілу популяцію.
- Чому без мутації еволюція передчасно збігається і навіщо схрещування.
- Де генетичні алгоритми використовують сьогодні — навіть із мовною моделлю в ролі мутації.
Що варто знати заздалегідь: Локальний пошук та імітація відпалу: комівояжер через обласні центри Чехії
Природа не має інженера, а все ж створила око, крило й мозок. Їй вистачило трьох речей: особини відрізняються одна від одної, передають свої властивості нащадкам, а пристосованіші мають більше нащадків. У сімдесятих роках Джон Голланд із Мічиганського університету показав, що ті самі три речі працюють і в комп’ютері — як загальний метод пошуку добрих розв’язків задач, про які ми не знаємо, як розв’язати їх спритно. Генетичному алгоритму не потрібен градієнт, не потрібна формула; потрібно лише вміти сказати, який із двох розв’язків кращий.
Ця частина продовжує частину Локальний пошук та імітація відпалу. Відпал покращував один розв’язок; генетичний алгоритм покращує цілу їх популяцію одночасно.
1. Задача: рюкзак для походу
Ви збираєтеся в кількаденний похід. Удома маєте 24 речі — намет, спальник, пальник, фотоапарат, книжку… — і кожна щось важить і для чогось потрібна. Рюкзак може важити щонайбільше 10 кг. Що взяти, щоб користь була якомога більшою?
Означення — задача про рюкзак (0/1)
Дано n предметів із масами wi > 0 і цінностями ui > 0 та вантажність W. Шукаємо x ∈ {0, 1}n, яке максимізує ∑i uixi за умови ∑i wixi ≤ W.
Кожна річ — це питання «беру, не беру» — одиниця або нуль. Можливостей 224, тобто 16 777 216 рюкзаків. Жадібна стратегія «спершу найкорисніше на кілограм» часто працює, але оптимуму не гарантує: одна важка річ може витіснити три легкі, які разом були ціннішими.
Для цілих мас оптимум можна обчислити точно динамічним програмуванням — для всіх 24 речей і вантажності 1 000 декаграмів це 24 000 кроків. Найкращий рюкзак має 727 балів користі і важить 9,9 кг; удома лишаються зайва їжа, фотоапарат, книжка, сандалі й сонцезахисний крем. Завдяки цьому ми точно побачимо, наскільки близько дійде еволюція. Генетичний алгоритм, утім, корисний переважно там, де такого точного методу немає.
Динамічне програмування заповнює таблицю T[i][c] — найкращу користь, якої можна досягти лише з перших i речей, коли вони можуть важити щонайбільше c. Кожну клітинку обчислюють із рядка над нею:
T[i][c] = max( T[i − 1][c] , T[i − 1][c − wi] + ui )
- T[i][c]
- найкраща користь із перших i речей за вантажності c; клітинка T[n][W] — відповідь на всю задачу
- T[i − 1][c]
- варіант «i-ту річ не беру» — тоді найкраще те, що можна було скласти з попередніх речей за тієї самої вантажності
- T[i − 1][c − wi]
- варіант «беру» — річ займає wi, тож на решту лишається тільки c − wi; найкраще використання залишку вже є в таблиці (дозволено лише для c ≥ wi)
- ui
- користь речі, яку ми в другому варіанті доклали
Приклад — таблиця для чотирьох речей і вантажності 50 даг
Налобний ліхтарик (10 даг, 25 балів), ніж (10 даг, 18), пальник (40 даг, 30) і каремат (50 даг, 45). Усі маси кратні десяти, тож вистачить стовпців із кроком 10 даг:
| речі | c = 0 | 10 | 20 | 30 | 40 | 50 |
|---|---|---|---|---|---|---|
| жодної | 0 | 0 | 0 | 0 | 0 | 0 |
| + ліхтарик | 0 | 25 | 25 | 25 | 25 | 25 |
| + ніж | 0 | 25 | 43 | 43 | 43 | 43 |
| + пальник | 0 | 25 | 43 | 43 | 43 | 55 |
| + каремат | 0 | 25 | 43 | 43 | 43 | 55 |
Ніж, c = 20: max(T[1][20], T[1][10] + 18) = max(25, 25 + 18) = 43
Пальник, c = 40: max(T[2][40], T[2][0] + 30) = max(43, 0 + 30) = 43 — пальник не вигідний
Пальник, c = 50: max(T[2][50], T[2][10] + 30) = max(43, 25 + 30) = 55 — пальник і ліхтарик
Каремат, c = 50: max(55, T[3][0] + 45) = max(55, 45) = 55
Жадібна стратегія брала б речі за користю на декаграм: ліхтарик (2,5 бала/даг), ніж (1,8), а тоді ні каремат (0,9), ні пальник (0,75) у решту 30 даг уже не влізли б — лише 43 бали. У великій задачі з 24 речами жадібна стратегія зупиняється на 702 балах: заповнює рюкзак дрібницями, і на намет (220 даг) місця вже не лишається.
def batoh(w, u, W): # w, u: маси й цінності, W: вантажність
T = [0] * (W + 1) # рядок для «жодної речі»
for i in range(len(w)):
for c in range(W, w[i] - 1, -1): # з кінця: T[c − w[i]] ще з рядка i − 1
T[c] = max(T[c], T[c - w[i]] + u[i])
return T[W] # n · W кроків: 24 · 1000 = 24 000
2. Особина, геном і пристосованість
Означення — геном, популяція, пристосованість
Геном (хромосома) — це закодований розв’язок; тут рядок x ∈ {0, 1}24, один біт (ген) на річ. Популяція — мультимножина P геномів сталого розміру μ.
Пристосованість (fitness) — функція F : {0, 1}n → ℝ, яку алгоритм максимізує. Для рюкзака
F(x) = ∑ uixi, коли рюкзак уміщується, інакше ∑ uixi − 3 · (∑ wixi − W).
Особина — це один конкретний рюкзак, записаний як ряд одиниць і нулів. Пристосованість каже, наскільки він добрий. Перевантажений рюкзак ми не забороняємо, лише караємо — за кожен зайвий декаграм мінус три бали. Так алгоритм дізнається про межу вантажності поступово, і навіть перевантажений рюкзак може мати гени, які згодом знадобляться.
F(x) = ∑ uixi − 3 · max(0, ∑ wixi − W)
- F(x)
- пристосованість рюкзака x — єдине число, за яким добір порівнює особин
- ∑ uixi
- користь запакованих речей (xi = 1 річ зараховує, 0 пропускає) — те, що ми справді хочемо максимізувати
- 3
- ціна одного декаграма понад ліміт — вона більша за найкраще співвідношення користі й маси (ліхтарик, 2,5 бала/даг), тож докласти будь-що до вже перевантаженого рюкзака завжди знизить пристосованість
- max(0, ∑ wixi − W)
- перевантаження в декаграмах; max із нулем гарантує, що рюкзак, який уміщується, штрафу не отримає, а легший рюкзак не матиме переваги
Приклад — пристосованість двох рюкзаків
Оптимум: користь 727, маса 990 даг ≤ 1 000 ⇒ F = 727 − 3 · 0 = 727
Оптимум + фотоапарат (80 даг, 20 балів): користь 747, маса 1 070 даг ⇒ F = 747 − 3 · 70 = 537
Фотоапарат додає 20 балів, але перевантаження на 70 даг коштує 210 — добір такий рюкзак надійно відсуне.
3. Добір
Означення — турнірний і рулетковий добір
Турнірний добір розміру k: вибери з популяції навмання k особин і поверни ту, що має найвищу пристосованість.
Рулетковий добір: вибери особину x з імовірністю F(x) / ∑y ∈ P F(y) (потребує додатної пристосованості).
Тиск добору — міра того, наскільки сильно добір надає перевагу пристосованішим особинам; у турніру він росте з k.
Турнір: ви витягаєте три випадкові рюкзаки, і батьком стає найкращий із них. Кращі рюкзаки так мають більше дітей, але й посередній має шанс, коли натрапить на слабших. Якби розмножувалися лише найкращі з найкращих, популяція швидко виродилася б у копії однієї особини — а разом із нею зникло б розмаїття, яким живе еволюція.
Наскільки сильний турнір, можна обчислити точно. Наша програма витягає k особин із поверненням (та сама особина може потрапити в турнір двічі). Упорядкуймо популяцію від найкращої (i = 1) до найгіршої (i = μ):
P(виграє i-та) = ( (μ − i + 1)k − (μ − i)k ) / μk
- P(виграє i-та)
- шанс, що батьком стане саме i-та найкраща особина
- (μ − i + 1)k
- кількість турнірів, у яких ніхто не кращий за i-ту — усі k витягувань падають на неї або гірших
- (μ − i)k
- від них віднімаємо турніри, у яких i-тої взагалі немає, — їх виграв би хтось гірший; різниця — це турніри, де i-та найкраща з присутніх
- μk
- кількість усіх можливих турнірів (k витягувань, кожне з μ особин) — поділивши, отримаємо ймовірність
Приклад — турнір із трьох серед 40 рюкзаків
μk = 403 = 64 000. За покоління вибирають 38 батьків (два місця займають елітні особини):
найкраща: (403 − 393) / 64 000 = (64 000 − 59 319) / 64 000 ≈ 7,31 %, очікувано 38 · 0,0731 ≈ 2,78 вибору
20-та найкраща: (213 − 203) / 64 000 = (9 261 − 8 000) / 64 000 ≈ 1,97 %, очікувано ≈ 0,75 вибору
найгірша: (13 − 03) / 64 000 ≈ 0,0016 %, очікувано ≈ 0,0006 вибору
Пересічна особина отримує 38/40 = 0,95 вибору, найкраща — майже втричі більше. Загалом для великої популяції найкращій випадає приблизно в k разів більше, ніж пересічній, — тому тиск добору росте з k.
4. Схрещування і мутація
Означення — одноточкове схрещування
Для батьків a, b ∈ {0, 1}n вибери навмання точку c ∈ {1, …, n − 1}. Нащадки —
(a1, …, ac, bc+1, …, bn) і (b1, …, bc, ac+1, …, an).
Схрещування виконують з імовірністю pc, інакше нащадки — копії батьків. Інші варіанти — двоточкове та рівномірне схрещування (кожен ген від випадкового з батьків).
Ви розрізаєте два рюкзаки в одному й тому самому місці й міняєте кінці. Дитина отримує початок списку від одного з батьків, а кінець — від другого. Якщо один із батьків добре розв’язав сон, а другий — їжу, дитина має шанс успадкувати обидва.
Означення — бітова мутація
Кожен ген нащадка незалежно перевертається (0 ↔ 1) з імовірністю pm, зазвичай pm = 1/n — у середньому один ген на особину.
Іноді дитина відрізняється від батьків однією дрібницею: докладає річ, якої не мав жоден із батьків, або якусь виймає. Мутація — єдине джерело зовсім нових генів; схрещування вміє лише переставляти те, що в популяції вже є.
Приклад — скільки генів перевертає мутація
Кількість перевернутих генів має біноміальний розподіл: P(j генів) = C(n, j) · pmj · (1 − pm)n−j. Для n = 24 і pm = 1/24:
очікувана кількість: n · pm = 24 · 1/24 = 1
жодної зміни: (23/24)24 ≈ 0,360 (для великих n наближається до 1/e ≈ 0,368)
рівно один ген: 24 · (1/24) · (23/24)23 ≈ 0,376
Отже, приблизно третина нащадків лишається без змін, третина відрізняється одним геном, а решта — двома й більше.
Батьки — два найкращі рюкзаки з початкової популяції (423 і 398 балів), розріз — за дванадцятою річчю. Жоден із нащадків не кращий за кращого з батьків — вони мають 403 і 418 балів. Схрещування покращення не гарантує; воно лише пропонує нові комбінації, а добір потім вирішить, які виживуть. Мутація в першого нащадка доклала фільтр для води (15 даг, 32 бали), і він одразу має 435 балів — більше, ніж обоє батьків.
Приклад — перерахунок схрещування з рисунка
Користь додається по генах, тож досить окремо додати користь початку (речі 1–12) і кінця (речі 13–24):
батько 1: 310 + 113 = 423, батько 2: 305 + 93 = 398
нащадок 1 = початок батька 1 + кінець батька 2: 310 + 93 = 403
нащадок 2 = початок батька 2 + кінець батька 1: 305 + 113 = 418
мутація докладає фільтр для води: 403 + 32 = 435
Батько 1 кращий в обох половинах (310 > 305 і 113 > 93), тож за такого розрізу його не може перевершити жоден нащадок — схрещуванню нема з чого скласти кращого цілого. Покращення принесла лише мутація.
5. Увесь алгоритм
Алгоритм — генетичний алгоритм
- Створи випадкову початкову популяцію з μ особин і оціни їх.
- Скопіюй у нове покоління e найкращих особин без змін (елітизм).
- Поки нове покоління не має μ особин: вибери двох батьків, з імовірністю pc схрести їх, нащадків мутуй і додай.
- Оціни нове покоління й переходь до кроку 2, поки не вичерпається кількість поколінь.
Покоління за поколінням: двоє найкращих виживають одразу, решту місць займають діти пристосованих батьків, трохи переставлені й трохи змінені. Елітизм гарантує, що найкращий знайдений рюкзак ніколи не загубиться.
import random
def evoluce(zdatnost, n, velikost=40, generaci=60, p_krizeni=0.9, elita=2):
pop = [[int(random.random() < 0.3) for _ in range(n)] for _ in range(velikost)]
for _ in range(generaci):
pop.sort(key=zdatnost, reverse=True)
dalsi = [g[:] for g in pop[:elita]] # елітизм
while len(dalsi) < velikost:
a, b = turnaj(pop, zdatnost), turnaj(pop, zdatnost)
if random.random() < p_krizeni:
bod = random.randrange(1, n)
a, b = a[:bod] + b[bod:], b[:bod] + a[bod:]
dalsi += [mutuj(a), mutuj(b)]
pop = dalsi[:velikost]
return max(pop, key=zdatnost)
def turnaj(pop, zdatnost, k=3):
return max(random.choices(pop, k=k), key=zdatnost) # k витягувань із поверненням
def mutuj(g):
return [1 - x if random.random() < 1 / len(g) else x for x in g]
Вартість алгоритму вимірюємо кількістю оцінок пристосованості — у справжніх задачах (симуляції, вимірювання) це найдорожчий крок. Оцінюють початкову популяцію, а потім кожне покоління: μ + G · μ = 40 + 60 · 40 = 2 440 оцінок для μ = 40 особин і G = 60 поколінь. Елітні особини оцінюються знову, хоч і не змінилися; кмітливіша програма запам’ятовувала б їхню пристосованість.
6. Еволюція рюкзака
Запустімо алгоритм: 40 рюкзаків, 60 поколінь, турнір із трьох, схрещування з імовірністю 0,9, мутація 1/24 і дві елітні особини. Рисунок показує популяцію в поколіннях 0, 5, 15, 30 і 60 — кожен рядок — один рюкзак, кожен стовпець — одна річ, угорі для порівняння оптимум:
Спочатку популяція строката, а рюкзаки радше напівпорожні: кожна річ потрапила до них з імовірністю 0,3, тож вони важать близько чотирьох кілограмів (очікувана маса — 0,3 · ∑ wi = 0,3 · 12,75 кг ≈ 3,8 кг). Найкращий має 423 бали, середнє — 231. Через п’ять поколінь намет несуть 36 із 40 рюкзаків, пляшку з водою — 35, а найкращий рюкзак має 634 бали. Близько п’ятнадцятого покоління популяція впирається у вантажність — 12 рюкзаків перевантажені — і починає вчитися, чим пожертвувати: зайва їжа й сандалі майже зникли, але фотоапарат поки що несуть 39 рюкзаків. Оптимум, 727 балів, алгоритм уперше знаходить у поколінні 26; у поколінні 30 фотоапарат лишився вже тільки в одному рюкзаку. Проте популяція ніколи не зливається в один розв’язок — мутація постійно пробує дрібні відхилення.
Алгоритм для цього оцінив 2 440 рюкзаків — неповні дві соті відсотка з усіх 16 777 216 можливостей. Випадковий пошук із тією самою кількістю спроб у ста повтореннях не знайшов оптимуму жодного разу й у середньому зупинився на 574 балах.
Приклад — чому випадковий пошук не знайде оптимуму
Випадковий рюкзак бере кожну річ незалежно з імовірністю 0,3. Оптимум містить 19 речей і 5 пропускає, тож
P(випадковий рюкзак = оптимум) = 0,319 · 0,75 ≈ 1,16 · 10−10 · 0,168 ≈ 1,95 · 10−11
очікувана кількість влучань у 2 440 спробах: 2 440 · 1,95 · 10−11 ≈ 4,8 · 10−8
Навіть якби витягали рівномірно (кожну річ з імовірністю 1/2), шанс був би один до 16 777 216 на спробу. Генетичний алгоритм не витягає оптимум одразу — він складає його шматочок за шматочком із рюкзаків, які вже добрі.
7. Навіщо схрещування і навіщо мутація
Помаранчева лінія на графіку — той самий запуск із вимкненою мутацією. Через одинадцять поколінь вона застрягає на 573 балах і більше не рухається. Чому, покаже порівняння ста запусків із різними зернами:
| Варіант | Знайшов оптимум | Середня користь |
|---|---|---|
| Добір + схрещування + мутація | 88 зі 100 | 726,6 |
| Добір + мутація (без схрещування) | 70 зі 100 | 725,0 |
| Добір + схрещування (без мутації) | 0 зі 100 | 596,8 |
| Випадковий пошук, стільки ж спроб | 0 зі 100 | 573,5 |
Без мутації популяція втрачає розмаїття: коли гена немає в жодній особині, схрещування його не створить, а добір до того ж швидко витісняє все, крім найкращих. Це називають передчасною збіжністю. Без схрещування алгоритм працює — по суті це популяція альпіністів із добором, — але повільніше. Схрещування допомагає складати разом добрі шматки, що виникли в різних особинах.
Теорема — теорема Голланда про схеми
Схема H — це шаблон над {0, 1, ∗}, де ∗ означає «будь-що»; її порядок o(H) — кількість фіксованих позицій, а довжина δ(H) — відстань між першою та останньою фіксованою позицією. Для m(H, t) особин, що відповідають H у поколінні t, і рулеткового добору виконується
E[m(H, t + 1)] ≥ m(H, t) · F(H) / F̄ · [1 − pc · δ(H) / (n − 1) − o(H) · pm],
де F(H) — середня пристосованість особин зі схеми, а F̄ — середнє популяції.
Схема — це «будівельний блок», наприклад «беру намет і спальник, решта не важить». Теорема каже, що короткі будівельні блоки з понадсередньою пристосованістю поширюються в популяції — і то експоненційно швидко, бо щопокоління їхня кількість приблизно множиться на відношення F(H) / F̄. Короткі тому, що схрещування рідше їх розрізає. Теорема — лише оцінка знизу, а про те, наскільки добре алгоритм працює, сперечаються досі.
E[m(H, t + 1)] ≥ m(H, t) · F(H) / F̄ · [1 − pc · δ(H) / (n − 1) − o(H) · pm]
- m(H, t)
- скільки особин несе будівельний блок зараз — наступне покоління виходить із них, тому на це множать
- F(H) / F̄
- наскільки носії схеми пристосованіші за середнє — рулетка дає їм пропорційно більше нащадків; понад 1 схема розмножується, нижче 1 вимирає
- pc · δ(H) / (n − 1)
- шанс, що схрещування розріже схему: схрещування відбувається з pc, а точка розрізу з імовірністю δ/(n − 1) падає між фіксовані позиції — тому шкодять довгі схеми
- o(H) · pm
- шанс (оцінка згори), що мутація переверне якусь з o(H) фіксованих позицій — тому шкодять схеми високого порядку
Приклад — коротка й довга схема на рюкзаку
Квадратна дужка для налаштувань нашого запуску (pc = 0,9, n = 24, pm = 1/24). Обидві схеми мають порядок 2:
«намет і спальник» (гени 1 і 2, δ = 1): 1 − 0,9 · 1/23 − 2/24 ≈ 1 − 0,039 − 0,083 = 0,878
«намет і запасні шкарпетки» (гени 1 і 24, δ = 23): 1 − 0,9 · 23/23 − 2/24 ≈ 1 − 0,9 − 0,083 = 0,017
Короткій схемі досить, щоб її носії були на 14 % пристосованіші за середнє (1/0,878 ≈ 1,14), і за теоремою вона вже поширюється. Довга схема мала б бути вшістдесятеро пристосованішою — теорема про неї по суті нічого не обіцяє. Наш алгоритм використовує турнір, а не рулетку, тож для нього справджується лише квадратна дужка; перші два множники обчислювалися б інакше.
8. Генетичні алгоритми на практиці
- Проєктування форм. Антену супутників NASA ST5 (запущених 2006 року) спроєктував еволюційний алгоритм: дивно покручений дротик, який інженерові не спав би на думку, але виконав вимоги щонайменше так само добре, як антена, спроєктована вручну (у пізніших дослідах навіть краще).
- Розклади й логістика. Розклади, графіки змін чи планування складу — задачі з багатьма умовами, де пристосованість можна обчислити, але точний алгоритм працював би вічність.
- Машинне навчання. Еволюція налаштовує гіперпараметри моделей, а в нейроеволюції, якій програма курсу присвячує окрему частину, — і ваги та архітектури нейронних мереж.
- Еволюція з мовними моделями. Системи на кшталт FunSearch (2023) і AlphaEvolve (2025) від Google DeepMind підтримують популяцію програм і як мутацію використовують мовну модель, яка програму змінює. Добір забезпечує автоматичне оцінювання. Так вдалося знайти нові математичні конструкції та швидші алгоритми.
9. Підсумок
- Генетичний алгоритм покращує цілу популяцію розв’язків: добором пристосованих, схрещуванням і мутацією.
- Пристосованість — єдине, що йому треба знати про задачу; порушення умов можна розв’язати штрафом.
- Турнірний добір тримає тиск добору, елітизм не дає втратити найкращий розв’язок.
- На рюкзаку з 16,7 мільйона можливостей він знайшов оптимум у 88 зі 100 запусків, оцінивши 2 440 рюкзаків; випадковий пошук із тим самим бюджетом — жодного разу.
- Мутація постачає розмаїття — без неї популяція передчасно збігається. Схрещування складає добрі будівельні блоки й пришвидшує еволюцію.
Хочете спробувати самі? Попросіть ШІ-агента написати генетичний алгоритм для вашого власного рюкзака для походу — а потім спробуйте вимкнути мутацію, збільшити турнір або зменшити популяцію і стежте, що станеться з розмаїттям.
Маєте іншу думку? Напишіть на support@coden-app.com.