Biz nasldan naslga qanday o'tishni bilib oldik, endi keyingi savol "asosiy sabab nima edi, hammasi qanday boshlandi?". Sizning bu dunyongizdan farqli o'laroq, biz bunday narsalarni tushuntirish uchun "katta portlash" yoki "7 kun" kabi hiyla-nayranglarni o'ylab topishimiz shart emas. Bu erda javob juda aniq - barchasi tasodifiy yaratilgan nol avloddan boshlangan. Ha, ha, biz tasodifiy ravishda satrlarni/daraxtlarni yaratamiz. Yagona talab - bu shaxsning to'g'riligi va uning qanchalik nuqsonli ekanligi hech kimni qiziqtirmaydi, tanlov o'z ishini qiladi.
Bizning dunyomiz bizga kerak bo'lgan vaqtgacha mavjud. Biz yoki bizni qoniqtiradigan fitnes uchun barni o'rnatamiz va etarlicha salqin shaxs paydo bo'lganda, biz jarayonni to'xtatamiz yoki avlod shaxslari bir-biridan qanchalik farq qilishini tekshiramiz. Agar butun avlod bir xil egizaklardan iborat bo'lsa, unda keyingi juftlashish qo'zg'alishlari genofondga hech qanday yangilik bermaydi va bitta mutatsiyaga umid qilish soddalikdir. Vaqt chegarasini ham belgilashingiz mumkin.
Hoy! Haroshsh miyani ko'taring! Yakuniy natija nima?
Keling, ushbu ajoyib so'zda to'xtab, orqaga qaraymiz (yaxshi, yuqoriga). Xulosa qilib aytganda, genetik algoritm quyidagicha ko'rinadi:
Biz muammoning yechimini genetik algoritm misolida ko'rsatishni o'rganamiz - ba'zi alifbolar bo'yicha belgilangan uzunlik ro'yxati. Shundan so'ng, biz jismoniy shaxslarni baholay oladigan va tasodifiy nol avlodni yaratadigan fitnes funksiyasini tanlaymiz. Bu erda erkin sevgining aylanishi boshlanadi: avlod shaxslarining jismoniy tayyorgarligi hisoblab chiqiladi, bu ma'lumotlarga ko'ra juftliklar hosil bo'ladi (yutqazganlar tashqariga chiqariladi va alfa erkaklar bir juft bilan cheklanmaydi), qolgan juftlik tug'iladi. bir juft bola (mutatsiya ularga ham tegishli) va qo'llarini o'zlariga qo'yishadi. Bu tanlangan kishi topilmaguncha yoki o'zgarishlar bizni xursand qilishni to'xtatmaguncha yoki biz hamma narsadan charchamaguncha davom etadi. Xo'sh, sxemasiz qanday qilishim mumkin:
Ikkinchi qism. Robocode bot tasvirida genetik algoritmning roli.
Birinchi qism davom etgan narsa, biz hammamiz charchadik, shuning uchun biz o'zimizni takrorlamaymiz. Biz, shuningdek, ba'zi amalga oshirish xususiyatlarini o'tkazib yuboramiz.
Robocode nima ekanligini bu yerda bilib olishingiz mumkin: habrahabr.ru/blogs/programmers_games/59784 (rasmlar yo'qolgan bo'lsa ham). Muxtasar qilib aytganda, ushbu dasturlash o'yini dastlab Java tilining xususiyatlarini o'rganish uchun yaratilgan bo'lib, ishtirokchilarga o'zlarining robot-botlarini yaratish va ular o'rtasida janglar tashkil qilish imkonini beradi. Har bir ishtirokchi kichik tankni boshqaradigan va boshqa shunga o'xshash tanklarga qarshi kurashadigan Java kodini yozadi.
Bizning oldimizda quyidagi vazifa turibdi: genetik algoritm yordamida bot-tankni boshqarishning avtomatlashtirilgan tizimini ishlab chiqish. Robot avtomatik ravishda yaratilishi va o'zgartirilishi kerak, ya'ni. evolyutsiya jarayonida 1v1 janglarida aniq va oldindan tanlangan raqibga "moslash".
Muammoning yechimini shaxs shaklida qanday ifodalash
Birinchidan, tankning imkoniyatlarini aniqlaymiz. Jang paytida robotning bajarishi mumkin bo'lgan asosiy harakatlar ro'yxati to'rtta nuqta bilan cheklangan: qurolni burish, tanani aylantirish, otish, harakat qilish. Biz beshinchi harakatni, radar aylanishini ko'rib chiqishdan chiqarib tashladik, uni ahamiyatsiz - doimiy aylanishda amalga oshirdik (shunday qilib, tank har doim dushmanning pozitsiyasi haqida eng so'nggi ma'lumotlarga ega bo'ladi).
Shubhasiz, muvaffaqiyatli jang qilish uchun bu harakatlar tasodifiy emas, balki jang maydonidagi vaziyatga (holatga) bog'liq bo'lishi kerak: tanklarning holatiga, ularning tezligiga, energiyasiga va boshqa parametrlarga. Shunday qilib, tankni boshqarish jarayoni jang holatiga qarab yuqoridagi harakatlarni bajarishga qisqartiriladi. Tankning xatti-harakatini (uning harakatlarini) jang maydonidagi vaziyatga qarab belgilaydigan qonun biz nazorat funktsiyasini chaqiramiz va u bizning genetik algoritmimizning individual xususiyati bo'ladi.
Boshqarish funktsiyasi 4 ta qiymatni qaytarishi kerakligi sababli (otish energiyasi, minoraning aylanish burchagi, korpusning aylanish burchagi, tank harakati), oxirgi qismda tushuntirilganidek, u to'rtta ifodadan iborat bo'ladi, ya'ni. to'rt qator/daraxtdan iborat.
Kodlash jadvalini kompilyatsiya qilish uchun siz asosiy funktsiyalar, o'zgaruvchilar va konstantalar to'plami haqida qaror qabul qilishingiz kerak.