Ko'rsatmalar to'plami
Hammasi AI bo'lishi mumkin bo'lgan buyruqlar to'plamini tayyorlash bilan boshlandi. Yuqori darajadagi tillarda yuzlab turli xil operatorlar mavjud. Kerakli minimalni ta'kidlash uchun men Assembler tiliga murojaat qilishga qaror qildim. Biroq, unda ko'plab buyruqlar mavjudligi ma'lum bo'ldi.
Menga ma'lumotlarni o'qish va chiqarish, xotira bilan ishlash, hisoblar va mantiqiy operatsiyalarni bajarish, o'tish va ko'chadan bajarish uchun AI kerak edi. Men Brainfuck tiliga duch keldim, unda faqat 8 ta buyruq mavjud va har qanday hisob-kitoblarni amalga oshira oladi (ya'ni Turing to'liq). Aslida, bu genetik dasturlash uchun javob beradi, lekin men yanada oldinga bordim.
Men hayron bo'ldim: har qanday algoritmni amalga oshirish uchun buyruqlarning minimal soni qancha bo'lishi kerak? Ma'lum bo'lishicha - bitta!
URISC protsessorida faqat bitta buyruq mavjud: agar berilgan son kamaytirilgan bo'lsa, keyingi buyruqni olib tashlang va o'tkazib yuboring. Bu har qanday algoritmni qurish uchun etarli.
Oleg Mazonka yanada olg'a bordi, BitBitJump guruhini tuzdi va Turingga ko'ra uning to'liq ekanligini isbotladi. Buyruq uchta manzilni o'z ichiga oladi, birinchisidan ikkinchi xotira manziliga bir bit nusxa ko'chiradi va boshqaruvni uchinchi manzilga o'tkazadi.
Olegning g'oyalarini o'rganib, ishni soddalashtirish uchun men SumIfJump guruhini ishlab chiqdim. Buyruq to'rtta operandni o'z ichiga oladi: A, B, C, D va quyidagilarni bajaradi: hujayradan ma'lumotni A manziliga B manziliga qo'shadi, agar qiymat belgilangan * dan katta bo'lsa, u C manziliga o'tadi, aks holda u D manziliga o'tadi.
Izoh
* Bu holda 128 ishlatilgan - bu genom uzunligining yarmi.
Operand A N0 xotira xujayrasiga kirganda, ma'lumotlar kiritiladi va N1 katakka o'tganda, u holda chiqish amalga oshiriladi.
Quyida FreePascal-dagi SumIfJump kodi (Delphining bepul analogi).
RunProg protsedurasi (lar: TData); var a, b, c, d: TData; begin Inc (NStep); agar NStep\u003e MaxStep, keyin ProgResult-ni boshlang: \u003d "MaxStep"; Chiqish oxiri; a: \u003d s; b: \u003d s + 1; c: \u003d s + 2; d: \u003d s + 3; a: \u003d Prog [a]; b: \u003d Prog [b]; c: \u003d Prog [c]; d: \u003d Prog [d]; agar a \u003d 0 bo'lsa, unda ProgResult boshlang: \u003d "Kirish"; Chiqish oxiri; agar a \u003d 1 bo'lsa, unda ProgResult boshlang: \u003d "Chiqish"; Chiqish oxiri; Prog [b]: \u003d Prog [b] + Prog [a]; agar Prog [b]< ProgLength div 2 then RunProg(c) else RunProg(d); end;
SumIfJump o'zini o'zi o'zgartiradigan kodni amalga oshiradi. Oddiy dasturlash tilida mavjud bo'lgan har qanday algoritmlarni bajarishi mumkin. Kodni o'zgartirish oson va har qanday manipulyatsiyaga qarshi turadi.
Oddiy vazifa
Shunday qilib, bizning AIda faqat bitta jamoa mavjud. Tic-tac-toe u uchun juda qiyin o'yin bo'lsa-da, men sodda bo'lgan bilan boshladim.
Bot tasodifiy raqamni beradi va AI ma'lumotlarni o'qib, javob berishi kerak. Agar raqam o'rtacha darajadan kattaroq bo'lsa (tasodifiy sonlar oralig'idan), AI o'rtacha raqamdan kamroq raqamni berishi kerak va aksincha.
Bizning AI genomimiz 0 dan 255 gacha bo'lgan qiymatlarga ega 256 hujayradan iborat. Har bir qiymat xotira, kod va manzildan iborat. Kodni bajarish bosqichlari soni 256 bilan cheklangan. Operandalar birin-ketin o'qiladi.
Dastlab, genom tasodifiy sonlar to'plami bilan hosil bo'ladi, shuning uchun AI nima o'ynash kerakligini bilmaydi. Bundan tashqari, u botga javoban ma'lumotlarni ketma-ket kiritish va chiqarish kerakligini bilmaydi.
Do'stlaringiz bilan baham: |