Генетичний алгоритм
Захопився ідеєю створення штучного інтелекту, для гри, на основі генетичного алгоритму. Шукав інфу з цього приводу і наче як все зрозумів, але потім виявилося що не все))
Почав я з простого — вирішення задачі 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 секунду буде зчитуватися наступна комірка. Але це якась жесть
5 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів