Генетичний алгоритм

Захопився ідеєю створення штучного інтелекту, для гри, на основі генетичного алгоритму. Шукав інфу з цього приводу і наче як все зрозумів, але потім виявилося що не все))

Почав я з простого — вирішення задачі OneMax за допомогою ГА. Я не дивився конкретні гайди як писати код (бо я працюю на рушії з візуальним програмуванням), а просто слідував основним положенням вирішення цієї задачі.
Спочатку створив масив, по Х в мене була популяція ШІ, а по Y їх генетичний код який складався з 0, та 1. Для початку по Y рандомно генерувалися 0 або 1. Після чого через функцію йшов відбір половини найкращих особин який вираховувався просто сумуючи все по Y. Після чого я їх схрещував, додавав рандомні мутації та повторював все заново. Доки у них всих по Y не залишилися лише 1.

І наче як я зрозумів суть, але не зрозумів як його ускладнювати.

Наприклад я візьму простий варіант. Джампер в якому зправа наліво летить перешкода, а ШІ має її перестрибувати.

По перше, я не дуже розумію як має виглядати його геном. По ідеї це буде теж масив в якому я маю задати Y0 — 0, або 1 (При 1 він стрибає, при 0 не стрибає). А що далі? По ідеї йому треба давати відстань між ним та перешкодою, або давати йому його позицію та позицію перешкоди. Наприклад візьму другий варіант, то задам йому Y1- його координата по Х, Y2 — координата перешкоди по Х. І наприклад задам Y3 — час який він прожив, до того як в нього влетіла перешкода (щоб відбирати кращих осіб). По ідеї Y1, Y2, Y3 я буду йому оновлювати кожні, наприклад 0,01 секунду. А Y0 буде ставати 0 при приземленні. А от як він має зрозуміти що йому потрібно в Y0 вибирати 1 коли перешкода близько щоб її перестрибнути? В мене це не вкладається в голові. Можливо я не правильно розумію як це має працювати.

Я маю дати йому якийсь механізм який буде віднімати Y2 від Y1 в результаті чого він має вибирати стрибати чи ні? І робити цю операцію також кожні 0,01 секунди коли оновлюється координата перешкоди? Але я не розумію як це буде працювати і як я йому такий варіант зможу задати. Ну типу я зроблю наприклад умову в якій буде це обчислення, а як зробити щоб він сам обрав в результаті стрибнути чи ні? Я ж не можу задати йому set Y0 choose 0,1. Бо воно просто рандомно обере 0 чи 1 та і все.

Чи можливо мені треба створювати безкінечний масив у якому по Y будуть 0, або 1 (стрибок чи ні). І кожну 0,01 секунду буде зчитуватися наступна комірка. Але це якась жесть

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини про геймдев

👍ПодобаєтьсяСподобалось1
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Мені б схематичне пояснення як це працює. Але я вже здається зрозумів. Я сам маю робити усі обчислення, а потім з генома брати 1 або 0, це і буде його відповідь, в залежності від неї робити подальші дії. А потім наказувати його якщо він був не правий. Типу якщо перешкода на відстані стрибка і в масиві 1 то він стрибає, а якщо в масиві 0 — то ні. Але сам він не може вирахувати цю відстань, як я думав спочатку) Він чисто приймає рішення. Тоб-то це не має великого сенсу, якщо все одно практично все сам робиш, я просто пропишу ШІ від а до я, і вкажу йому що він має робити, чи не робити, через if else та й все. Взагалі мені він потрібен був для покрокового бою, типу як в героях, і було б цікаво щоб він сам вирішував куди йти і що робити

На ютубі люди таким в принципі займаються. Наприклад: youtube.com/watch?v=...​sHA6c?si=iIWnWAmZQK8JpYPp
або ж той самий джампер(але тут без деталей імплементації): youtube.com/watch?v=...​tiWlc?si=4N-h4oxu2-gW3VGd
Суть в тому що генетичний алгоритм це просто цікавий пошук. І для ШІ гри йому треба щось знайти що буде керувати агентом. Наприклад, значення для невеликої нейронки яка бере на інпут певні показники гри і віддає на аутпут команду боту.
Але реально якихось крутих або практичних результатів очікувати не варто, з генетичними алгоритмами можна в основному прекольні відео на ютубі робити. Хочеться ШІ ботів які щось можуть в чомусь складнішому за змійку то поклацайте в юніті mlagents, хочеться порозважатись тоді поклацайте генетичні.

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

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

Якийсь (робочий?) код на Пітоні є в книжці
Программируем коллективный разум
Автор Тоби Сегаран

Здається, для такої задачі не потрібен генетичний алгоритм

Підписатись на коментарі