Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Мен ойындарда жасанды интеллект туралы қызықты материал таптым. Қарапайым мысалдарды қолдана отырып, AI туралы негізгі нәрселерді түсіндіре отырып, оның ішінде оны ыңғайлы әзірлеуге және жобалауға арналған көптеген пайдалы құралдар мен әдістер бар. Оларды қалай, қайда және қашан қолдану керектігі де бар.

Мысалдардың көпшілігі псевдокодта жазылған, сондықтан қосымша бағдарламалау білімі қажет емес. Кесектің астында суреттер мен gif-тері бар 35 парақ мәтін бар, сондықтан дайын болыңыз.

UPD. Кешірім өтінемін, бірақ мен Хабредегі осы мақаланың аудармасын жасадым PatientZero. Сіз оның нұсқасын оқи аласыз осында, бірақ қандай да бір себептермен мақала менің жанымнан өтіп кетті (мен іздеуді қолдандым, бірақ бірдеңе дұрыс болмады). Мен ойынды дамытуға арналған блогта жазып жатқандықтан, мен жазылушыларға аударма нұсқасын қалдыруды шештім (кейбір нүктелер басқаша пішімделген, кейбіреулері әзірлеушілердің кеңесімен әдейі алынып тасталды).

AI дегеніміз не?

Ойын AI объект орналасқан жағдайға байланысты қандай әрекеттерді орындау керек екеніне назар аударады. Бұл әдетте «ақылды агент» менеджменті деп аталады, мұнда агент ойыншы кейіпкері, көлік құралы, бот немесе кейде одан да абстрактілі нәрсе: субъектілердің бүкіл тобы немесе тіпті өркениет. Әр жағдайда ол өз ортасын көріп, соған қарап шешім қабылдап, соған сәйкес әрекет етуі керек нәрсе. Бұл сезім/ойлау/әрекет циклі деп аталады:

  • Сезім: Агент оның мінез-құлқына әсер етуі мүмкін қоршаған ортадағы нәрселер туралы ақпаратты табады немесе алады (жақын маңдағы қауіптер, жиналатын заттар, зерттеуге қызықты орындар).
  • Ойланыңыз: агент қалай әрекет ету керектігін шешеді (заттарды жинау жеткілікті қауіпсіз бе, әлде алдымен күресу/жасыру керек пе) қарастырады.
  • Акт: агент алдыңғы шешімді орындау үшін әрекеттерді орындайды (қарсыласқа немесе нысанға қарай жылжи бастайды).
  • ...қазір жағдай кейіпкерлердің әрекетіне байланысты өзгерді, сондықтан цикл жаңа деректермен қайталанады.

AI циклдің Sense бөлігіне назар аударуға бейім. Мысалы, автономды машиналар жолды суретке түсіріп, оларды радар және лидар деректерімен біріктіріп, түсіндіреді. Бұл әдетте кіріс деректерді өңдейтін және «сізден 20 ярд жерде тағы бір көлік бар» сияқты семантикалық ақпаратты шығаратын машиналық оқыту арқылы жасалады. Бұл классификациялық есептер деп аталады.

Ойындарға ақпаратты алу үшін күрделі жүйе қажет емес, өйткені деректердің көпшілігі қазірдің өзінде оның ажырамас бөлігі болып табылады. Алда жаудың бар-жоғын анықтау үшін кескінді тану алгоритмдерін іске қосудың қажеті жоқ — ойын қазірдің өзінде біледі және ақпаратты шешім қабылдау процесіне тікелей береді. Сондықтан циклдің Сезім бөлігі «Ойлан және әрекет ет» бөлімінен жиі әлдеқайда қарапайым.

Ойынның AI шектеулері

AI бірнеше шектеулерге ие, олар сақталуы керек:

  • Жасанды интеллектті машиналық оқыту алгоритмі сияқты алдын ала үйретудің қажеті жоқ. Он мыңдаған ойыншыларды бақылау және оларға қарсы ойнаудың ең жақсы әдісін үйрену үшін әзірлеу кезінде нейрондық желіні жазудың мағынасы жоқ. Неліктен? Өйткені ойын шығарылмаған және ойыншылар жоқ.
  • Ойын қызықты және қиын болуы керек, сондықтан агенттер адамдарға қарсы ең жақсы тәсілді таппауы керек.
  • Агенттер шынайы көрінуі керек, осылайша ойыншылар өздерін шынайы адамдарға қарсы ойнайтындай сезінуі керек. AlphaGo бағдарламасы адамдардан асып түсті, бірақ таңдалған қадамдар ойынның дәстүрлі түсінігінен өте алыс болды. Егер ойын адамның қарсыласын имитацияласа, бұл сезім болмауы керек. Алгоритмді идеалды емес, орынды шешімдер қабылдау үшін өзгерту керек.
  • AI нақты уақытта жұмыс істеуі керек. Бұл алгоритм шешім қабылдау үшін ұзақ уақыт бойы процессорды пайдалануды монополиялай алмайтынын білдіреді. Тіпті 10 миллисекунд тым ұзақ, өйткені көптеген ойындарға барлық өңдеуді орындау және келесі графикалық кадрға өту үшін бар болғаны 16-33 миллисекунд қажет.
  • Ең дұрысы, жүйенің кем дегенде бір бөлігі деректерге негізделген болуы керек, осылайша кодер еместер өзгерістер енгізе алады және түзетулер тезірек орындалады.

Бүкіл Сезім/Ойлан/Әрекет циклін қамтитын AI тәсілдерін қарастырайық.

Негізгі шешімдерді қабылдау

Ең қарапайым ойыннан бастайық - Понг. Мақсаты: доп оның жанынан ұшып кетпей, секіретіндей етіп қалақты жылжытыңыз. Бұл теннис сияқты, допты соқпасаң жеңіліп қаласың. Мұнда AI салыстырмалы оңай тапсырмаға ие - платформаны қай бағытта жылжыту керектігін шешу.

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Шартты сөйлемдер

Понгтағы AI үшін ең айқын шешім - әрқашан платформаны доптың астына қоюға тырысу.

Бұл үшін псевдокодта жазылған қарапайым алгоритм:

ойын жұмыс істеп тұрған кездегі әрбір кадр/жаңарту:
егер доп қалақшаның сол жағында болса:
қалақты солға жылжытыңыз
егер доп қалақшаның оң жағында болса:
қалақты оңға жылжытыңыз

Егер платформа доптың жылдамдығымен қозғалса, бұл Понгтағы AI үшін тамаша алгоритм. Агент үшін деректер мен мүмкін әрекеттер көп болмаса, ештеңені қиындатудың қажеті жоқ.

Бұл тәсілдің қарапайымдылығы соншалық, Сезім/Ойлау/Әрекет циклінің барлығы дерлік байқалмайды. Бірақ ол жерде:

  • Сезім бөлігі екі if операторынан тұрады. Ойын доптың және платформаның қайда екенін біледі, сондықтан AI сол ақпаратты іздейді.
  • «Ойлан» бөлігі екі if операторына да кіреді. Олар бұл жағдайда бір-бірін жоққа шығаратын екі шешімді қамтиды. Нәтижесінде үш әрекеттің бірі таңдалады - платформаны солға жылжытыңыз, оңға жылжытыңыз немесе ол дұрыс орналастырылған болса, ештеңе жасамаңыз.
  • Акт бөлігі қалақшаны солға жылжыту және қалақты оңға жылжыту мәлімдемелерінде орналасқан. Ойын дизайнына байланысты олар платформаны лезде немесе белгілі бір жылдамдықпен жылжыта алады.

Мұндай тәсілдер реактивті деп аталады - әлемнің ағымдағы жағдайына әрекет ететін және әрекет ететін қарапайым ережелер жиынтығы (бұл жағдайда кодта мәлімдемелер болса) бар.

Шешім ағашы

Понг үлгісі іс жүзінде шешім ағашы деп аталатын ресми AI тұжырымдамасына баламалы. Алгоритм «жапыраққа» жету үшін ол арқылы өтеді - қандай әрекет жасау керектігі туралы шешім.

Платформамыздың алгоритмі үшін шешім ағашының блок-схемасын жасайық:

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Ағаштың әрбір бөлігі түйін деп аталады - AI мұндай құрылымдарды сипаттау үшін графикалық теорияны пайдаланады. Түйіндердің екі түрі бар:

  • Шешім түйіндері: әрбір балама жеке түйін ретінде ұсынылатын кейбір жағдайды сынауға негізделген екі баламаны таңдау.
  • Соңғы түйіндер: соңғы шешімді білдіретін орындалатын әрекет.

Алгоритм бірінші түйіннен (ағаштың «түбірі») басталады. Ол қандай еншілес түйінге бару керектігі туралы шешім қабылдайды немесе түйінде сақталған әрекетті орындайды және шығады.

Шешім ағашының алдыңғы бөлімдегі if операторлары сияқты жұмыс істеуінің қандай пайдасы бар? Мұнда әрбір шешімнің тек бір шарты және екі ықтимал нәтижесі болатын жалпы жүйе бар. Бұл әзірлеушіге ағаштағы шешімдерді білдіретін деректерден оны қатаң кодтамай-ақ AI жасауға мүмкіндік береді. Оны кесте түрінде көрсетейік:

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Код жағында сіз жолдарды оқуға арналған жүйені аласыз. Олардың әрқайсысы үшін түйін жасаңыз, екінші бағанға негізделген шешім логикасын және үшінші және төртінші бағандарға негізделген еншілес түйіндерді қосыңыз. Сіз әлі де шарттар мен әрекеттерді бағдарламалауыңыз керек, бірақ енді ойын құрылымы күрделірек болады. Мұнда сіз қосымша шешімдер мен әрекеттерді қосасыз, содан кейін ағаш анықтамасының мәтіндік файлын жай өңдеу арқылы бүкіл AI-ны теңшейсіз. Әрі қарай, сіз файлды ойын құрастырушысына бересіз, ол ойынды қайта құрастырмай немесе кодты өзгертпей әрекетті өзгерте алады.

Шешім ағаштары мысалдардың үлкен жинағынан автоматты түрде құрастырылған кезде өте пайдалы (мысалы, ID3 алгоритмін пайдалану). Бұл оларды алынған деректер негізінде жағдайларды жіктеуге арналған тиімді және жоғары өнімді құрал етеді. Дегенмен, біз агенттерге әрекеттерді таңдауға арналған қарапайым жүйенің шеңберінен шығамыз.

Сценарийлер

Біз алдын ала жасалған шарттар мен әрекеттерді пайдаланатын шешім ағашының жүйесін талдадық. AI құрастырушы ағашты өзі қалағандай ұйымдастыра алады, бірақ ол бәрібір оның бәрін бағдарламалаған кодерге сенуі керек. Егер біз дизайнерге өз жағдайларын немесе әрекеттерін жасау үшін құралдарды бере алсақ ше?

Бағдарламашыға Is Ball Left Of Paddle және Is Ball Right Of Paddle шарттарына код жазуға тура келмеуі үшін, ол конструктор осы мәндерді тексеру үшін шарттарды жазатын жүйені құра алады. Сонда шешім ағашының деректері келесідей болады:

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Бұл бірінші кестедегі сияқты, бірақ шешімдердің өз коды бар, сәл if операторының шартты бөлігі сияқты. Код жағында бұл шешім түйіндері үшін екінші бағанда оқылады, бірақ орындалатын нақты шартты іздеудің орнына (Is Ball Left Of Paddle), ол шартты өрнекті бағалайды және сәйкесінше ақиқат немесе жалған мәнін қайтарады. Бұл Lua немесе Angelscript сценарий тілі арқылы жасалады. Оларды пайдалана отырып, әзірлеуші ​​өз ойынындағы объектілерді (доп және қалақ) ала алады және сценарийде қол жетімді болатын айнымалыларды жасай алады (ball.position). Сондай-ақ, сценарий тілі C++ тіліне қарағанда қарапайым. Ол толық құрастыру кезеңін қажет етпейді, сондықтан ол ойын логикасын жылдам реттеуге өте ыңғайлы және «кодер еместерге» қажетті функцияларды өздері жасауға мүмкіндік береді.

Жоғарыдағы мысалда сценарий тілі шартты өрнекті бағалау үшін ғана пайдаланылады, бірақ оны әрекеттер үшін де пайдалануға болады. Мысалы, Move Paddle Right деректері сценарий мәлімдемесіне айналуы мүмкін (ball.position.x += 10). Сонымен қатар, әрекет сценарийде Move Paddle Right бағдарламасының қажетінсіз анықталады.

Сіз одан әрі қарай жүріп, бүкіл шешім ағашын сценарий тілінде жаза аласыз. Бұл қатаң кодталған шартты мәлімдемелер түріндегі код болады, бірақ олар сыртқы сценарий файлдарында орналасады, яғни оларды бүкіл бағдарламаны қайта құрастырмай өзгертуге болады. Әр түрлі AI реакцияларын жылдам тексеру үшін ойын барысында сценарий файлын жиі өңдеуге болады.

Оқиғаға жауап беру

Жоғарыдағы мысалдар Понг үшін өте қолайлы. Олар Сезім/Ойлан/Әрекет циклін үздіксіз жүргізеді және әлемнің соңғы жағдайына сүйене отырып әрекет етеді. Бірақ күрделі ойындарда сіз жеке оқиғаларға жауап беруіңіз керек және бәрін бірден бағаламайсыз. Понг бұл жағдайда қазірдің өзінде жаман үлгі болып табылады. Басқасын таңдайық.

Атқышты елестетіп көріңізші, жаулар ойыншыны анықтағанша қозғалмай қалады, содан кейін олар өздерінің «мамандығына» қарай әрекет етеді: біреу «асығуға» жүгіреді, біреу алыстан шабуыл жасайды. Бұл әлі де негізгі реактивті жүйе - «егер ойыншы байқалса, бірдеңе жасаңыз» - бірақ оны Ойыншы көрген оқиғаға және Реакцияға логикалық түрде бөлуге болады (жауапты таңдап, оны орындаңыз).

Бұл бізді сезім/ойлау/әрекет ету цикліне қайтарады. Біз AI ойнатқышты көретін-көрмейтінін тексеретін әрбір кадрды тексеретін Sense бөлігін кодтай аламыз. Олай болмаса, ештеңе болмайды, бірақ көрсе, Ойыншы көрген оқиғасы жасалады. Кодта «ойыншы көрген оқиға орын алғанда, орындаңыз» деген бөлек бөлім болады, онда «Ойлан және әрекет» бөліктеріне жауап беру керек. Осылайша, сіз Player Seen оқиғасына реакцияларды орнатасыз: «асығыс» кейіпкер үшін - ChargeAndAttack және мерген үшін - HideAndSnipe. Бұл қатынастарды деректер файлында қайта құрастырусыз жылдам өңдеу үшін жасауға болады. Мұнда сценарий тілін де қолдануға болады.

Күрделі шешімдер қабылдау

Қарапайым реакциялық жүйелер өте күшті болғанымен, олар жеткіліксіз болатын жағдайлар көп. Кейде агент қазіргі уақытта не істеп жатқанына байланысты әртүрлі шешімдер қабылдау керек, бірақ мұны шарт ретінде елестету қиын. Кейде оларды шешім ағашында немесе сценарийде тиімді көрсету үшін шарттар тым көп. Кейде келесі қадам туралы шешім қабылдамас бұрын жағдайдың қалай өзгеретінін алдын ала бағалау керек. Бұл мәселелерді шешу үшін неғұрлым күрделі тәсілдер қажет.

Ақырлы күй машинасы

Ақырлы күй машинасы немесе FSM (соңғы күй машинасы) біздің агент қазіргі уақытта бірнеше мүмкін күйлердің бірінде екенін және оның бір күйден екіншісіне ауыса алатынын айту тәсілі. Мұндай штаттардың белгілі бір саны бар — атауы осыдан. Өмірдің ең жақсы үлгісі – бағдаршам. Әртүрлі жерлерде әртүрлі шамдар тізбегі бар, бірақ принцип бірдей - әрбір күй бір нәрсені білдіреді (тоқтату, жүру және т.б.). Бағдаршам кез келген уақытта тек бір күйде болады және қарапайым ережелер негізінде бірінен екіншісіне ауысады.

Бұл ойындардағы NPC-мен ұқсас оқиға. Мысалы, келесі күйлері бар күзетшіні алайық:

  • Патрульдеу.
  • Шабуыл жасау.
  • қашу.

Және оның күйін өзгерту үшін мына шарттар:

  • Қарауыл жауды көрсе, шабуыл жасайды.
  • Егер күзетші шабуыл жасаса, бірақ енді жауды көрмесе, ол патрульге қайтады.
  • Егер күзетші шабуыл жасаса, бірақ ауыр жарақат алса, ол қашып кетеді.

Сондай-ақ, егер қамқорлық күйінің айнымалысы және әртүрлі тексерулері бар if-мәлімдемелерін жазуға болады: жақын жерде жау бар ма, NPC денсаулық деңгейі қандай және т.б.. Тағы бірнеше күйді қосайық:

  • Бос жүріс – патрульдер арасында.
  • Іздеу - байқаған жау жоғалған кезде.
  • Көмек табу - жауды байқаған кезде, бірақ жалғыз күресуге тым күшті.

Олардың әрқайсысы үшін таңдау шектеулі - мысалы, сақшы денсаулығы нашар болса, жасырын жауды іздемейді.

Өйткені, «егер» дегендердің үлкен тізімі бар. , Бұл « тым ауыр болуы мүмкін, сондықтан біз күйлер мен мемлекеттер арасындағы ауысуларды есте сақтауға мүмкіндік беретін әдісті ресімдеуіміз керек. Ол үшін біз барлық күйлерді есепке аламыз және әрбір штаттың астына басқа күйлерге барлық өтулерді оларға қажетті шарттармен бірге тізімге жазамыз.

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Бұл күйдің ауысу кестесі - FSM ұсынудың кешенді тәсілі. Диаграмманы сызып, NPC мінез-құлқы қалай өзгеретіні туралы толық шолуды алайық.

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Диаграмма ағымдағы жағдайға негізделген осы агент үшін шешім қабылдаудың мәнін көрсетеді. Оның үстіне әрбір көрсеткі жанындағы шарт ақиқат болса, күйлер арасындағы ауысуды көрсетеді.

Әрбір жаңарту агенттің ағымдағы күйін тексереміз, ауысулар тізімін қарап шығамыз және егер көшу шарттары орындалса, ол жаңа күйді қабылдайды. Мысалы, әрбір кадр 10 секундтық таймер мерзімінің біткенін тексереді, егер солай болса, күзет жұмыссыз күйден патрульдеу режиміне өтеді. Сол сияқты, шабуылдаушы күй агенттің денсаулығын тексереді - егер ол төмен болса, ол қашу күйіне өтеді.

Бұл мемлекеттер арасындағы ауысуларды өңдеу, бірақ мемлекеттердің өздерімен байланысты мінез-құлық туралы не деуге болады? Белгілі бір күй үшін нақты әрекетті жүзеге асыру тұрғысынан әдетте FSM-ге әрекеттерді тағайындайтын «ілмектің» екі түрі бар:

  • Ағымдағы күй үшін мерзімді түрде орындайтын әрекеттер.
  • Бір күйден екінші күйге өткенде жасайтын әрекеттеріміз.

Бірінші түрге мысалдар. Патрульдеу күйі агентті патрульдік маршрут бойынша әрбір кадрға жылжытады. Шабуыл жасаушы мемлекет әрбір кадрға немесе мүмкін болатын күйге өтуге шабуылды бастауға әрекет жасайды.

Екінші түрі үшін көшуді қарастырыңыз «егер жау көрініп тұрса және жау тым күшті болса, онда «Анықтама іздеу» күйіне өтіңіз. Агент анықтама алу үшін қайда бару керектігін таңдауы керек және анықтаманы табу күйі қайда бару керектігін білуі үшін бұл ақпаратты сақтауы керек. Анықтама табылғаннан кейін агент шабуылдау күйіне қайтады. Осы кезде ол одақтасқа қауіп туралы айтқысы келеді, сондықтан NotifyFriendOfThreat әрекеті орын алуы мүмкін.

Тағы да біз бұл жүйеге Сезім/Ойлан/Әрекет циклінің объективі арқылы қарай аламыз. Сезім ауысу логикасы пайдаланатын деректерде бейнеленген. Ойлан - ауысулар әр штатта қолжетімді. Ал акт мемлекет ішінде немесе мемлекеттер арасындағы ауысуларда мерзімді түрде орындалатын әрекеттер арқылы жүзеге асырылады.

Кейде үздіксіз дауыс беруге өту шарттары қымбат болуы мүмкін. Мысалы, егер әрбір агент жауларды көре алатынын анықтау және патрульдеу күйінен Шабуыл жасау күйіне өту мүмкіндігін түсіну үшін әрбір кадр күрделі есептеулерді орындаса, бұл процессордың көп уақытын алады.

Әлемнің жағдайындағы маңызды өзгерістерді олар болған кезде өңделетін оқиғалар ретінде қарастыруға болады. FSM өтпелі шартты тексерудің орнына «менің агентім ойнатқышты көре ала ма?» әр кадр сайын, жеке жүйені сирек тексеру үшін конфигурациялауға болады (мысалы, секундына 5 рет). Нәтиже - тексеруден өткен кезде Player Seen шығару.

Бұл FSM-ге жіберіледі, ол енді Ойыншы көрген оқиғаның қабылданған шартына өтіп, сәйкесінше жауап беруі керек. Жауап беруден бұрын дерлік байқалмайтын кідірісті қоспағанда, нәтиже бірдей. Бірақ Sense бөлігін бағдарламаның жеке бөлігіне бөлу нәтижесінде өнімділік жақсарды.

Иерархиялық ақырлы күй машинасы

Дегенмен, үлкен FSM-мен жұмыс істеу әрқашан ыңғайлы емес. Егер біз MeleeAttacking және RangedAttacking-ті ажырату үшін шабуыл күйін кеңейткіміз келсе, бізге шабуыл күйіне әкелетін барлық басқа күйлердің (ағымдағы және болашақ) ауысуларын өзгертуге тура келеді.

Біздің мысалда қайталанатын ауысулар көп екенін байқаған боларсыз. Күту күйіндегі өтулердің көпшілігі патрульдеу күйіндегі ауысулармен бірдей. Өзімізді қайталамасақ жақсы болар еді, әсіресе ұқсас күйлерді көбірек қоссақ. Бос жүріс пен патрульді «жауынгерлік емес» деген жалпы белгімен топтастыру мағынасы бар, мұнда ұрыс жағдайына өтудің бір ғана ортақ жиынтығы бар. Егер біз бұл белгіні мемлекет ретінде қарастыратын болсақ, онда Idling және Patrolling қосалқы күйге айналады. Жаңа жауынгерлік емес қосалқы жағдай үшін бөлек ауысу кестесін пайдалану мысалы:

Негізгі мемлекеттер:
Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Жауынгерлік емес күй:
Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Ал диаграмма түрінде:

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Бұл бірдей жүйе, бірақ бос жүріс пен патрульді қамтитын жаңа жауынгерлік емес күймен. Қосалқы күйлері бар FSM бар әрбір күйде (және бұл қосалқы күйлер, өз кезегінде, өздерінің FSM-терін қамтитын - және сізге қажет болғанша солай), біз Иерархиялық ақырлы күй машинасын немесе HFSM (иерархиялық ақырлы күй машинасы) аламыз. Жауынгерлік емес жағдайды топтастыру арқылы біз артық ауысулардың шоғырын кесіп тастадық. Ортақ ауысулары бар кез келген жаңа мемлекеттер үшін де солай істей аламыз. Мысалы, егер болашақта біз шабуылдаушы күйді Melee Attacking және Missile Attacking күйлеріне кеңейтсек, олар жауға дейінгі қашықтыққа және оқ-дәрілердің қолжетімділігіне қарай бір-біріне ауысатын қосалқы күйлер болады. Нәтижесінде күрделі мінез-құлық пен ішкі мінез-құлық ең аз қайталанатын ауысулармен ұсынылуы мүмкін.

Мінез-құлық ағашы

HFSM көмегімен мінез-құлықтың күрделі комбинациялары қарапайым жолмен жасалады. Дегенмен, өтпелі ережелер түріндегі шешім қабылдау қазіргі жағдаймен тығыз байланысты болатын аздап қиындық бар. Көптеген ойындарда дәл осы нәрсе қажет. Ал мемлекеттік иерархияны мұқият пайдалану өтпелі қайталаулардың санын азайтуы мүмкін. Бірақ кейде қандай күйде болсаңыз да жұмыс істейтін немесе кез келген штатта қолданылатын ережелер қажет. Мысалы, егер агенттің денсаулығы 25%-ға дейін төмендесе, оның шайқаста, бос жүргеніне немесе сөйлескеніне қарамастан қашуын қалайсыз - бұл шартты әрбір мемлекетке қосу керек. Егер сіздің дизайнеріңіз кейінірек денсаулықтың төменгі шегін 25% -дан 10% -ға дейін өзгерткісі келсе, мұны қайтадан жасау керек болады.

Ең дұрысы, бұл жағдай тек бір жерде өзгерістер енгізу және өтпелі жағдайларға әсер етпеу үшін «қандай күйде болу» туралы шешімдер штаттардың өздерінен тыс болатын жүйені талап етеді. Мінез-құлық ағаштары осы жерде пайда болады.

Оларды жүзеге асырудың бірнеше жолы бар, бірақ мәні барлығы үшін шамамен бірдей және шешім ағашына ұқсас: алгоритм «түбір» түйінінен басталады, ал ағашта не шешімдерді, не әрекеттерді білдіретін түйіндер бар. Дегенмен, бірнеше негізгі айырмашылықтар бар:

  • Түйіндер енді үш мәннің бірін қайтарады: Сәтті (егер тапсырма аяқталса), Сәтсіз (егер оны бастау мүмкін болмаса) немесе Орындалуда (егер ол әлі жұмыс істеп тұрса және түпкілікті нәтиже болмаса).
  • Екі балама арасында таңдау үшін шешім түйіндері жоқ. Оның орнына олар бір еншілес түйіні бар Декоратор түйіндері. Егер олар сәтті болса, олар жалғыз еншілес түйінді орындайды.
  • Әрекеттерді орындайтын түйіндер орындалып жатқан әрекеттерді көрсету үшін Іске қосу мәнін қайтарады.

Бұл шағын түйіндер жиынтығы күрделі әрекеттердің үлкен санын жасау үшін біріктірілуі мүмкін. Алдыңғы мысалдағы HFSM қорғаушысын мінез-құлық ағашы ретінде елестетейік:

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Бұл құрылыммен жұмыссыз/патрульдік күйден шабуылдаушы немесе кез келген басқа күйлерге айқын ауысу болмауы керек. Егер жау көрініп тұрса және кейіпкердің денсаулығы төмен болса, орындау оның бұрын орындаған түйініне қарамастан - Қашу түйінінде тоқтатылады - патрульдеу, бос жүру, шабуылдау немесе кез келген басқа.

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Мінез-құлық ағаштары күрделі - оларды құрастырудың көптеген жолдары бар және декораторлар мен күрделі түйіндердің дұрыс комбинациясын табу қиын болуы мүмкін. Сондай-ақ, ағашты қаншалықты жиі тексеру керектігі туралы сұрақтар бар - біз оның әрбір бөлігін аралап өткіміз келеді ме, әлде шарттардың бірі өзгерген кезде ғана? Түйіндерге қатысты күйді қалай сақтаймыз - біз 10 секунд бойы жұмыс істемей тұрғанымызды қалай білеміз немесе тізбекті дұрыс өңдеу үшін соңғы рет қай түйіндер орындалғанын қалай білеміз?

Сондықтан көптеген іске асырулар бар. Мысалы, кейбір жүйелер декоратор түйіндерін кірістірілген декораторлармен ауыстырды. Олар декоратор шарттары өзгерген кезде ағашты қайта бағалайды, түйіндерге қосылуға көмектеседі және мерзімді жаңартуларды қамтамасыз етеді.

Утилитаға негізделген жүйе

Кейбір ойындарда әртүрлі механика бар. Олар қарапайым және жалпы өтпелі ережелердің барлық артықшылықтарын алғаны жөн, бірақ міндетті түрде толық мінез-құлық ағашы түрінде емес. Таңдаудың нақты жиынтығы немесе ықтимал әрекеттер ағашының орнына, барлық әрекеттерді қарап шығу және қазіргі уақытта ең қолайлысын таңдау оңайырақ.

Бұл үшін утилитаға негізделген жүйе көмектеседі. Бұл агентте әртүрлі әрекеттер бар және әрқайсысының салыстырмалы пайдалылығына қарай қайсысын орындау керектігін таңдайтын жүйе. Бұл жерде утилита агент үшін осы әрекетті орындау қаншалықты маңызды немесе қажет екенін көрсететін ерікті өлшем болып табылады.

Ағымдағы күйге және ортаға негізделген әрекеттің есептелген утилитасы, агент кез келген уақытта ең қолайлы басқа күйді тексеріп, таңдай алады. Бұл ауысулар әрбір әлеуетті күй, соның ішінде ағымдағы күй үшін бағалау арқылы анықталатын жағдайларды қоспағанда, FSM-ге ұқсас. Біз жалғастыру үшін ең пайдалы әрекетті таңдайтынымызды ескеріңіз (немесе оны аяқтаған болсақ, қалыңыз). Көбірек әртүрлілік үшін бұл шағын тізімнен теңдестірілген, бірақ кездейсоқ таңдау болуы мүмкін.

Жүйе пайдалы мәндердің ерікті диапазонын тағайындайды — мысалы, 0-ден (толық қажет емес) 100-ге дейін (толық қажет). Әрбір әрекетте осы мәнді есептеуге әсер ететін бірқатар параметрлер бар. Біздің қамқоршының мысалына оралсақ:

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Әрекеттер арасындағы ауысулар анық емес — кез келген күй басқа кез келген күйге ілесе алады. Әрекет басымдықтары қайтарылған утилита мәндерінде табылады. Егер жау көрініп тұрса және ол жау күшті болса және кейіпкердің денсаулығы төмен болса, Fleeing және FindingHelp екеуі де нөлден басқа жоғары мәндерді қайтарады. Бұл жағдайда FindingHelp әрқашан жоғары болады. Сол сияқты, жауынгерлік емес әрекеттер ешқашан 50-ден аспайды, сондықтан олар әрқашан жауынгерлік әрекеттерден төмен болады. Әрекеттерді жасау және олардың пайдалылығын есептеу кезінде мұны ескеру қажет.

Біздің мысалда әрекеттер тіркелген тұрақты мәнді немесе екі тіркелген мәннің бірін қайтарады. Нақтырақ жүйе мәндердің үздіксіз ауқымынан бағалауды қайтарады. Мысалы, «Қашу» әрекеті агенттің денсаулығы төмен болса, жоғары утилита мәндерін қайтарады, ал егер жау тым күшті болса, шабуыл әрекеті төменгі утилита мәндерін қайтарады. Осыған байланысты, агент жауды жеңу үшін денсаулығы жеткіліксіз деп есептейтін кез келген жағдайда, Қашу әрекеті Шабуылдан басым болады. Бұл кез келген критерийлер санына негізделген әрекеттерге басымдық беруге мүмкіндік береді, бұл тәсілді мінез-құлық ағашына немесе FSM-ге қарағанда икемді және айнымалы етеді.

Әрбір әрекетте бағдарламаны есептеу үшін көптеген шарттар бар. Оларды сценарий тілінде немесе математикалық формулалар қатарында жазуға болады. Кейіпкердің күнделікті жұмысын имитациялайтын Sims қосымша есептеу қабатын қосады - агент утилиталардың рейтингтеріне әсер ететін «мотивациялар» сериясын алады. Егер кейіпкер аш болса, олар уақыт өте аштырады және EatFood әрекетінің пайдалылық мәні кейіпкер оны орындамайынша артып, аштық деңгейін төмендетеді және EatFood мәнін нөлге қайтарады.

Рейтинг жүйесіне негізделген әрекеттерді таңдау идеясы өте қарапайым, сондықтан утилитаға негізделген жүйе оларды толық ауыстыру ретінде емес, AI шешімдер қабылдау процестерінің бөлігі ретінде пайдаланылуы мүмкін. Шешім ағашы екі еншілес түйіннің пайдалылық рейтингін сұрап, жоғарырақ таңдауы мүмкін. Сол сияқты, мінез-құлық ағашында қандай баланы орындау керектігін шешу үшін әрекеттердің пайдалылығын бағалау үшін құрамдас қызметтік бағдарлама түйіні болуы мүмкін.

Қозғалыс және навигация

Алдыңғы мысалдарда бізде солға немесе оңға жылжыйтын платформа және патрульдік немесе шабуыл жасайтын күзетші болды. Бірақ белгілі бір уақыт аралығындағы агент қозғалысын нақты қалай өңдейміз? Жылдамдықты қалай орнатамыз, кедергілерден қалай аулақ боламыз және межелі жерге жету түзу сызықпен жүруден қиынырақ болса, маршрутты қалай жоспарлаймыз? Осыны қарастырайық.

Басқару

Бастапқы кезеңде біз әрбір агенттің жылдамдығының мәні бар деп есептейміз, ол оның қаншалықты жылдам және қай бағытта қозғалатынын қамтиды. Оны секундына метрмен, сағатына километрмен, секундына пиксельмен және т.б. өлшеуге болады. Сезім/Ойлан/Әрекет циклін еске түсіре отырып, біз «Ойлан» бөлігі жылдамдықты таңдайтынын елестете аламыз, ал Акт бөлігі бұл жылдамдықты агентке қолданады. Әдетте ойындарда бұл тапсырманы сіз үшін орындайтын, әрбір нысанның жылдамдық мәнін үйренетін және оны реттейтін физика жүйесі бар. Сондықтан, сіз AI-ны бір тапсырмамен қалдыра аласыз - агенттің жылдамдығы қандай болуы керек екенін шешу. Егер агент қай жерде болуы керек екенін білсеңіз, оны белгіленген жылдамдықпен дұрыс бағытта жылжыту керек. Өте тривиальды теңдеу:

қалаған_саяхат = тағайындалған_позиция – агент_позициясы

2D әлемін елестетіңіз. Агент (-2,-2) нүктесінде, межелі орын солтүстік-шығыстың бір жерінде (30, 20) нүктеде және агентке жету үшін қажетті жол (32, 22). Бұл позициялар метрмен өлшенеді делік - егер агент жылдамдығын секундына 5 метр деп алсақ, онда біз орын ауыстыру векторын масштабтаймыз және шамамен (4.12, 2.83) жылдамдықты аламыз. Осы параметрлермен агент тағайындалған жерге шамамен 8 секундта жетеді.

Сіз кез келген уақытта мәндерді қайта есептей аласыз. Егер агент мақсатқа жарты жолда болса, қозғалыс ұзындығының жартысы болар еді, бірақ агенттің максималды жылдамдығы 5 м/с болғандықтан (біз мұны жоғарыда шештік), жылдамдық бірдей болады. Бұл сондай-ақ қозғалатын нысандар үшін жұмыс істейді, олар қозғалған кезде агентке шағын өзгерістер жасауға мүмкіндік береді.

Бірақ біз көбірек вариацияны қалаймыз - мысалы, тұрғаннан жүгіруге ауысатын кейіпкерді имитациялау үшін жылдамдықты баяу арттыру. Соңында тоқтау алдында да солай жасауға болады. Бұл мүмкіндіктер рульдік мінез-құлық ретінде белгілі, олардың әрқайсысының нақты атаулары бар: Іздеу, қашу, келу, т.б.. Идеясы агенттің орнын және ағымдағы жылдамдығын межелі орынмен салыстыруға негізделген агент жылдамдығына жеделдету күштерін қолдануға болады. мақсатқа жетудің әртүрлі әдістерін қолдану үшін.

Әрбір мінез-құлық сәл өзгеше мақсатқа ие. Іздеу және келу - агентті тағайындалған жерге жылжыту жолы. Кедергілерді болдырмау және бөлу мақсатқа жету жолындағы кедергілерді болдырмау үшін агенттің қозғалысын реттейді. Alignment және Cohesion агенттердің бірге қозғалуын қамтамасыз етеді. Барлық факторларды ескере отырып, бір жол векторын шығару үшін әртүрлі басқару әрекеттерінің кез келген санын жинақтауға болады. Қабырғалардан және басқа агенттерден аулақ болу үшін келу, бөлу және кедергілерді болдырмау әрекеттерін пайдаланатын агент. Бұл тәсіл қажетсіз мәліметтерсіз ашық жерлерде жақсы жұмыс істейді.

Неғұрлым қиын жағдайларда әртүрлі мінез-құлықтарды қосу нашар жұмыс істейді - мысалы, келу және кедергілерді болдырмау арасындағы қайшылыққа байланысты агент қабырғаға кептеліп қалуы мүмкін. Сондықтан барлық мәндерді жай ғана қосудан гөрі күрделірек опцияларды қарастыру керек. Мұның жолы: әр мінез-құлықтың нәтижелерін қосудың орнына әртүрлі бағыттағы қозғалыстарды қарастырып, ең жақсы нұсқаны таңдауға болады.

Дегенмен, тығырыққа тірелген және қандай жолмен жүру керектігін таңдауы бар күрделі ортада бізге одан да жетілдірілген нәрсе қажет болады.

Жол табу

Рульді басқару тәртібі ашық алаңда (футбол алаңы немесе манеж) қарапайым қозғалыс үшін тамаша, мұнда А-дан В-ге жету - кедергілерді айналып өтетін аз ғана айналма жолдармен түзу жол. Күрделі маршруттар үшін бізге әлемді зерттеу және ол арқылы өтетін бағытты шешу тәсілі болып табылатын жолды анықтау керек.

Ең қарапайымы - агенттің жанындағы әрбір шаршыға торды қолдану және олардың қайсысын жылжытуға рұқсат етілгенін бағалау. Егер олардың біреуі межелі орын болса, басына жеткенше әр шаршыдан алдыңғыға дейінгі бағытпен жүріңіз. Бұл маршрут. Әйтпесе, межелі орынды тапқанша немесе шаршылар таусылғанша (мүмкін маршрут жоқ дегенді білдіреді) процесті жақын маңдағы басқа квадраттармен қайталаңыз. Бұл ресми түрде Кеңдік-Бірінші іздеу немесе BFS (кеңдік-бірінші іздеу алгоритмі) ретінде белгілі. Әр қадам сайын ол жан-жақты қарайды (демек ендігі, «ені»). Іздеу кеңістігі қажетті орынға жеткенше қозғалатын толқындық бетке ұқсайды - іздеу кеңістігі әрбір қадамда соңғы нүкте енгізілгенше кеңейеді, содан кейін оны басына дейін байқауға болады.

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Нәтижесінде сіз қалаған маршрут құрастырылған квадраттардың тізімін аласыз. Бұл жол (демек, жол табу) – агент тағайындалған жерге бара жатқанда баратын орындардың тізімі.

Әлемдегі әрбір шаршының орнын білетіндігімізді ескере отырып, біз жол бойымен қозғалу үшін басқару әрекеттерін пайдалана аламыз - 1 түйіннен 2 түйінге, содан кейін 2 түйіннен 3 түйінге және т.б. Ең қарапайым нұсқа - келесі шаршының ортасына қарай бағыт алу, бірақ одан да жақсы нұсқа - ағымдағы шаршы мен келесінің арасындағы жиектің ортасында тоқтау. Осының арқасында агент күрт бұрылыстарда бұрыштарды кесуге қабілетті болады.

BFS алгоритмінің кемшіліктері де бар - ол «дұрыс» бағыттағы сияқты «дұрыс емес» бағыттағы квадраттарды зерттейді. Дәл осы жерде A* (Жұлдыз) деп аталатын күрделірек алгоритм ойнайды. Ол дәл осылай жұмыс істейді, бірақ көрші квадраттарды (содан кейін көршілердің көршілері, содан кейін көршілердің көршілерінің көршілері және т.б.) соқыр қараудың орнына ол түйіндерді тізімге жинап, келесі тексерілетін түйін әрқашан болатындай етіп сұрыптайды. ең қысқа жолға апаратын біреуі. Түйіндер екі нәрсені ескеретін эвристика негізінде сұрыпталады: қалаған шаршыға дейінгі гипотетикалық маршруттың «құны» (кез келген жол жүру шығындарын қоса алғанда) және осы шаршының межелі жерден қаншалықты қашықтығын бағалау (іздеуде іздеуге бейімділік). дұрыс бағыт).

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Бұл мысал агент бір уақытта бір шаршыны зерттейтінін көрсетеді, әр жолы ең перспективалы көршісін таңдайды. Алынған жол BFS сияқты, бірақ процесте аз квадраттар қарастырылды - бұл ойын өнімділігіне үлкен әсер етеді.

Торсыз қозғалыс

Бірақ ойындардың көпшілігі торға қойылмаған және реализмді құрбан етпей мұны істеу жиі мүмкін емес. Ымыраға келу керек. Шаршы өлшемдері қандай болуы керек? Тым үлкен және олар шағын дәліздерді немесе бұрылыстарды дұрыс көрсете алмайды, тым кішкентай және іздеу үшін тым көп квадраттар болады, бұл сайып келгенде көп уақытты алады.

Түсінетін бірінші нәрсе - тор бізге қосылған түйіндердің графигін береді. A* және BFS алгоритмдері шын мәнінде графиктерде жұмыс істейді және біздің торымызға мүлдем мән бермейді. Біз түйіндерді ойын әлемінің кез келген жеріне қоя аламыз: кез келген қосылатын екі түйін арасында, сондай-ақ бастапқы және соңғы нүктелер мен түйіндердің кем дегенде біреуі арасында байланыс болған кезде, алгоритм бұрынғыдай жақсы жұмыс істейді. Бұл жиі жол нүктесі жүйесі деп аталады, өйткені әрбір түйін әлемдегі кез келген гипотетикалық жолдар санының бөлігі бола алатын маңызды орынды білдіреді.

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық
1-мысал: әр шаршыдағы түйін. Іздеу агент орналасқан түйіннен басталып, қажетті квадраттың түйінінде аяқталады.

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық
2-мысал: Түйіндердің кішірек жиыны (жол нүктелері). Іздеу агент шаршысынан басталып, қажетті түйіндер саны арқылы өтеді, содан кейін тағайындалған жерге дейін жалғасады.

Бұл толығымен икемді және қуатты жүйе. Бірақ жол нүктесін қайда және қалай орналастыру керектігін шешуде біраз сақтық қажет, әйтпесе агенттер ең жақын нүктені көре алмауы және жолды бастай алмауы мүмкін. Әлемнің геометриясына негізделген жол нүктелерін автоматты түрде орналастырсақ, оңайырақ болар еді.

Бұл жерде навигациялық тор немесе navmesh (навигациялық тор) пайда болады. Бұл әдетте әлемнің геометриясында - агент жүруге рұқсат етілген жерде жабылған үшбұрыштардың 2D торы. Тордағы үшбұрыштардың әрқайсысы графиктегі түйінге айналады және графикте іргелес түйіндерге айналатын үш іргелес үшбұрышқа дейін болады.

Бұл сурет Unity қозғалтқышының мысалы болып табылады - ол әлемдегі геометрияны талдап, навмеш жасады (скриншотта ашық көк түспен). Навмештегі әрбір көпбұрыш агент тұра алатын немесе бір көпбұрыштан екінші көпбұрышқа ауыса алатын аумақ болып табылады. Бұл мысалда көпбұрыштар олар орналасқан қабаттардан кішірек - бұл агенттің номиналды позициясынан асып түсетін өлшемін ескеру үшін жасалады.

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Біз осы тор арқылы маршрутты қайтадан A* алгоритмі арқылы іздей аламыз. Бұл бізге барлық геометрияны ескеретін және қажетсіз түйіндер мен жол нүктелерін құруды қажет етпейтін әлемдегі тамаша дерлік маршрут береді.

Жолды іздеу - мақаланың бір бөлімі жеткіліксіз болатын тым кең тақырып. Егер сіз оны егжей-тегжейлі зерттегіңіз келсе, бұл көмектеседі Amit Patel веб-сайты.

Жоспарлау

Біз жол іздеу арқылы кейде жай ғана бағытты таңдап, қозғалу жеткіліксіз екенін түсіндік - қалаған жерімізге жету үшін бағытты таңдап, бірнеше бұрылыс жасау керек. Біз бұл идеяны жалпылай аламыз: мақсатқа жету - бұл келесі қадам ғана емес, кейде біріншісі қандай болуы керек екенін білу үшін бірнеше қадамды алға қарай қарау керек болатын тұтас дәйектілік. Бұл жоспарлау деп аталады. Жолды анықтауды жоспарлаудың бірнеше кеңейтімдерінің бірі ретінде қарастыруға болады. Сезім/Ойлан/Іс-әрекет циклі тұрғысынан бұл жерде «Ойлан» бөлігі болашаққа бірнеше Акт бөліктерін жоспарлайды.

«Сиқыр: Жиын» үстел ойынының мысалын қарастырайық. Алдымен біз қолымызда келесі карталар жиынтығымен барамыз:

  • Батпақ - 1 қара мана береді (жер картасы).
  • Орман - 1 жасыл мана береді (жер картасы).
  • Қашқын сиқыршы - шақыру үшін 1 көк мана қажет.
  • Elvish Mystic - Шақыру үшін 1 жасыл мана қажет.

Біз оны жеңілдету үшін қалған үш картаны елемейміз. Ережеге сәйкес, ойыншыға әр айналымда 1 жер картасын ойнауға рұқсат етіледі, ол осы картадан мананы алу үшін «түртіп», содан кейін мана мөлшеріне сәйкес заклинание (соның ішінде жаратылысты шақыру) жасай алады. Бұл жағдайда адам ойыншы Forest ойнауды, 1 жасыл мананы түртуді, содан кейін Elvish Mystic шақыруды біледі. Бірақ AI ойыны мұны қалай анықтай алады?

Жеңіл жоспарлау

Тривиальды тәсіл - қолайлы әрекеттер қалмайынша әрбір әрекетті кезекпен орындау. Карталарға қарап, AI Swamp не ойнай алатынын көреді. Және ол ойнайды. Осы кезекте басқа әрекеттер қалды ма? Ол элвиш мистикасын да, қашқын сиқыршыны да шақыра алмайды, өйткені оларды шақыру үшін жасыл және көк мана қажет, ал батпақ тек қара мананы береді. Және ол бұдан былай Орманды ойнай алмайды, өйткені ол батпақты ойнады. Осылайша, ойын АИ ережелерді сақтады, бірақ оны нашар жасады. Жақсартуға болады.

Жоспарлау ойынды қажетті күйге келтіретін әрекеттер тізімін таба алады. Жолдағы әрбір шаршының көршілері (жол іздеуде) болғаны сияқты, жоспардағы әрбір әрекеттің де көршілері немесе мұрагерлері болады. Біз бұл әрекеттерді және одан кейінгі әрекеттерді қалаған күйге жеткенше іздей аламыз.

Біздің мысалда қалаған нәтиже «мүмкіндігінше тіршілік иесін шақыру». Бұрылыстың басында біз ойын ережелерімен рұқсат етілген екі мүмкін әрекетті ғана көреміз:

1. Swamp ойнаңыз (нәтиже: ойында батпақ)
2. «Орман» ойынын ойнаңыз (нәтиже: ойында орман)

Әрбір орындалған әрекет ойын ережелеріне байланысты келесі әрекеттерге әкелуі және басқаларды жабуы мүмкін. Біз Swamp ойнадық деп елестетіңіз - бұл келесі қадам ретінде батпақты алып тастайды (біз оны ойнадық) және бұл орманды да жояды (себебі ережелерге сәйкес сіз әр айналымға бір жер картасын ойнай аласыз). Осыдан кейін AI келесі қадам ретінде 1 қара мананы қосады, өйткені басқа опциялар жоқ. Егер ол алға өтіп, Tap the Swamp таңдаса, ол 1 бірлік қара мананы алады және онымен ештеңе істей алмайды.

1. Swamp ойнаңыз (нәтиже: ойында батпақ)
1.1 «Түртіп алу» батпағы (нәтиже: батпақ «түйінді», +1 қара мана бірлігі)
Қолжетімсіз әрекеттер – END
2. «Орман» ойынын ойнаңыз (нәтиже: ойында орман)

Әрекеттер тізімі қысқа болды, тығырыққа тірелдік. Келесі қадам үшін процесті қайталаймыз. Біз орманды ойнаймыз, «1 жасыл мана алу» акциясын ашамыз, ол өз кезегінде үшінші әрекетті ашады - Elvish Mystic шақыру.

1. Swamp ойнаңыз (нәтиже: ойында батпақ)
1.1 «Түртіп алу» батпағы (нәтиже: батпақ «түйінді», +1 қара мана бірлігі)
Қолжетімсіз әрекеттер – END
2. «Орман» ойынын ойнаңыз (нәтиже: ойында орман)
2.1 «Түрту» орманы (нәтиже: Орман «тұқылды», +1 жасыл мана бірлігі)
2.1.1 Elvish Mystic шақыру (нәтиже: ойында Elvish Mystic, -1 жасыл мана)
Қолжетімсіз әрекеттер – END

Соңында біз барлық мүмкін әрекеттерді зерттеп, тіршілік иесін шақыратын жоспарды таптық.

Бұл өте жеңілдетілген мысал. Кейбір критерийлерге сәйкес келетін кез келген жоспарды емес, мүмкін болатын ең жақсы жоспарды таңдаған жөн. Әлеуетті жоспарларды олардың орындалуының нәтижесі немесе жалпы пайдасы негізінде бағалауға болады. Сіз жер картасын ойнағаныңыз үшін 1 ұпай және тіршілік иесін шақырғаныңыз үшін 3 ұпай жинай аласыз. Swamp ойнау 1 ұпайлық жоспар болар еді. Орман → Орманды түртіңіз → Elvish Mystic шақырыңыз ойнау бірден 4 ұпай береді.

Magic: The Gathering бағдарламасында жоспарлау осылай жұмыс істейді, бірақ сол логика басқа жағдайларда қолданылады. Мысалы, шахматта епископтың қозғалуына орын беру үшін пешканы жылжыту. Немесе XCOM-да осылай қауіпсіз түсіру үшін қабырғаның артына жасырыңыз. Жалпы, сіз идеяны түсінесіз.

Жақсартылған жоспарлау

Кейде әрбір ықтимал нұсқаны қарастыру үшін тым көп ықтимал әрекеттер бар. Сиқырлы мысалға оралу: Жиналу: ойында және сіздің қолыңызда бірнеше жер және тіршілік карталары бар делік - қозғалыстардың ықтимал комбинацияларының саны ондаған болуы мүмкін. Мәселені шешудің бірнеше жолы бар.

Бірінші әдіс - кері тізбектеу. Барлық комбинацияларды сынамай, түпкілікті нәтижеден бастап, тура жолды табуға тырысқан дұрыс. Ағаштың тамырынан белгілі бір жапыраққа өтудің орнына, біз қарама-қарсы бағытта - жапырақтан тамырға қарай жылжимыз. Бұл әдіс оңайырақ және жылдамырақ.

Егер қарсыластың денсаулығы 1 болса, сіз «1 немесе одан да көп зиян келтіру» жоспарын таба аласыз. Бұған қол жеткізу үшін бірқатар шарттарды орындау қажет:

1. Зақым заклинаниядан туындауы мүмкін - ол қолында болуы керек.
2. Заклинание жасау үшін мана керек.
3. Мананы алу үшін жер картасын ойнау керек.
4. Жер картасын ойнау үшін оны қолыңызда ұстау керек.

Тағы бір жолы - ең жақсы іздеу. Біз барлық жолдарды сынаудың орнына, ең қолайлысын таңдаймыз. Көбінесе бұл әдіс қажетсіз іздеу шығындарынсыз оңтайлы жоспарды береді. A* - ең жақсы бірінші іздеу түрі - ең перспективалы маршруттарды басынан бастап зерттей отырып, ол басқа опцияларды тексермей-ақ ең жақсы жолды таба алады.

Қызықты және танымал ең жақсы бірінші іздеу нұсқасы - Монте-Карло ағашын іздеу. Әрбір келесі әрекетті таңдаған кезде қандай жоспарлар басқаларға қарағанда жақсырақ екенін болжаудың орнына, алгоритм соңына жеткенше (жоспар жеңіске немесе жеңіліске әкелген кезде) әр қадамда кездейсоқ мұрагерлерді таңдайды. Содан кейін соңғы нәтиже алдыңғы опциялардың салмағын арттыру немесе азайту үшін пайдаланылады. Бұл процесті қатарынан бірнеше рет қайталау арқылы алгоритм жағдай өзгерсе де (егер қарсылас ойыншыға кедергі жасау үшін әрекет жасаса) келесі қадамның ең жақсысы қандай болатынын жақсы бағалайды.

Мақсатқа бағытталған әрекетті жоспарлау немесе GOAP (мақсатқа бағытталған әрекетті жоспарлау) болмаса, ойындардағы жоспарлау туралы әңгіме толық болмайды. Бұл кеңінен қолданылатын және талқыланатын әдіс, бірақ бірнеше ерекшеленетін мәліметтерден басқа, бұл біз бұрын айтқан кері тізбектеу әдісі. Егер мақсат «ойыншыны жою» болса және ойыншы қақпақтың артында болса, жоспар мынадай болуы мүмкін: гранатамен жою → оны алу → лақтыру.

Әдетте, әрқайсысының өз басымдығы бар бірнеше мақсаттар бар. Ең жоғары басымдықты мақсатты орындау мүмкін болмаса (әрекеттердің ешбір комбинациясы ойыншы көрінбейтіндіктен «ойыншыны өлтіру» жоспарын жасамайды), AI төменгі басымдықты мақсаттарға қайта оралады.

Жаттығу және бейімдеу

Біз AI ойыны әдетте машиналық оқытуды пайдаланбайтынын айттық, себебі ол нақты уақытта агенттерді басқаруға жарамайды. Бірақ бұл осы аймақтан бірдеңе алуға болмайды дегенді білдірмейді. Біз атқышта бірдеңе үйренетін қарсыласты қалаймыз. Мысалы, картадағы ең жақсы позициялар туралы біліңіз. Немесе жекпе-жек ойынындағы қарсылас, ол ойыншының жиі қолданатын комбо қимылдарына тосқауыл қойып, оны басқаларды қолдануға итермелейді. Сондықтан машиналық оқыту мұндай жағдайларда өте пайдалы болуы мүмкін.

Статистика және ықтималдықтар

Күрделі мысалдарға кіріспес бұрын, бірнеше қарапайым өлшемдерді қабылдау және оларды шешім қабылдау үшін пайдалану арқылы қаншалықты алысқа баруға болатынын көрейік. Мысалы, нақты уақыттағы стратегия – ойыншының ойынның алғашқы бірнеше минуттарында шабуыл жасай алатынын және оған қарсы қандай қорғанысты дайындау керектігін қалай анықтаймыз? Біз болашақ реакциялардың қандай болуы мүмкін екенін түсіну үшін ойыншының өткен тәжірибесін зерттей аламыз. Біріншіден, бізде мұндай бастапқы деректер жоқ, бірақ біз оны жинай аламыз - AI адамға қарсы ойнаған сайын, ол бірінші шабуыл уақытын жаза алады. Бірнеше сеанстан кейін біз ойыншының болашақта шабуыл жасауына кететін орташа уақытты аламыз.

Орташа мәндерге қатысты мәселе де бар: егер ойыншы 20 рет асықса және 20 рет баяу ойнаса, онда қажетті мәндер ортасында болады және бұл бізге пайдалы ештеңе бермейді. Бір шешім - кіріс деректерін шектеу - соңғы 20 бөлікті есепке алуға болады.

Ұқсас тәсіл ойыншының бұрынғы қалауы болашақта бірдей болады деп болжау арқылы белгілі бір әрекеттердің ықтималдығын бағалау кезінде қолданылады. Ойыншы бізге бес рет отты доппен, екі рет найзағаймен, бір рет жекпе-жекпен шабуыл жасаса, оның отты допты жақсы көретіні анық. Экстраполяция жасап, әртүрлі қаруларды қолдану ықтималдығын көрейік: от шары = 62,5%, найзағай = 25% және ұрыс = 12,5%. Біздің ойын AI өзін өрттен қорғауға дайындалуы керек.

Тағы бір қызықты әдіс - үлкен көлемдегі кіріс деректерін зерттеу және AI қажетті жолмен әрекет ететіндей жағдайды жіктеу үшін Naive Bayes классификаторын пайдалану. Байес классификаторлары электрондық пошта спам сүзгілерінде қолданылуымен танымал. Онда олар сөздерді зерттейді, оларды сол сөздердің бұрын пайда болған жерлерімен (спамда немесе жоқ) салыстырады және кіріс хаттар туралы қорытынды жасайды. Біз тіпті аз енгізулермен бірдей нәрсені жасай аламыз. AI көретін барлық пайдалы ақпаратқа (мысалы, қандай жау бөлімшелері құрылғаны немесе олар қандай заклинаниелерді пайдаланғаны немесе қандай технологияларды зерттегені) және түпкілікті нәтижеге (соғыс немесе бейбітшілік, асығыс немесе қорғаныс және т.б.) негізделген. - біз қалаған AI мінез-құлқын таңдаймыз.

Бұл оқыту әдістерінің барлығы жеткілікті, бірақ оларды тестілеу деректері негізінде қолданған жөн. Жасанды интеллект сіздің ойыншыларыңыз пайдаланған әртүрлі стратегияларға бейімделуді үйренеді. Шығарылғаннан кейін ойнатқышқа бейімделетін AI тым болжамды немесе жеңу тым қиын болуы мүмкін.

Құндылыққа негізделген бейімделу

Ойын әлемінің мазмұнын және ережелерді ескере отырып, біз кіріс деректерін пайдаланудың орнына шешім қабылдауға әсер ететін мәндер жинағын өзгерте аламыз. Біз мұны істейміз:

  • AI ойын кезіндегі әлемдегі жағдай мен негізгі оқиғалар туралы деректерді жинауға мүмкіндік беріңіз (жоғарыдағыдай).
  • Осы деректерге негізделген бірнеше маңызды мәндерді өзгертейік.
  • Біз өз шешімдерімізді осы құндылықтарды өңдеу немесе бағалау негізінде жүзеге асырамыз.

Мысалы, агентте бірінші адам ату картасынан таңдауға болатын бірнеше бөлме бар. Әрбір бөлменің өз құны бар, ол келудің қаншалықты қажет екенін анықтайды. AI мәнге қарай қай бөлмеге бару керектігін кездейсоқ таңдайды. Содан кейін агент қай бөлмеде өлтірілгенін есіне түсіреді және оның құнын төмендетеді (оның сол жерге оралу ықтималдығы). Сол сияқты кері жағдай үшін - егер агент көптеген қарсыластарды жойса, онда бөлменің құны артады.

Марков үлгісі

Жиналған деректерді болжау үшін пайдалансақ ше? Белгілі бір уақыт ішінде біз ойыншыны көретін әрбір бөлмені еске түсірсек, ойыншының қай бөлмеге бара алатынын болжай аламыз. Ойыншының бөлмелердегі (мәндер) қозғалысын қадағалау және жазу арқылы біз оларды болжай аламыз.

Үш бөлмені алайық: қызыл, жасыл және көк. Сондай-ақ ойын сеансын көру кезінде жазып алған бақылауларымыз:

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Әр бөлмедегі бақылаулар саны бірдей дерлік - біз әлі де буксирлеуге жақсы орын жасауды білмейміз. Статистиканы жинау картада біркелкі көрінетін ойыншылардың қайта туылуымен де қиындайды. Бірақ олар картада пайда болғаннан кейін кіретін келесі бөлме туралы деректер қазірдің өзінде пайдалы.

Жасыл бөлме ойыншыларға сәйкес келетінін көруге болады - адамдардың көпшілігі қызыл бөлмеден оған көшеді, олардың 50% одан әрі сонда қалады. Көк бөлме, керісінше, танымал емес, оған ешкім бармайды, ал егер барса, олар ұзақ тұрмайды.

Бірақ деректер бізге маңыздырақ нәрсені айтады - ойыншы көк бөлмеде болғанда, біз оны көретін келесі бөлме жасыл емес, қызыл болады. Жасыл бөлме қызыл бөлмеге қарағанда танымал болса да, ойыншы көк бөлмеде болса, жағдай өзгереді. Келесі күй (яғни, ойыншы баратын бөлме) алдыңғы күйге (яғни, ойнатқыш қазір орналасқан бөлме) байланысты. Тәуелділіктерді зерттейтіндіктен, біз бақылауларды тәуелсіз санағанымыздан гөрі дәлірек болжам жасаймыз.

Өткен күйдегі деректер негізінде болашақ күйді болжау Марков үлгісі деп аталады, ал мұндай мысалдар (бөлмелермен) Марков тізбектері деп аталады. Үлгілер дәйекті күйлер арасындағы өзгерістердің ықтималдығын білдіретіндіктен, олар әрбір ауысудың айналасында ықтималдығы бар FSM ретінде көрнекі түрде көрсетіледі. Бұрын біз агент болған мінез-құлық күйін көрсету үшін FSM қолдандық, бірақ бұл тұжырымдама агентпен байланысты ма, жоқ па, кез келген күйге таралады. Бұл жағдайда штаттар агент алатын бөлмені білдіреді:

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Бұл AI-ға келесі күйді болжауға мүмкіндік беретін күйдің салыстырмалы ықтималдығын көрсетудің қарапайым тәсілі. Алда бірнеше қадамды болжай аласыз.

Ойыншы жасыл бөлмеде болса, келесі жолы байқалған кезде оның сол жерде қалу мүмкіндігі 50%. Бірақ оның одан кейін де сонда қалу мүмкіндігі қандай? Ойыншының екі бақылаудан кейін жасыл бөлмеде қалу мүмкіндігі ғана емес, оның кетіп, қайта оралу мүмкіндігі де бар. Міне, жаңа деректерді ескере отырып, жаңа кесте:

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық

Ол екі бақылаудан кейін ойыншыны жасыл бөлмеде көру мүмкіндігінің 51% - 21% қызыл бөлмеден болатынын, олардың 5% ойыншы олардың арасындағы көк бөлмеде болатынын көрсетеді және 25% ойыншы жасыл бөлмеден шықпайды.

Кесте жай ғана көрнекі құрал - процедура тек әр қадамда ықтималдықтарды көбейтуді талап етеді. Бұл бір ескерту арқылы болашаққа ұзақ қарауға болатындығын білдіреді: бөлмеге кіру мүмкіндігі толығымен қазіргі бөлмеге байланысты деп есептейміз. Бұл Марковтың қасиеті деп аталады - болашақ күй тек қазіргі уақытқа байланысты. Бірақ бұл жүз пайыз дәл емес. Ойыншылар шешімдерді басқа факторларға байланысты өзгерте алады: денсаулық деңгейі немесе оқ-дәрілердің саны. Біз бұл мәндерді жазбағандықтан, болжамдарымыздың дәлдігі азырақ болады.

N-грамм

Ұрыс ойынының мысалы және ойыншының комбо қимылдарын болжау туралы не деуге болады? Бірдей! Бірақ бір күйдің немесе оқиғаның орнына біз аралас соққыны құрайтын барлық тізбектерді қарастырамыз.

Мұны істеудің бір жолы - әрбір кірісті (мысалы, Kick, Punch немесе Block) буферде сақтау және бүкіл буферді оқиға ретінде жазу. Осылайша, ойыншы SuperDeathFist шабуылын пайдалану үшін Kick, Kick, Punch түймелерін қайта-қайта басады, AI жүйесі барлық кірістерді буферде сақтайды және әр қадамда пайдаланылған соңғы үшеуін есте сақтайды.

Ойын АИ қалай жасауға болады: жаңадан бастаушыларға арналған нұсқаулық
(Қою жолдар ойыншы SuperDeathFist шабуылын бастаған кезде көрсетіледі.)

Ойыншы соққыны, одан кейін басқа соққыны таңдағанда, AI барлық опцияларды көреді, содан кейін келесі енгізу әрқашан Punch екенін байқайды. Бұл агентке SuperDeathFist комбо қозғалысын болжауға және мүмкіндігінше оны блоктауға мүмкіндік береді.

Бұл оқиғалар тізбегі N-грамм деп аталады, мұнда N - сақталған элементтер саны. Алдыңғы мысалда бұл 3 грамм (триграмма) болды, яғни: алғашқы екі жазба үшіншіні болжау үшін пайдаланылады. Тиісінше, 5 граммда алғашқы төрт жазба бесіншіні болжайды және т.б.

Дизайнер N-грамм өлшемін мұқият таңдауы керек. Кішірек N аз жадты қажет етеді, бірақ сонымен бірге тарихты сақтайды. Мысалы, 2 грамм (биграмм) соққы, соққы немесе соққы, соққыны жазады, бірақ соққыны, соққыны, соққыны сақтай алмайды, сондықтан AI SuperDeathFist комбосына жауап бермейді.

Екінші жағынан, үлкенірек сандар көбірек жадты қажет етеді және AI үйрету қиынырақ болады, өйткені көптеген мүмкін нұсқалар болады. Егер сізде Kick, Punch немесе Block үш ықтимал кірісі болса және біз 10 граммды пайдалансақ, бұл шамамен 60 мың түрлі опциялар болар еді.

Биграмм үлгісі қарапайым Марков тізбегі болып табылады - әрбір өткен күй/ағымдық күй жұбы биграмма болып табылады және біріншіге негізделген екінші күйді болжай аласыз. 3 грамм және одан үлкен N-граммдарды Марков тізбегі ретінде де қарастыруға болады, мұнда барлық элементтер (N-грамдағы соңғысынан басқа) бірге бірінші күйді, ал соңғы элемент екінші күйді құрайды. Ұрыс ойынының мысалы соққы және соққы күйінен соққы және соққы күйіне өту мүмкіндігін көрсетеді. Бірнеше енгізу журналының жазбаларын бір бірлік ретінде қарастыра отырып, біз негізінен енгізу ретін бүкіл күйдің бөлігіне түрлендіреміз. Бұл бізге Марков қасиетін береді, ол келесі енгізуді болжау үшін Марков тізбегін пайдалануға және келесі аралас қозғалысты болжауға мүмкіндік береді.

қорытынды

Біз жасанды интеллектті дамытудағы ең көп таралған құралдар мен тәсілдер туралы айттық. Біз сондай-ақ оларды қандай жағдайларда қолдану керектігін және әсіресе пайдалы болатын жағдайларды қарастырдық.

Бұл AI ойынының негіздерін түсіну үшін жеткілікті болуы керек. Бірақ, әрине, бұл барлық әдістер емес. Азырақ танымал, бірақ тиімділігі кем емес:

  • оңтайландыру алгоритмдері, соның ішінде төбеге шығу, градиенттен түсу және генетикалық алгоритмдер
  • қарсылас іздеу/жоспарлау алгоритмдері (минимакс және альфа-бета кесу)
  • жіктеу әдістері (перцептрондар, нейрондық желілер және тірек векторлық машиналар)
  • агенттердің қабылдауы мен жадысын өңдеуге арналған жүйелер
  • AI-ға архитектуралық тәсілдер (гибридті жүйелер, ішкі архитектуралар және AI жүйелерін қабаттасудың басқа тәсілдері)
  • анимация құралдары (жоспарлау және қозғалысты үйлестіру)
  • өнімділік факторлары (деталь деңгейі, кез келген уақытта және уақытты бөлу алгоритмдері)

Тақырып бойынша онлайн ресурстар:

1. GameDev.net бар AI бойынша мақалалар мен оқулықтар бар бөлім, және де форум.
2. AiGameDev.com ойын AI дамытуға қатысты тақырыптардың кең ауқымы бойынша көптеген презентациялар мен мақалаларды қамтиды.
3. GDC қоймасы GDC AI Summit тақырыптарын қамтиды, олардың көпшілігі тегін.
4. Пайдалы материалдарды сайттан да табуға болады AI Game Programmers Guild.
5. Томми Томпсон, AI зерттеушісі және ойын әзірлеушісі, YouTube сайтында бейнелер жасайды AI және ойындар коммерциялық ойындарда AI-ны түсіндіру және зерттеу.

Тақырып бойынша кітаптар:

1. Game AI Pro кітаптар сериясы - бұл нақты мүмкіндіктерді қалай енгізу керектігін немесе нақты мәселелерді шешу жолын түсіндіретін қысқа мақалалар жинағы.

Game AI Pro: Ойын AI кәсіпқойларының жинаған даналығы
Ойын AI Pro 2: Ойын AI кәсіпқойларының жинаған даналығы
Ойын AI Pro 3: Ойын AI кәсіпқойларының жинаған даналығы

2. AI Game Programming Wisdom сериясы Game AI Pro сериясының ізашары болып табылады. Ол ескі әдістерді қамтиды, бірақ барлығы дерлік бүгінгі күні де өзекті.

AI ойынын бағдарламалау даналығы 1
AI ойынын бағдарламалау даналығы 2
AI ойынын бағдарламалау даналығы 3
AI ойынын бағдарламалау даналығы 4

3. Жасанды интеллект: заманауи көзқарас жасанды интеллекттің жалпы саласын түсінгісі келетіндердің барлығына арналған негізгі мәтіндердің бірі болып табылады. Бұл ойынды дамыту туралы кітап емес - ол AI негіздерін үйретеді.

Ақпарат көзі: www.habr.com

пікір қалдыру