Kuidas luua mÀngu AI: algajate juhend

Kuidas luua mÀngu AI: algajate juhend

Sattusin huvitavale materjalile kunstlikust intelligentsist mĂ€ngudes. Seal on selgitatud pĂ”hiasju AI-st lihtsate nĂ€idete abil, samuti on sees palju kasulikke tööriistu ja meetodeid selle mugavaks arendamiseks ja projekteerimiseks. Kuidas, kus ja millal neid kasutada — ka see on olemas.

Enamik nĂ€iteid on kirjutatud pseudokoodis, seega ei ole sĂŒgavad programmeerimisoskused vajalikud. Allpool on 35 lehekĂŒlge teksti koos piltide ja GIF-idega, nii et olge valmis.

UPD. Vabandan, kuid oma tĂ”lget sellest artiklist olen juba teinud Habras. PatientZero. Tema variandi lugemine on vĂ”imalik. siin, kuid mingi pĂ”hjusel jĂ€i artikkel minust mööda (kasutasin otsingut, kuid midagi lĂ€ks valesti). Kuna kirjutan mĂ€nguarendusele pĂŒhendatud blogisse, otsustasin jagada oma tĂ”lkevarianti jĂ€lgijatele (mĂ”ned kohad on mul vormistatud teisiti, mĂ”ned — tahtlikult vahele jĂ€etud arendajate soovitusel).

Mis on AI?

MĂ€ngu AI keskendub sellele, milliseid toiminguid objekt peaks tegema, tuginedes olukorrale, milles see viibib. Seda nimetatakse sageli «intelligentsete agentide» juhtimiseks, kus agent on mĂ€ngu isik, transport, bot vĂ”i mĂ”nikord midagi veel abstraktsemat: terve rĂŒhm olendeid vĂ”i isegi tsivilisatsioon. Igal juhul on see asi, mis peab nĂ€gema oma keskkonda, vĂ”tma selle pĂ”hjal vastu otsuseid ja tegutsema vastavalt sellele. Seda nimetatakse Sense/Think/Act (Tunne/MĂ”tle/Toimi) tsĂŒkliks:

  • Tunne: agent leiab vĂ”i saab teavet keskkonna asjade kohta, mis vĂ”ivad mĂ”jutada tema kĂ€itumist (lĂ€heduses olevad ohud, kogutavad esemed, huvitavad kohad uurimiseks).
  • MĂ”tle: agent otsustab, kuidas reageerida (kaalub, kas on piisavalt ohutu esemeid koguda vĂ”i peaks ta enne vĂ”itlema/peituma).
  • Toimi: agent tĂ€idab eelneva otsuse teostamiseks tegevusi (alustab liikumist vaenlase vĂ”i eseme suunas).
  • 
nĂŒĂŒd on olukord muutunud tegelaste tegevuste tĂ”ttu, seega kordub tsĂŒkkel uute andmete alusel.

Tehisintellekt keskendub enamasti Sense-etapile. NĂ€iteks isesĂ”itvad autod teevad teest pilte, ĂŒhendavad need radaritelt ja lidaritelt saadud andmetega ning tĂ”lgendavad neid. Selle tavaliselt teeb masin Ă”pe, mis töötleb sisendandmeid ja annab neile tĂ€henduse, tuues vĂ€lja semantilist teavet, nagu nĂ€iteks "teie ees on veel ĂŒks auto 20 jala kaugusel". Need on nii nimetatud klassifitseerimise probleemid.

MĂ€ngud ei vaja keerulist sĂŒsteemi teabe vĂ€ljavĂ”tmiseks, kuna enamik andmeid on juba nende lahutamatu osa. Pole vajadust kĂ€ivitada pildituvastusalgoritme, et tuvastada, kas vaenlane on ette tulles — mĂ€ng teab seda juba ja edastab teavet otsuste tegemise protsessis. SeetĂ”ttu on Sense-etapi osa sageli palju lihtsam kui Think ja Act.

MĂ€ngu AI piirangud

Tehisintellektil on mÔned piirangud, mida tuleb jÀrgida:

  • Tehisintellekti ei pea eelnevalt treenima nagu masinĂ”ppe algoritmi. Pole mĂ”tet kirjutada nĂ€rvivĂ”rgustikku arendamise ajal, et jĂ€lgida kĂŒmneid tuhandeid mĂ€ngijaid ja Ă”ppida parimat viisi nende vastu mĂ€ngimiseks. Miks? Sest mĂ€ng ei ole veel vĂ€lja antud ja mĂ€ngijaid pole.
  • MĂ€ng peab olema lĂ”bus ja vĂ€ljakutseid pakkuv, seega ei tohiks agentide leida parimat lĂ€henemist inimeste vastu.
  • Agendid peavad vĂ€lja nĂ€gema realistlikud, et mĂ€ngijad tunneksid, nagu mĂ€ngiks nad tĂ”eliste inimeste vastu. Programm AlphaGo ĂŒletas inimese, kuid valitud sammud olid kaugel traditsioonilisest mĂ€ngu mĂ”istmisest. Kui mĂ€ng kopeerib inimvastast, ei tohi seda tunnet olla. Algoritmi tuleb muuta, et see teeks usutavaid otsuseid, mitte ideaalseid.
  • Tehisintellekt peab töötama reaalajas. See tĂ€hendab, et algoritm ei saa pikka aega monopoliseerida protsessorit otsuste tegemiseks. Isegi 10 millisekundit selleks on liiga kaua, sest enamikule mĂ€ngudest piisab, et tĂ€ita kogu töötlemine ja minna jĂ€rgmisele graafikakaadrile ajavahemikus 16 kuni 33 millisekundit.
  • Ideaalne oleks, kui vĂ€hemalt osa sĂŒsteemist juhitaks andmete abil, et "mitte-kodeerijad" saaksid muudatusi teha ja et parandused toimuksid kiiremini.

KĂ€ime lĂ€bi AI lĂ€henemised, mis katavad kogu Sense/Think/Act tsĂŒklit.

Aluste otsuste tegemine

Alustame kĂ”ige lihtsamast mĂ€ngust — Pong. EesmĂ€rk: liikuda platvormiga (paddle) nii, et pall pĂ”rkuks sellelt tagasi, mitte ei lendaks mööda. See on nagu tennis, kus kaotate, kui ei suuda palli tagasi lĂŒĂŒa. Siin on AI-l suhteliselt kerge ĂŒlesanne — otsustada, millises suunas platvormi liikuda.

Kuidas luua mÀngu AI: algajate juhend

Tingimuslikud operaatorid

AI jaoks Pongis on kĂ”ige ilmsem lahendus — pĂŒĂŒda alati platvormi palli alla paigutada.

Lihtne algoritm selle jaoks, kirjutatud pseudokoodis:

iga kaader/uuendus, kui mÀng on kÀimas:
kui pall on platvormi vasakul:
liikuda platform vasakule
kui pall on platvormi paremal:
liikuda platform paremale

Kui platvorm liigub sama kiiresti kui pall, siis on see ideaalne algoritm AI jaoks Pongis. Ei ole vaja asju keerulisemaks ajada, kui andmeid ja vÔimalikke tegevusi agendi jaoks pole liig palju.

See lĂ€henemine on nii lihtne, et kogu Sense/Think/Act tsĂŒkkel on vaevu tuntav. Kuid see on olemas:

  • Sense'i osa sisaldub kahes tingimuslikus operaatoris. MĂ€ng teab, kus pall ja platvorm asuvad, seega pöördub AI selle teabe saamiseks mĂ€ngu poole.
  • Think'i osa kuulub samuti kahte tingimuslikku operaatorisse. Need sisaldavad kahte lahendust, mis antud juhul on omavahel vĂ€listavad. Tulemuseks valitakse ĂŒks kolmest tegevusest — liikuda platvormiga vasakule, liikuda paremale vĂ”i mitte midagi teha, kui see on juba Ă”igesti paigutatud.
  • Act'i osa sisaldub operaatorites Move Paddle Left ja Move Paddle Right. SĂ”ltuvalt mĂ€ngu disainist vĂ”ivad need liikuda platvormi kohe vĂ”i teatud kiirusel.

Selliseid lĂ€henemisi kutsutakse reageerivateks — olemas on lihtne reeglite kogum (antud juhul koodis olevad tingimuslikud operaatorid), mis reageerivad maailma hetkeseisule ja tegutsevad.

Otsustuspuu

NĂ€ide mĂ€ngust Pong on tegelikult vormiline AI kontseptsioon, mida nimetatakse otsustuspuuks. Algoritm lĂ€bib selle, et jĂ”uda «leht» — otsus selle kohta, milline tegevus ette vĂ”tta.

Tehkem otsustuspuu algoritmi grafika jaoks plokkskeem:

Kuidas luua mÀngu AI: algajate juhend

Iga puu osa nimetatakse node (sĂ”lm) — AI kasutab graafiteooriat selliste struktuuride kirjeldamiseks. On kaks tĂŒĂŒpi sĂ”lmi:

  • OtsustussĂ”lmed: valik kahe alternatiivi vahel, mis pĂ”hineb mingi tingimuse kontrollimisel, kus iga alternatiiv on esitatud eraldi sĂ”lmena.
  • LĂ”pp-sĂ”lmed: tegevus, mida on vaja teostada, esindades lĂ”plikku otsust.

Algoritm algab puu esimese sĂ”lmega („juurega“). Ta kas teeb otsuse, millisesse alamĂ”lgu liikuda, vĂ”i tĂ€idab sĂ”lmes sisalduva tegevuse ning lĂ”petab selle.

Mis on siis eeliseid, kui otsuste puu teeb sama tööd, mis if-lause eelnevas osas? Siin on ĂŒhine sĂŒsteem, kus igal otsusel on ĂŒksainus tingimus ja kaks vĂ”imalikku tulemust. See vĂ”imaldab arendajal luua AI andmete pĂ”hjal, mis esindavad otsuseid puus, vĂ€ltides selle kĂ”vaketastamist. Kujutame seda tabelina:

Kuidas luua mÀngu AI: algajate juhend

Koodipoolest saate sĂŒsteemi stringide lugemiseks. Looge igaĂŒhe jaoks sĂ”lm, ĂŒhendage otsustusloogika teise veeru alusel ja alamĂ”lged kolmanda ja neljanda veeru alusel. Teil on endiselt vaja programmeerida tingimused ja tegevused, kuid nĂŒĂŒd on mĂ€ngu struktuur keerukam. Siin lisate tĂ€iendavaid otsuseid ja tegevusi ning seejĂ€rel konfigureerite kogu AI, lihtsalt muutes puu mÀÀratluse tekstifaili. Edasi andsite faili mĂ€ngudisainerile, kes suudab kĂ€itumist muuta ilma mĂ€ngu uuesti kompileerimata ja koodi muutmata.

Otsuste puud on vĂ€ga kasulikud, kui need konstrueeritakse automaatselt suure nĂ€idiste kogumi pĂ”hjal (nĂ€iteks kasutades ID3 algoritmi). See teeb neist tĂ”husad ja kĂ”rge jĂ”udlusega tööriistad olukordade klassifitseerimiseks saadud andmete pĂ”hjal. Siiski ĂŒletame lihtsa sĂŒsteemi agentide tegevuste valimiseks.

Skenaariumid

Olemesime otsuste puu sĂŒsteemi, mis kasutas ettevalmistatud tingimusi ja tegevusi. Inimesel, kes disainib AI-d, on vĂ”imalik puu korraldada, nagu soovib, kuid ta peab endiselt toetuma koodijale, kes kĂ”ik selle programmeeris. Mis siis, kui me vĂ”iksime anda disainerile tööriistad oma tingimuste vĂ”i tegevuste loomiseks?

Et programmeerijal ei oleks vaja kirjutada koodi tingimuste Is Ball Left Of Paddle ja Is Ball Right Of Paddle jaoks, saab ta luua sĂŒsteemi, kus disainer kirjutab tingimused nende vÀÀrtuste kontrollimiseks. Siis nĂ€evad otsuste puu andmed vĂ€lja nii:

Kuidas luua mÀngu AI: algajate juhend

PÔhimÔtteliselt on see sama, mis esimeses tabelis, kuid lahendustes on oma kood, mis on veidi sarnane if-lause tingimuslikule osale. Koodipoolest loetaks seda teises veerus otsuste sÔlmpunktide jaoks, kuid selle asemel, et otsida konkreetset tingimust tÀitmiseks (Kas pall on paddlest vasakul), hindab see tingimuslikku avaldist ja tagastab vastavalt true vÔi false. See toimub skriptikeele Lua vÔi Angelscript abil. Nende abil saab arendaja mÀngus olevaid objekte (pall ja paddle) vÔtta ning luua muutujaid, mis on skriptis kasutatavad (ball.position). Lisaks on skriptikeel lihtsam kui C++. See ei nÔua tÀielikku kompilatsioonifaasi, seega sobib see ideaalselt mÀngu loogika kiireks kohandamiseks ja vÔimaldab "koodita" inimestel ise vajalikke funktsioone luua.

Antud nÀites kasutatakse skriptikeelt ainult tingimuslike avalduste hindamiseks, kuid seda saab kasutada ka tegevuste jaoks. NÀiteks andmed Move Paddle Right vÔivad muutuda skriptitegevuseks (ball.position.x += 10). Seega mÀÀratakse tegevus ka skripti kaudu, ilma et oleks vaja programmeerida Move Paddle Right.

VĂ”ib minna veel kaugemale ja kirjutada kogu otsustuspuu skriptikeeles. See oleks kood, mis koosneb rangelt programmeeritud (hardcoded) tingimuslikest operaatoritest, kuid nad asuvad vĂ€listes skriptifailides, mis tĂ€hendab, et neid saab muuta ilma terve programmi ĂŒmberkompileerimiseta. Sageli on vĂ”imalik skriptifaili muuta otse mĂ€ngu ajal, et kiiresti testida erinevaid tehisintellekti reaktsioone.

SĂŒndmustele reageerimine

Ülaltoodud nĂ€ited sobivad ideaalselt Pongile. Need kĂ€ivitavad pidevalt tsĂŒkli Sense/Think/Act ja tegutsevad viimase maailma oleku pĂ”hjal. Kuid keerulisemates mĂ€ngudes peab reageerima eraldi sĂŒndmustele, mitte hindama kĂ”ike korraga. Pong on sellisel juhul juba halb nĂ€ide. Valime teise.

Kujutage ette tulistamismĂ€ngu, kus vaenlased on jĂ”hkrad, kuni mĂ€rkavad mĂ€ngijat, pĂ€rast mida tegutsevad sĂ”ltuvalt oma "spetsialiseerumusest": mĂ”ned jooksevad "rĂŒndama", teised rĂŒndavad kaugelt. See on endiselt pĂ”hjalik reageerimissĂŒsteem — "kui mĂ€ngija on nĂ€htud, siis tee midagi" — kuid seda saab loogiliselt jagada sĂŒndmuseks Player Seen (mĂ€ngija nĂ€htud) ja reaktsiooniks (vali vastus ja teosta see).

See on tagasi meie Sense/Think/Act tsĂŒklisse. Me saame kodeerida Sense-osa, mis iga kaadri lĂ”ikes kontrollib, kas AI nĂ€eb mĂ€ngijat. Kui ei — siis ei juhtu midagi, aga kui nĂ€eb, siis luuakse sĂŒndmus Player Seen. Koodil on eraldi sektsioon, kus on öeldud: „kui sĂŒndmus Player Seen toimub, tee “, kus — on vastus, mis on vajalik osadele Think ja Act viitamiseks. Nii seadistate reageerimised sĂŒndmusele Player Seen: „rĂŒnnaku“ tegelase puhul — ChargeAndAttack, ja snaiperi puhul — HideAndSnipe. Need seosed saab luua andmefailis kiireks redigeerimiseks ilma vajaduseta uuesti kompileerida. Siin vĂ”ib samuti kasutada skriptikeelt.

Köitvate otsuste vastuvÔtmine

Kuigi lihtsad reaktsioonisĂŒsteemid on vĂ€ga tĂ”husad, on palju olukordi, kus neid on liiga vĂ€he. MĂ”nikord tuleb teha erinevaid otsuseid, mis pĂ”hinevad sellel, mida agent sel hetkel teeb, kuid seda esitada tingimusena on keeruline. MĂ”nikord on liiga palju tingimusi, et neid tĂ”husalt esitada otsuste puus vĂ”i skriptis. MĂ”nikord tuleb olukorra muutust eelnevalt hinnata, enne kui jĂ€rgmise sammu otsustamiseks otsus tehakse. Nende probleemide lahendamiseks on vajalikud keerukamad lĂ€henemisviisid.

LÔppfaasi masin

LĂ”ppfaasi masin ehk FSM (lĂ”plik automaat) on viis öelda, et meie agent asub praegu ĂŒhes vĂ”imalikus seisundis ning et ta saab ĂŒhest seisundist teise liikuda. Selliseid seisundeid on piiratult — seetĂ”ttu nimi. Parim nĂ€ide igapĂ€evaelust on liiklusvalgud. Erinevates kohtades on erinevad valgustusjĂ€rjekorrad, kuid pĂ”himĂ”te on sama — iga seisund esindab midagi (seisa, mine jne). Telesaam on alati vaid ĂŒhes seisundis igal hetkel ja liigub ĂŒhest teiseni lihtsate reeglite alusel.

NPC-dega mÀngudes on sarnane lugu. NÀiteks vÔtame vahti, kellel on sellised seisundid:

  • Patrullimine (Patrolling).
  • RĂŒnnak (Attacking).
  • PĂ”genemine (Fleeing).

Ja sellised tingimused, mille alusel tema seisund muutub:

  • Kui vaht nĂ€eb vaenlast, rĂŒndab ta.
  • Kui vaht rĂŒndab, aga ei nĂ€e vaenlast enam, naaseb ta patrullimisele.
  • Kui vaht rĂŒndab, aga on tĂ”siselt haavata saanud, pĂ”geneb ta.

Samuti saab kirjutada if-operatööri seisundimuutuja valvuri jaoks ja erinevaid kontrolle: kas lÀheduses on vaenlane, milline on NPC elutase jne. Lisame veel mÔned seisundid:

  • Töötus (Idling) — patrullide vahel.
  • Otsimine (Searching) — kui mĂ€rgatud vaenlane on varjunud.
  • Abi palumine (Finding Help) — kui vaenlane on mĂ€rgatud, kuid liiga tugev, et temaga ĂŒksi vĂ”idelda.

IgaĂŒhe valik on piiratud — nĂ€iteks valvur ei lĂ€he otsima varjunud vaenlast, kui tal on madal tervis.

Lõppkokkuvõttes võib tohutu "kui"-list olla liiga tülikas, seetõttu tuleks formaliseerida meetod, mis võimaldab meil meeles pidada olekuid ja üleminekuid olekute vahel. <x Đž y, ĐœĐŸ ĐœĐ” z>, siis <p>Selleks arvestame kõikide olekute ja iga oleku all loetleme kõik üleminekud teistesse olekutesse koos nende jaoks vajalike tingimustega.

Kuidas luua mÀngu AI: algajate juhend

See on olekute ĂŒleminekutabel — kompleksne viis FSM-i esitlemiseks. Joonistame diagrammi ja saame ĂŒlevaate sellest, kuidas NPC kĂ€itumine muutub.

Kuidas luua mÀngu AI: algajate juhend

Diagramm peegeldab selle agendi otsuste tegemise olemust oleva olukorra pĂ”hjal. Lisaks nĂ€itab iga nooleke ĂŒleminekut olekute vahel, kui tingimus, mille kĂ”rval see asub, on tĂ”ene.

Iga vĂ€rskenduse korral kontrollime agendi praegust olekut, vaatame ĂŒleminekutel nimekirja ja kui ĂŒlemineku tingimused on tĂ€idetud, omandab ta uue oleku. NĂ€iteks kontrollitakse iga kaadriga, kas 10-sekundiline taimer on aegunud, ja kui jah, siis liigub valvur olekust Idling olekusse Patrolling. Samamoodi kontrollib olek Attacking agendi tervist — kui see on madal, siis liigub ta olekusse Fleeing.

See on ĂŒleminekute töötlemine olekute vahel, kuid kuidas on lood kĂ€itumisega, mis on seotud konkreetsete olekute endiga? Mis puudutab kĂ€itumise tegelikku rakendamist konkreetse oleku jaoks, siis tavaliselt on olemas kaks tĂŒĂŒpi "kronk":

  • Tegevused, mida me perioodiliselt teostame praeguses olekus.
  • Tegevused, mida me teeme, kui liigume ĂŒhest olekust teise.

NĂ€ited esimese tĂŒĂŒbi jaoks. Oleku Patrolling ajal liigub agent iga kaadriga patrullimise marsruudil. Oleku Attacking ajal pĂŒĂŒab ta iga kaadriga alustada rĂŒnnakut vĂ”i minna olekusse, kui see on vĂ”imalik.

Teise tĂŒĂŒbi puhul vaatame ĂŒleminekut: "kui vaenlane on nĂ€htav ja vaenlane on liiga tugev, siis minna olekusse Finding Help. Agent peab valima, kuhu minna abi saama, ja salvestama selle teabe, et olek Findings Help teaks, kuhu pöörduda. Kui abi on leitud, naaseb agent tagasi olekusse Attacking. Selle hetkeni tahab ta teavitada liitlast ohust, mistĂ”ttu vĂ”ib tekkida tegevus NotifyFriendOfThreat.

Ja jĂ€lle saame sellele sĂŒsteemile lĂ€heneda Sensori/MĂ”tle/KĂ€itu tsĂŒkli kaudu. Sense vĂ€ljendub andmetes, mida kasutatakse ĂŒlemineku loogikas. Think - ĂŒleminekutes, mis on igas olekus saadaval. Ja Act toimub tegevustega, mis toimuvad perioodiliselt oleku sees vĂ”i ĂŒleminekute vahel.

MĂ”nikord vĂ”ib ĂŒleminekutingimuste pidev kĂŒsitlemine olla kulukas. NĂ€iteks, kui iga agent teeb igas kaadris keerulisi arvutusi, et mÀÀrata, kas nad nĂ€evad vaenlasi ja mĂ”ista, kas on vĂ”imalik liikuda olekust Patrolling olekusse Attacking — kulutab see palju protsessori aega.

Olulisi maailma olekumuutusi saab kĂ€sitleda sĂŒndmustena, mida töödeldakse nende ilmumise hetkel. Selle asemel, et FSM kontrolliks iga kaader ĂŒlemineku tingimust, "kas mu agent nĂ€eb mĂ€ngijat?", saab seadistada eraldi sĂŒsteemi, et teostada kontrolle vĂ€hem tihti (nĂ€iteks 5 korda sekundis). Tulemuseks on Player Seen, kui kontroll lĂ€heb lĂ€bi.

See edastatakse FSM-ile, mis peab nĂŒĂŒd liikuma olekusse Player Seen sĂŒndmus on saadud ja reageerima vastavalt. LĂ”plik kĂ€itumine on sama, vĂ€lja arvatud peaaegu mĂ€rkamatuna viivituse enne vastust. Kuid jĂ”udlus on paranenud, sest osa Sense'ist on eraldatud eraldi programmiosasse.

Hierarhiline lÔppolekumasin

Siiski ei ole suurte FSM-ide kĂ€sitlemine alati mugav. Kui soovime rĂŒnnaku olekut laiendada, asendades selle eraldi MeleeAttacking (lĂ€hiều) ja RangedAttacking (kaugtegevus), peame muutma ĂŒleminekud kĂ”igist teistest olukordadest, mis viivad olekusse Attacking (praegused ja tulevased).

Olete kindlasti mĂ€rganud, et meie nĂ€ites on palju dubleeritud ĂŒleminekuid. Enamik ĂŒleminekuid Idling (ootereĆŸiim) ja Patrolling (patrullimine) olekute vahel on identsed. Oleks hea mitte korduda, eriti kui lisame rohkem sarnaseid olekuid. On mĂ”istlik grupeerida Idling ja Patrolling ĂŒhise sildiga „mittesĂ”jaline”, kus on ainult ĂŒks ĂŒhine ĂŒleminekute komplekt sĂ”jaliste seisundite juurde. Kui esitame selle sildi olekuna, siis muutuvad Idling ja Patrolling alamolekuteks. NĂ€ide eraldi ĂŒleminekute tabeli kasutamisest uue mittesĂ”jalise alamoleku jaoks:

PÔhiolekud:
Kuidas luua mÀngu AI: algajate juhend

MÔlemad olekud on lahinguvÀljast vÀljas:
Kuidas luua mÀngu AI: algajate juhend

Ja diagrammi kujul:

Kuidas luua mÀngu AI: algajate juhend

See on sama sĂŒsteem, kuid uue mittesĂ”jalise olekuga, mis sisaldab Idling ja Patrolling olekuid. Iga olek, millel on alamolekudega FSM (lĂ”ppautomaat), (ja need alamolekud sisaldavad omakorda oma FSM-e — ja nii edasi, kui palju vaja), loob meile Hierarchical Finite State Machine ehk HFSM (hierarhiline lĂ”ppautomaat). MittesĂ”jalise oleku grupeerimise kaudu lĂ”ikame me vĂ€lja hulga ĂŒleliigseid ĂŒleminekuid. Sama saame teha mistahes uute olekute puhul, millel on ĂŒhised ĂŒleminekud. NĂ€iteks, kui tulevikus laiendame rĂŒndamise olekut MeleeAttacking (lĂ€hedalt rĂŒndamine) ja MissileAttacking (projektilli rĂŒndamine) olekute juurde, siis need muutuvad alamolekuteks, mis ĂŒksteise vahel ĂŒleminevad sĂ”ltuvalt vahemaa kaugusest vaenlase juurde ja laskemoona olemasolust. LĂ”ppkokkuvĂ”ttes saab keerulisi kĂ€itumismudeleid ja allmudeleid esitada minimaalse dubleerimisega.

KĂ€itumiste puu

HFSM-i kaudu luuakse keerulisi kĂ€itumiste kombinatsioone lihtsalt. Siiski on ĂŒks vĂ€ike raskus, et ĂŒlemisreeglite nĂ€ol on otsuste tegemine tihedalt seotud praeguse olekuga. Paljudes mĂ€ngudes on see just see, mida vajate. Ja olekute hierarhia hoolikas kasutamine vĂ”ib vĂ€hendada ĂŒleminekute kordusi. Kuid mĂ”nikord on vaja reegleid, mis töötavad sĂ”ltumatult olekust, milles te olete, vĂ”i mis kehtivad peaaegu igas olekus. NĂ€iteks, kui agendi tervis langeb 25%-ni, tahate, et ta jooksuks, olenemata sellest, kas ta on lahingus, tegutseb vĂ”i vestleb — peate seda tingimust lisama igasse olekusse. Kui teie disainer hiljem soovib madala tervise piiri muuta 25%-lt 10%-le, tuleb sellega taas tegeleda.

Ideaalis on vajalik sĂŒsteem, kus otsuseid "millises olekus olla" tehakse vĂ€ljaspool neid olekuid, et muuta vaid ĂŒhes kohas ja mitte puutuda ĂŒleminekutingimusi. Siin tulevad mĂ€ngu kĂ€itumispuud.

On mitu vÔimalust nende rakendamiseks, kuid nende pÔhiolemus on umbes sama ja sarnaneb otsuste puudega: algoritm algab "juure" sÔlmest, kus puud on sÔlmed, mis esindavad kas otsuseid vÔi tegevusi. TÔsi, siin on mÔned peamised erinevused:

  • NĂŒĂŒd sĂ”lmed tagastavad ĂŒhe kolmest vÀÀrtusest: Succeeded (kui töö on lĂ”petatud), Failed (kui seda ei saa kĂ€ivitada) vĂ”i Running (kui see on endiselt kĂ€imas ja lĂ”plikku tulemust pole).
  • Otsuse sĂ”lmi pole enam kahe alternatiivi vahel valimiseks. Nende asemel on Decorator sĂ”lmed, millel on ĂŒks tĂŒtarsĂ”lm. Kui nad Succeed, siis teevad nad oma ainukese tĂŒtarsĂ”lme.
  • Tegevusi tĂ€itvad sĂ”lmed tagastavad vÀÀrtuse Running, et esindada kĂ€imasolevaid tegevusi.

Seda vÀikest sÔlmede kogumit saab kombineerida, et luua palju keerukaid kÀitumismudeleid. Kujutame ette HFSM valvurit eelnevas nÀites kÀitumispuu kujul:

Kuidas luua mÀngu AI: algajate juhend

Selle struktuuriga ei tohiks olla selget ĂŒleminekut Idling/Patrolling olekust rĂŒndamise vĂ”i mĂ”ne muu oleku juurde. Kui vaenlane on nĂ€htav ja tegelase elu on madal, peatub tĂ€itmine Fleeing sĂ”lmel, sĂ”ltumata sellest, millisest sĂ”lmest ta varem tĂ€itis — Patrolling, Idling, Attacking vĂ”i mĂ”ni muu.

Kuidas luua mÀngu AI: algajate juhend

KĂ€itumispuud on keerulised — on palju viise nende koostamiseks, ja Ă”ige kombinatsiooni leidmine dekoratoritest ja komposiit-sĂ”lmest vĂ”ib olla keeruline. Samuti on kĂŒsimusi, kui tihti puud kontrollida — kas tahame lĂ€bida seda iga osa vĂ”i ainult siis, kui mĂ”ni tingimus on muutunud? Kuidas hoida sĂ”lmedega seotud olekut — kuidas teada, kas oleme olnud Idling olekus 10 sekundit vĂ”i kuidas teada, millised sĂ”lmed viimasel korral tĂ€ideti, et Ă”iget jĂ€rjestust Ă”igesti töödelda?

Sel pĂ”hjusel on olemas palju rakendusi. NĂ€iteks mĂ”nes sĂŒsteemis asendavad dekoratori sĂ”lmed sisseehitatud dekoratoreid. Need hindavad puud uuesti dekoratori tingimuste muutumisel, aitavad liituda sĂ”lmedega ja tagavad perioodilised vĂ€rskendused.

KasumipĂ”hine sĂŒsteem

MĂ”nedel mĂ€ngudel on palju erinevaid mehhanisme. Soovitav on, et need saaksid kĂ”ik kasu lihtsatest ja ĂŒldistest ĂŒleminekureeglitest, kuid mitte tingimata tĂ€ieliku kĂ€itumispuu kujul. Selle asemel, et omada selget valikute kogumit vĂ”i vĂ”imalike tegevuste puu, on lihtsam Ă”ppida kĂ”ik tegevused ja valida hetkel sobivaim.

Kasulikku pĂ”hine sĂŒsteem aitab siin. See on sĂŒsteem, kus agendil on palju tegevusi ja ta valib ise, milline neist teostada, tuginedes igaĂŒhe suhtelisele kasulikkusele. Kus kasulikkus on meelevaldne mÔÔt, kui oluline vĂ”i soovitav on selle tegevuse teostamine agendi jaoks.

KĂ€itumise kasulikkust, mis pĂ”hineb hetke olekul ja keskkonnal, saab agent igal ajal kontrollida ja valida sobivama teise oleku. See sarnaneb FSM-iga, vĂ€lja arvatud sellega, et ĂŒleminekud mÀÀratakse iga potentsiaalse oleku hindamise kaudu, sealhulgas praeguse. Pange tĂ€hele, et valime ĂŒlemineku jaoks kĂ”ige kasulikuma tegevuse (vĂ”i jÀÀme paigale, kui oleme selle juba teinud). Suurema mitmekesisuse nimel vĂ”ib see olla kaalutud, kuid juhuslik valik vĂ€ikese nimekirja hulgast.

SĂŒsteem mÀÀrab juhuslikud kasulikkuse vÀÀrtuste vahemikud - nĂ€iteks, alates 0 (tĂ€iesti soovimatu) kuni 100 (tĂ€ielikult soovitav). Igal tegevusel on mitmed parameetrid, mis mĂ”jutavad selle vÀÀrtuse arvutamist. Tagasi tulles meie nĂ€ite juurde valvekoerast:

Kuidas luua mÀngu AI: algajate juhend

Üleminekud tegevuste vahel on ebamugavad - iga olek vĂ”ib jĂ€rgida mis tahes muud. Tegevuste prioriteedid on tagastatud kasulikkuse vÀÀrtustes. Kui vaenlane on nĂ€htav ja see vaenlane on tugev, samas kui tegelase elu on madal, siis nii PĂ”genemine kui ka Abiotsimine tagastavad kĂ”rged mitte-null vÀÀrtused. Sellega arvestades on Abiotsimine alati kĂ”rgem. Samuti ei tagasta mitte-sĂ”jalised tegevused kunagi rohkem kui 50, seega on nad alati madalamad kui sĂ”jalised. Seda tuleb arvestada tegevuste loomisel ja nende kasulikkuse arvutamisel.

Meie nĂ€ites tagastavad toimingud kas fikseeritud konstantsed vÀÀrtused vĂ”i ĂŒhe kahest fikseeritud vÀÀrtusest. Realistlikum sĂŒsteem eeldab, et tagastatakse hinnang pidevast vÀÀrtuste vahemikust. NĂ€iteks toiming Fleeing tagastab kĂ”rgemaid utiliteedi vÀÀrtusi, kui agendi tervis on madal, samas kui toiming Attacking tagastab madalamaid vÀÀrtusi, kui vaenlane on liiga tugev. SeetĂ”ttu on toimingul Fleeing alati prioriteet toimingu Attacking ees olukordades, kus agent tunneb, et tal ei ole piisavalt tervist, et vastasega vĂ”idelda. See vĂ”imaldab muuta tegevuste prioriteete, tuginedes mis tahes hulgale kriteeriumidele, muutes sellise lĂ€henemise paindlikumaks ja varieeruvamaks kui tegevuste puu vĂ”i FSM.

Igal toimingul on palju tingimusi programmi arvutamiseks. Need vĂ”ib kirjutada skriptikeeles vĂ”i seeria matemaatilisi valemeid. The Sims'is, mis modelleerib karakteri igapĂ€evast rutiini, lisatakse tĂ€iendav arvutustasand — agent saab rea 'motivatsioone', mis mĂ”jutavad utiliteedi hindamisi. Kui karakter on nĂ€ljane, siis aja jooksul muutub ta veelgi nĂ€ljasemaks ja toime EatFood utiliteedi tulemus kasvab, kuni karakter tĂ€idab selle, vĂ€hendades oma nĂ€lga ja tuues EatFood vÀÀrtuse tagasi nulli.

Tegevuste valimise idee hindamissĂŒsteemi pĂ”hjal on ĂŒsna lihtne, seetĂ”ttu saab Utility-based sĂŒsteemi kasutada osana AI otsustusprotsessidest, mitte nende tĂ€ielikuks asendamiseks. Otsustuspuu vĂ”ib kĂŒsida kahe tĂŒtarnĂ”lva utiliteedi hindamist ja valida kĂ”rgema. Samamoodi vĂ”ib kĂ€itumispuul olla koostisosa sĂ”lm Utility, et hinnata tegevuste utiliteeti, et otsustada, millist tĂŒtarĂŒksust tĂ€ita.

Liikumine ja navigeerimine

Eelnevates nĂ€idetes oli meil platvorm, mida liikusime vasakule vĂ”i paremale, ja valve, kes patrullis vĂ”i rĂŒndas. Kuid kuidas me tĂ€pselt töötame agendi liikumise ĂŒle teatud aja jooksul? Kuidas me mÀÀrame kiirus, kuidas me vĂ€ldime takistusi, ja kuidas me plaanime marsruuti, kui sihtkohta jĂ”udmine on keerulisem kui lihtsalt sirgjoonelise liikumisega? Vaatame seda lĂ€hemalt.

Haldamine

Alguses oletame, et igal agendil on kiirus, mis sisaldab tema liikumise kiirus ja suund. Seda saab mÔÔta meetrites sekundis, kilomeetrites tunnis, pikslites sekundis jne. Tuletades meelde sensoorsete/mĂ”tlemise/tegevuse tsĂŒklit, vĂ”ime ette kujutada, et osa mĂ”ttetegevusest valib kiirus ja osa tegevusest rakendab seda kiirus agenti. TĂŒĂŒpiliselt mĂ€ngudes on fĂŒĂŒsikasĂŒsteem, mis teeb selle töö teie eest, uurides iga objekti kiirus ja reguleerides seda. SeetĂ”ttu vĂ”ib tehisintellekti jĂ€tta ĂŒhe ĂŒlesande — otsustada, kui kiiresti agent peaks liikuma. Kui on teada, kuhu agent peab jĂ”udma, tuleb ta liikuda Ă”iges suunas seatud kiirusel. VĂ€ga lihtne vĂ”rrand:

desired_travel = sihtkoha_asukoht – agendi_asukoht

Kujutage ette 2D maailma. Agent asub punktis (-2,-2), sihtkoht kusagil kirdes punktis (30, 20), ja vajalik tee, et agent sinna jĂ”uaks, on (32, 22). Oletame, et need positsioonid on mÔÔdetud meetrites — kui vĂ”tame agendi kiirusena 5 meetrit sekundis, siis me skaleerime oma liikumisvektori ja saame kiirusena umbes (4.12, 2.83). Nende parameetritega jĂ”uaks agent sihtpunkti peaaegu 8 sekundiga.

VÀÀrtusi saab igal ajal ĂŒmber arvutada. Kui agent oli poolel teel sihtkohta, oleks liikumine olnud poole pikkusest, kuid kuna agendi maksimaalne kiirus on 5 m/s (nagu me eespool otsustasime), jÀÀb kiirus samaks. See töötab ka liikuvate sihtmĂ€rkide puhul, vĂ”imaldades agentidel teha vĂ€ikeseid kohandusi nende liikudes.

Aga me tahame rohkem variatiivsust — nĂ€iteks aeglaselt suurendada kiirus, et simuleerida tegelast, kes liigub seismisest jooksmiseks. Sama saab teha ka enne peatamist. Need funktsioonid on tuntud kui steering behaviours, igaĂŒhel neist on spetsiifilised nimed: Seek (otsimine), Flee (pĂ”genemine), Arrival (saabumine) jne. Idee on selline, et kiirusese kiirusel saab rakendada kiirusjĂ”ude, tuginedes agendi asukoha ja hetke kiiruse ning sihtkoha vĂ”rdlemisele, et kasutada erinevaid liikumismeetodeid sihtkohta jĂ”udmiseks.

Iga kĂ€itumine on veidi erineva eesmĂ€rgiga. Seek ja Arrival on viisid, kuidas suunata agent sihtkohta. Obstacle Avoidance (takistuste vĂ€ltimine) ja Separation (eraldi hoidmine) kohandavad agendi liikumist, et mööda minna takistustest sihtkoha poole. Alignment (kooskĂ”lastamine) ja Cohesion (sidusus) hoiavad agendid liikumas koos. Erinevaid steering behaviors (suunamisvĂ”tteid) saab summida ĂŒheks teepunktiks, arvesse vĂ”ttes kĂ”iki tegureid. Agent kasutab Arrival, Separation ja Obstacle Avoidance kĂ€itumisi, et hoida eemale seintest ja teistest agentidest. See lĂ€henemine töötab hĂ€sti avatud linnades, kus pole liigseid detaile.

Raskemates tingimustes töötab erinevate kĂ€itumiste kokku liitmine kehvemini — nĂ€iteks vĂ”ib agent jÀÀda seina kinni Arrival ja Obstacle Avoidance konfliktide tĂ”ttu. SeetĂ”ttu tuleb kaaluda keerulisemaid variante kui lihtsalt kĂ”igi vÀÀrtuste kokku liitmine. Üks viis on: mitte liita iga kĂ€itumise tulemusi, vaid uurida liikuvusi erinevates suundades ja valida parim variant.

Kuid keerulises keskkonnas, kus on ummikud ja suunad valida, vajame midagi veelgi arenenumat.

Teepunktide leidmine

Steering behaviours sobivad suurepÀraselt lihtsaks liikumiseks avatud aladel (jalgpallivÀljak vÔi areen), kus sihtpunkti A kuni B jÔudmine on sirge tee vÀheste kÔrvalekaldumisega takistustest mööda. Keerukamate marsruutide jaoks vajame pathfinding'ut (teepunktide leidmine), mis on viis maailma uurimiseks ja selle kaudu marsruudi valimiseks.

Lihtsaim viis on panna igasse ruutu, mis asub agendi kĂ”rval, vĂ”rk ja hinnata, millistes neist on lubatud liikuda. Kui mĂ”ni neist on sihtkoht, jĂ€rgige sealt teed, liikudes igast ruudust tagasi eelmisse, kuni jĂ”uate alguspunkti. Just see on marsruut. Vastasel juhul korrake protsessi lĂ€himates teiste ruutide puhul, kuni leiate sihtkoha vĂ”i ruudud saavad otsa (see tĂ€hendab, et pole vĂ”imalikku teed). Seda tuntakse ametlikult kui laieesmĂ€rgi otsingu (Breadth-First Search ehk BFS) algoritmina. Igal sammul vaatab see igas suunas (seetĂ”ttu „laius”). Otsinguruum sarnaneb lainefrontiga, mis liigub kuni jĂ”uab soovitud kohta — otsingu valdkond laieneb igal sammul, kuni see hĂ”lmab lĂ”pp-punkti, pĂ€rast mida saab jĂ€lgida teed algusesse.

Kuidas luua mÀngu AI: algajate juhend

Tulemuseks on ruutide loetelu, mille kaudu formaalitakse vajalik marsruut. See on tee (siit tuleb ka termin pathfinding) — loetelu kohtadest, mida agent kĂŒlastab, liikudes sihtpunkti suunas.

Arvestades, et me teame iga ruudu asukohta maailmas, saame kasutada juhtimisprotseduure (steering behaviours), et liikuda mööda teed — sĂ”lmedelt 1 sĂ”lmesse 2, seejĂ€rel sĂ”lmedelt 2 sĂ”lmesse 3 ja nii edasi. Lihtsaim variant on suunduda jĂ€rgmise ruudu keskpunkti, kuid veel parem on peatuda praeguse ruudu ja jĂ€rgmise vahepeal. Nii saab agent teravaid pöördeid sujuvamalt lĂ€bida.

BFS-algoritmil on ka puudused — see uurib sama palju ruute „vale” suunas kui „Ôige” suunas. Siin tuleb mĂ€ngu keerulisem algoritm nimega A* (A star). See töötab sarnaselt, kuid selle asemel, et pimesi uurida naaberruute (jĂ€relnaabrite, seejĂ€rel naabrite naabrite jne), kogub see sĂ”lmed loendisse ja sorteerib need nii, et jĂ€rgmine uuritav sĂ”lm on alati see, mis viib lĂŒhima marsruudini. SĂ”lmed sorteeritakse hĂŒpoteetilise marsruudi „kulude” pĂ”hjal, et jĂ”uda soovitud ruutu (kaasa arvatud kĂ”ik liikumise kulud) ja hinnstatusse, kui kaugel see ruut on sihtkohast (suunates otsingu Ă”iges suunas).

Kuidas luua mÀngu AI: algajate juhend

Selles nĂ€ites uurib agent ĂŒhte ruutu korraga, valides iga kord naabruse, mis tundub kĂ”ige rohkem lootustandev. Saadud tee on sama, mis BFS-il, kuid protsessi kĂ€igus on arvestatud vĂ€hemate ruutudega — see on mĂ€ngu jĂ”udluse jaoks mĂ€rkimisvÀÀrne.

Liikumine ilma ruudustikuta

Kuid enamik mĂ€nge ei ole ruudustikus, ja sageli ei saa seda realistlikkuse kahjustamata luua. Kompromisse on vajalikud. Kui suured peaksid ruudud olema? Liialt suured — ja nad ei suuda korralikult kujutada vĂ€ikseid koridore vĂ”i pöördeid, liiga vĂ€ikesed — ruute on otsimiseks liiga palju, mis lĂ”puks vĂ”tab palju aega.

Esimene asi, mida mĂ”ista — ruudustik annab meile seotud sĂ”lmede graafiku. A* ja BFS algoritmid töötavad tegelikult graafikutel ja ei hooli meie ruudustikust. Me vĂ”iksime paigutada sĂ”lmed igal pool mĂ€ngumaailmas: kui kahe ĂŒhendatud sĂ”lme vahel on side, samuti algus- ja lĂ”pupunkti vahel ning vĂ€hemalt ĂŒhe sĂ”lmega — töötab algoritm endiselt sama hĂ€sti kui varem. Seda nimetatakse sageli teepunktide sĂŒsteemiks, kuna iga sĂ”lm esindab tĂ€henduslikku positsiooni maailmas, mis vĂ”ib olla osa paljusid hĂŒpoteetilisi teevariatsioone.

Kuidas luua mÀngu AI: algajate juhend
NÀide 1: sÔlm igas ruudis. Otsing algab sÔlmest, kus agent asub, ja lÔppeb vajaliku ruudu sÔlmes.

Kuidas luua mÀngu AI: algajate juhend
NÀide 2: vÀiksem sÔlmede komplekt (teepunktid). Otsing algab ruudust, kus agent asub, liigub lÀbi vajalike sÔlmede ja jÀtkub siis sihtkohta.

See on ĂŒsna paindlik ja vĂ”imas sĂŒsteem. Kuid teepunktide asukohtade otsimisel on ettevaatlikkust, muidu ei pruugi agenid lihtsalt lĂ€hima punkti nĂ€ha ja ei saa oma teed alustada. Oleks lihtsam, kui saaksime automaatselt teepunkte paigutada maailmaga seotud geomeetria pĂ”hjal.

Siia tuleb navigeerimisvĂ”rk vĂ”i navmesh (navigeerimissegu). See on tavaliselt 2D- vĂ”rk kolmnurgadest, mis asetatakse maailma geomeetriale — igal pool, kus agent vĂ”ib liikuda. Iga kolmnurk vĂ”rgus muutub graafikus sĂ”lmeks ja tal on kuni kolm kĂŒlgnevat kolmnurka, mis muutuvad graafikus naabrussĂ”lmedeks.

See pilt on nĂ€ide Unity mootorist — see analĂŒĂŒsis maailma geomeetriat ja lĂ”i navmesh'i (ekraanipildil helesinise vĂ€rviga). Iga polĂŒgoon navmesh'is on ala, millel agent vĂ”ib seista vĂ”i liikuda ĂŒhest polĂŒgoonist teise. Antud nĂ€ites on polĂŒgoonid vĂ€iksemad kui korrused, mille peal nad asuvad — see on tehtud agendi suuruste arvestamiseks, mis ulatuvad tema nominaalsest asukohast vĂ€lja.

Kuidas luua mÀngu AI: algajate juhend

Saame otsida marsruuti lÀbi selle vÔrgu, kasutades jÀlle A* algoritmi. See annab meile praktiliselt ideaalse marsruudi maailmas, mis arvestab kogu geomeetriat ning ei vaja liigseid sÔlmi ja teetÀppetÀhti.

Pathfinding on liiga ulatuslik teema, millest ei piisa ĂŒhest artikli jaost. Kui soovite seda pĂ”hjalikumalt uurida, aitab see Amit Patel'i veebisait.

Planeerimine

Oleme pathfinding'uga veendunud, et mĂ”nikord ei piisa lihtsalt suuna valimisest ja liikumisest — me peame valima marsruudi ja tegema mitu pöördet, et jĂ”uda sihtkohta. Saame selle idee kokku vĂ”tta: eesmĂ€rgi saavutamine ei ole lihtsalt jĂ€rgmine samm, vaid pigem tervikjĂ€rjekord, kus mĂ”nikord peame ette vaatama paar sammu, et teada, kuidas esimene samm peaks olema. Seda nimetatakse planeerimiseks. Pathfinding'ut vĂ”ib pidada ĂŒheks mitmest planeerimise tĂ€ienduseks. Meie Sense/Think/Act tsĂŒkli vaatenurgast on see koht, kus osa Think planeerib tulevikus mitmeid osi Act.

Vaatame nÀidet kaardimÀngust Magic: The Gathering. Me liigume esimesena selliste kaartidega kÀes:

  • Swamp — annab 1 musta mannat (maa kaart).
  • Forest — annab 1 roheline mannat (maa kaart).
  • Fugitive Wizard — nĂ”uab 1 sinist mannat, et seda vĂ”tta.
  • Elvish Mystic — nĂ”uab 1 roheline mannat, et seda vĂ”tta.

JĂ€tame ĂŒlejÀÀnud kolm kaarti kĂ”rvale, et oleks lihtsam. Reeglite kohaselt on mĂ€ngijal lubatud mĂ€ngida 1 maa kaart iga kĂ€igu ajal, ta vĂ”ib selle kaardi "tapada", et saada mannat ning seejĂ€rel kasutada loitsu (sealhulgas olendi toomist) saadud mana koguse alusel. Antud olukorras teab inim mĂ€ngija, et peab mĂ€ngima Forest'i, "tapama" 1 roheline mannat ja seejĂ€rel kutsuma Elvish Mystic'i. Kuid kuidas sellest teada saada mĂ€ngu AI-le?

Lihtne planeerimine

Triviaalne lÀhenemine on proovida iga tegevust jÀrjest, kuni enam sobivaid ei jÀÀ. Kaardile vaadates nÀeb tehisintellekt, et ta saab mÀngida Swampi. Ja ta mÀngib selle. Kas selle kÀigu jooksul on teisi tegevusi? Ta ei saa kutsuda ei Elvish Mysticit ega Fugitive Wizardit, kuna nende mÀngimiseks on vajalik vastavalt roheline ja sinine mana, aga Swamp toob ainult musta mana. Ja ta ei saa juba mÀngida Forestit, kuna on juba mÀnginud Swampi. Seega mÀngib mÀngu tehisintellekt reeglite jÀrgi, kuid teeb seda halvasti. Seda oleks vÔimalik parandada.

Planeerimine vÔib leida tegevuste loendi, mis viivad mÀngu soovitud olekusse. Nii nagu iga ruut teel omas naabreid (pathfinding'e puhul), on igal plaanis tegevusel samuti naabrid vÔi jÀrglased. Saame otsida neid tegevusi ja edasisi tegevusi, kuni saavutame soovitud oleku.

Meie nĂ€ites on soovitud tulemus „kutset teha, kui see on vĂ”imalik“. KĂ€igu alguses nĂ€eme ainult kahte vĂ”imalikku tegevust, mis on mĂ€ngureeglite poolt lubatud:

1. MÀngi Swamp (tulemus: Swamp mÀngus)
2. MÀngi Forest (tulemus: Forest mÀngus)

Iga vastuvĂ”etud tegevus vĂ”ib viia edasi uute tegevusteni ja sulgeda teisi, jĂ€lle mĂ€ngureeglitest lĂ€htuvalt. Kujutage ette, et me mĂ€ngisime Swampi – see eemaldab Swampi jĂ€rgmiseks sammuks (oleme selle juba mĂ€nginud), see eemaldab ka Foresti (sest reeglite jĂ€rgi vĂ”ib ĂŒhe ringi jooksul mĂ€ngida vaid ĂŒhe maakaardi). PĂ€rast seda lisab tehisintellekt jĂ€rgmiseks sammuks – 1 musta mana saamine, kuna muid vĂ”imalusi pole. Kui ta edasi lĂ€heb ja valib Tap the Swamp, siis saab ta 1 musta mana ja ei saa sellega midagi teha.

1. MÀngi Swamp (tulemus: Swamp mÀngus)
1.1 „TĂ€pida“ Swamp (tulemus: Swamp on „tĂ€pitud“, +1 musta mana)
Ei ole saadaval tegevusi – LÕPP
2. MÀngi Forest (tulemus: Forest mÀngus)

Tegevuste loend on liiga lĂŒhike, oleme ummikus. Korrake protsessi jĂ€rgmise tegevuse jaoks. MĂ€ngime Foresti, avame tegevuse „saada 1 roheline mana“, mis omakorda avab kolmanda tegevuse – Elvish Mystici kutse.

1. MÀngi Swamp (tulemus: Swamp mÀngus)
1.1 „TĂ€pida“ Swamp (tulemus: Swamp on „tĂ€pitud“, +1 musta mana)
Ei ole saadaval tegevusi – LÕPP
2. MÀngi Forest (tulemus: Forest mÀngus)
2.1 „TĂ€pida“ Forest (tulemus: Forest on „tĂ€pitud“, +1 roheline mana)
2.1.1 Kutsuda Elvish Mystic (tulemus: Elvish Mystic mÀngus, -1 roheline mana)
Ei ole saadaval tegevusi – LÕPP

LÔpuks oleme uurinud kÔiki vÔimalikke tegevusi ja leidnud plaani, mis kutsub esile olendi.

See on vĂ€ga lihtsustatud nĂ€ide. Soovitav on valida parim vĂ”imalik plaan, mitte lihtsalt selline, mis vastab mingitele kriteeriumitele. Üldiselt saab potentsiaalseid plaane hinnata lĂ”pptulemuse vĂ”i nende tĂ€itmise koguhinna alusel. MĂ€ngides maakaardiga saab koguda 1 punkti ning looma kutsumisega 3 punkti. Swampi mĂ€ngimine oleks plaan, mis annab 1 punkti. Foresti mĂ€ngimine → Foresti sisselĂŒlitamine → Elvish Mystici kutsumine annab aga kohe 4 punkti.

Nii töötab planeerimine Magic: The Gathering'is, kuid sama loogikat rakendatakse ka muudesse olukordadesse. NĂ€iteks, nii saate liikuda nupuga, et teha ruumi elevandi kĂ€iguks ĆĄahhis. VĂ”i peituda seina taha, et XCOM-is ohutult tulistada. ÜhesĂ”naga, saad aru.

Parandatud planeerimine

MĂ”nikord on liiga palju potentsiaalseid tegusid, et kaaluda iga vĂ”imalikke variante. Naaseme Magic: The Gathering'i nĂ€ite juurde: oletame, et mĂ€ngus on teil mitmeid maakaarte ja olendeid – vĂ”imalike kĂ€ikude arv vĂ”ib ulatuda kĂŒmnete kaupa. Probleemi lahendamiseks on mitu meetodit.

Esimene viis on backwards chaining (tagasiulatuv ahel). Selle asemel, et kĂ”iki kombinatsioone lĂ€bi vaadata, on parem alustada lĂ”pptulemusest ja proovida leida otsetee. Selle asemel, et liikuda puu juurest kindla leheni, liigume vastassuunas – lehest juure juurde. See meetod on lihtsam ja kiirem.

Kui vastasel on 1 elupunkt, saab leida plaani „teha 1 vĂ”i rohkem kahju“. Selle saavutamiseks tuleb tĂ€ita mitmeid tingimusi:

1. Kahju vĂ”ib teha loits – see peab olema kĂ€es.
2. Loitsu mÀngimiseks on vajalik mana.
3. Mana saamiseks tuleb mÀngida maakaart.
4. Maakaardi mÀngimiseks peab see olema kÀes.

Teine vĂ”imalus on best-first search (parim esimene otsing). Selle asemel, et kĂ”iki teid uurida, valime kĂ”ige sobivama. Sageli annab see meetod optimaalse plaani, ilma et peaksite otsinguteks ĂŒlemÀÀraselt vaeva nĂ€gema. A* on parima esimese otsingu vorm – uurides kĂ”ige lootustandvamaid marsruute alates algusest, suudab see juba leida parima tee, ilma et peaks kontrollima teisi variante.

Huvitav ja aina populaarsem variant parima esmaklassilise otsingu jaoks on Monte Carlo puuotsing. Selle asemel, et Àra arvata, millised plaanid on paremad iga jÀrgmise tegevuse valimisel, valib algoritm iga sammu korral juhuslikke jÀrgijaid, kuni jÔuab lÔpuni (kui plaan viib vÔiduni vÔi kaotusele). SeejÀrel kasutatakse lÔpptulemust selleks, et tÔsta vÔi langetada varasemaid valikute "kaalu" hindamisi. Korrates seda protsessi mitu korda jÀrjest, annab algoritm hea hinnangu, milline jÀrgmine samm on parem, isegi kui olukord muutub (kui vastane astub samme, et mÀngijat takistada).

MĂ€ngude planeerimisest rÀÀkides ei saa me mööda minna sihitud tegevuste planeerimist ehk GOAP (Goal-Oriented Action Planning). See on laialdaselt kasutatav ja arutletud meetod, kuid peale mĂ”nede eristavate detailide on see sisuliselt tagasipöördumise ahela meetod, millest me varem rÀÀkisime. Kui ĂŒlesanne on "mĂ€ngija hĂ€vitamine" ja mĂ€ngija on varjupaiga taga, vĂ”ib plaan olla jĂ€rgmine: hĂ€vitada granaadiga → vĂ”tta see ĂŒles → visata.

Tavaliselt on mitmeid eesmĂ€rke, igal neist on oma prioriteet. Kui kĂ”ige kĂ”rgema prioriteediga eesmĂ€rki ei saa tĂ€ita (ĂŒhegi tegevuste kombinatsioon ei loo plaani "hĂ€vitada mĂ€ngija", kuna mĂ€ngija ei ole nĂ€htav), siis tagastab tehisintellekt madalama prioriteedi eesmĂ€rkide juurde.

Koolitus ja kohandamine

Oleme juba rÀÀkinud, et mĂ€ngu tehisintellekt ei kasuta tavaliselt masinĂ”pet, kuna see ei sobi reaalajas agente juhtimiseks. Kuid see ei tĂ€henda, et sealt ei saaks midagi laenata. Me tahame sellist vastast tulistamismĂ€ngus, kellelt on vĂ”imalik Ă”ppida. NĂ€iteks teada saada parimatest kohtadest kaardil. VĂ”i vastast kaklusmĂ€ngus, kes blokeerib mĂ€ngija tihti kasutatavaid kombo-kĂ€ike, motiveerides kasutama teisi. Nii et masinĂ”pe sellistes olukordades vĂ”ib olla ĂŒsna kasulik.

Statistika ja tÔenÀosused

Enne kui lĂ€heme keerukate nĂ€idete juurde, vaatame, kui kaugele me saame minna, tehes mĂ”ned lihtsad mÔÔtmised ja kasutades neid otsuste tegemiseks. NĂ€iteks, reaalaja strateegia — kuidas me saame kindlaks teha, kas mĂ€ngija suudab alustada rĂŒnnakut mĂ€ngu esimestel minutitel ja millist kaitset selle vastu valmistada? Saame uurida mĂ€ngija varasemat kogemust, et mĂ”ista, milline vĂ”ib olla tulevane reaktsioon. Alustuseks meil pole selliseid algandmeid, kuid saame need koguda — iga kord, kui AI mĂ€ngib inimese vastu, saab ta salvestada esimese rĂŒnnaku aja. PĂ€rast mitmeid sessioone saame keskmise aja, mille jooksul mĂ€ngija tulevikus rĂŒndab.

KeskvÀÀrtustel on probleem: kui mĂ€ngija on 20 korda 'rushinud' ja 20 korda mĂ€nginud aeglaselt, siis vajalikud vÀÀrtused jÀÀvad kuskil keskele, mis ei paku meile midagi kasulikku. Üks lahendustest on sisendandmete piiramine — vĂ”ime arvesse vĂ”tta viimased 20 juhtumit.

Sarnast lĂ€henemist kasutatakse teatud toimingute tĂ”enĂ€osuse hindamisel, eeldades, et mĂ€ngija varasemad eelistused jÀÀvad tulevikus samaks. Kui mĂ€ngija rĂŒndab meid viis korda tulepalliga, kaks korda vĂ€lguga ja ĂŒhe korra lĂ€hivĂ”itluses, on ilmne, et ta eelistab tulepalli. Ekstrapoleerime ja nĂ€eme erineva relva kasutamise tĂ”enĂ€osust: tulepall=62,5%, vĂ€lk=25% ja lĂ€hivĂ”itlus=12,5%. Meie mĂ€ngu AI peab valmistuma tule eest kaitsmiseks.

Veel ĂŒks huvitav meetod on kasutada Naive Bayes Classifier'i (naiivne bayeslik klassifikaator) suurte sisendandmete koguste uurimiseks ja olukorra klassifitseerimiseks, et AI reageeriks Ă”igesti. Bayeslikud klassifikaatorid on kĂ”ige tuntumad selle poolest, kuidas neid kasutatakse e-kirjade rĂ€mpsposti filtrites. Seal uurivad nad sĂ”nu, vĂ”rdlevad neid sellega, kus need sĂ”nad varem esinesid (rĂ€mpspostis vĂ”i mitte), ja teevad jĂ€reldusi saabuvate kirjade kohta. Saame teha sama isegi vĂ€iksema sisendandmete hulgaga. Tuginedes kĂ”ikidele kasulikule teabele, mida AI nĂ€eb (nt millised vaenlase ĂŒksused on loodud, milliseid loitse nad kasutavad vĂ”i milliseid tehnoloogiaid on nad uurinud) ja lĂ”pptulemusele (sĂ”da vĂ”i rahu, 'rushida' vĂ”i kaitsta jne) — valime vajaliku AI kĂ€itumise.

KÔik need Ôppimise meetodid on piisavad, kuid oleks soovitatav neid kasutada testimise andmete pÔhjal. Tehisintellekt Ôpib kohanduma erinevate strateegiatega, mida teie mÀngijad kasutasid. Tehisintellekt, mis kohandub mÀngijaga pÀrast vÀljaandmist, vÔib osutuda liiga ennustatavaks vÔi vastupidi, liiga keeruliseks vÔidetavaks.

Kohandamine vÀÀrtuste pÔhjal

Arvestades meie mÀngumaailma sisu ja reegleid, saame muuta nende otsuste tegemiseks mÔjutavaid vÀÀrtuste komplekte, mitte lihtsalt kasutada sisendandmeid. Teeme seda jÀrgmiselt:

  • Las tehisintellekt kogub andmeid mĂ€ngu ajal maailma olekute ja vĂ”tmeeventside kohta (nagu on varem mainitud).
  • Muudame mĂ”ningaid olulisi vÀÀrtusi (value) nende andmete pĂ”hjal.
  • Rakendame oma otsuseid, mis pĂ”hinevad nende vÀÀrtuste töötlemisel vĂ”i hindamisel.

NĂ€iteks, kui agentil on mitu tuba valimiseks esimese isiku tulistamismĂ€ngu kaardil. Igal toal on oma vÀÀrtus, mis mÀÀrab, kui soovitav see kĂŒlastamiseks on. Tehisintellekt valib juhuslikult, millisesse tuppa minna, pĂ”hinedes vÀÀrtusele. Siis mĂ€letab agent, millises toas ta hĂ€vines, ja vĂ€hendab selle vÀÀrtust (tĂ”enĂ€osus, et ta sinna naaseb). Vastupidisel juhul — kui agent hĂ€vib palju vastaseid, siis toaga seotud vÀÀrtus suureneb.

Markovi mudel

Mis siis, kui me kasutame kogutud andmeid ennustamiseks? Kui me mÀletame iga tuba, kus mÀngijat teatud aja jooksul nÀgime, suudame ennustada, millisesse tuppa mÀngija vÔib minna. JÀlgides ja registreerides mÀngija liikumisi tubade vahel (values), saame neid ennustada.

VÔtame kolm tuba: punane, roheline ja sinine. Ja ka tÀhelepanekud, mida oleme kogunud mÀngu sessiooni vaatamisel:

Kuidas luua mÀngu AI: algajate juhend

Iga toa jĂ€lgimise arv on peaaegu sama — kus on hea koha jaoks varitseda, ei tea me siiani. Statistika kogumine on samuti keeruline, kuna mĂ€ngijad ilmuvad kaardil ĂŒhtlaselt. Kuid jĂ€rgmise toa andmed, kuhu nad sisenevad pĂ€rast kaardile ilmumist, on juba kasulikud.

NĂ€ha on, et roheline tuba meeldib mĂ€ngijatele — enamik inimesi punasest liigub sinna, kellest 50% jÀÀb sinna edasi. Sinine tuba aga ei naudi populaarsust, sinna peaaegu ei minda ja kui minnakse, siis ei viibita seal kaua.

Kuid andmed rÀÀgivad meile midagi tĂ”eliselt olulist — kui mĂ€ngija viibib sinises toas, siis on jĂ€rgmine tuba, kus me teda kĂ”ige tĂ”enĂ€olisemalt nĂ€eme, punane, mitte roheline. Kuigi roheline tuba on punasest populaarsem, muutub olukord, kui mĂ€ngija viibib sinises. JĂ€rgmine seisund (ehk tuba, kuhu mĂ€ngija lĂ€heb) sĂ”ltub eelnevast seisundist (ehk toast, kus mĂ€ngija hetkel viibib). Seoste uurimise tĂ”ttu prognoosime me tĂ€psemalt, kui kui me lihtsalt loendame vaatlemisi iseseisvalt.

Tuleviku seisundi ennustamist möödunud seisundi andmete pĂ”hjal nimetatakse Markovi mudeliks (Markov model) ja selliseid nĂ€iteid (tubadega) nimetatakse Markovi ahelateks. Kuna mudelid kujutavad endast tĂ”enĂ€osust muutusteks jĂ€rjestikuste seisundite vahel, esitatakse need visuaalselt FSM-ina, kus iga ĂŒlemineku tĂ”enĂ€osus on ligikaudu nĂ€idatud. Varem kasutasime FSM-i agendi kĂ€itumise seisundi esitamiseks, kuid see kontseptsioon laieneb igasugusele seisundile, olenemata sellest, kas see on seotud agendiga vĂ”i mitte. Antud juhul esindavad seisundid agenti hĂ”ivatud tuba:

Kuidas luua mÀngu AI: algajate juhend

See on lihtne variant suhtelise tÔenÀosuse muutuste esitamiseks, andes tehisintellektille vÔimaluse ennustada jÀrgmist seisundit. VÔib teha prognoose mitu sammu ettepoole.

Kui mÀngija viibib rohelises toas, siis on 50% tÔenÀosus, et ta jÀÀb sinna ka jÀrgmise vaatlemise ajal. Kuid kui suur on tÔenÀosus, et ta jÀÀb sinna ka pÀrast seda? On olemas mitte ainult tÔenÀosus, et mÀngija jÀi rohelisse tuppa pÀrast kahte vaatlemist, vaid ka tÔenÀosus, et ta lahkus ja naasis. Siin on uus tabel uute andmete arvestamisel:

Kuidas luua mÀngu AI: algajate juhend

Tabelist on nĂ€ha, et tĂ”enĂ€osus nĂ€ha mĂ€ngijat rohelises toas pĂ€rast kahte vaatlemist on 51% — 21%, et ta tuleb punasest toast, 5% nende hulgast, et mĂ€ngija kĂŒlastab sinist tuba nende vahel, ja 25%, et mĂ€ngija ei lahku ĂŒldse rohelisest toast.

Tabel on lihtsalt visuaalne tööriist - protseduur nĂ”uab vaid tĂ”enĂ€osuste korrutamist igal sammul. See tĂ€hendab, et saate vaadata kaugele tulevikku, ĂŒhe parandusega: oletame, et tĂ”enĂ€osus siseneda ruumi sĂ”ltub tĂ€ielikult praegusest ruumist. Seda kutsutakse Markovi omaduseks - tulevane olek sĂ”ltub ainult olevikust. Kuid see ei ole tĂ€iesti tĂ€pne. MĂ€ngijad vĂ”ivad otsuseid muuta sĂ”ltuvalt teistest teguritest: tervise tase vĂ”i kuulide arv. Kuna me ei fikseeri neid vÀÀrtusi, on meie ennustused vĂ€hem tĂ€psed.

N-grammid

Kuidas on asi nĂ€itel, kus mĂ€ngija vĂ”itleb ja ennustab combo-vĂ”tteid? TĂ€pselt sama! Kuid ĂŒhe oleku vĂ”i sĂŒndmuse asemel uurime tervet jĂ€rjestust, millest combo-ĂŒtlus koosneb.

Üks viis seda teha on salvestada iga sisend (nĂ€iteks Kick, Punch vĂ”i Block) puhvrisse ja salvestada kogu puhver sĂŒndmusena. Seega, kui mĂ€ngija jĂ€rjestikku vajutab Kick, Kick, Punch, et kasutada rĂŒnnakut SuperDeathFist, salvestab AI kĂ”ik sisendid puhvrisse ja mĂ€letab viimaseid kolme, mida kasutatakse igal sammul.

Kuidas luua mÀngu AI: algajate juhend
(Rasvases kirjas on read, kui mĂ€ngija kĂ€ivitab rĂŒnnaku SuperDeathFist.)

AI nÀeb kÔiki vÔimalusi, kui mÀngija valis Kick, jÀrgneb teine Kick, ning seejÀrel mÀrkab, et jÀrgmine sisend on alati Punch. See vÔimaldab agendil ennustada combo-vÔtet SuperDeathFist ja blokeerida selle, kui see on vÔimalik.

Need sĂŒndmuste jĂ€rjestused nimetatakse N-grammideks, kus N on salvestatud elementide arv. Eelnevas nĂ€ites oli see 3-gramm (triaagramm), mis tĂ€hendab: esimesed kaks salvestust kasutatakse kolmanda ennustamiseks. SeelĂ€bi ennustavad 5-grammis esimesed neli salvestust viiendat ja nii edasi.

Arendajal on vaja hoolikalt valida N-grammide suurus. VÀhem N-d nÔuab vÀhem mÀlu, kuid salvestab ka vÀhem ajalugu. NÀiteks 2-gramm (bikgramm) salvestab Kick, Kick vÔi Kick, Punch, kuid ei suuda salvestada Kick, Kick, Punch, seega ei reageeri AI combo SuperDeathFist-le.

Teiselt poolt, suuremad numbrid nÔuavad rohkem mÀlu ja AI-l on raskem Ôppida, kuna tekib palju rohkem vÔimalikke kombinatsioone. Kui teil oli kolm vÔimaliku sisendit Kick, Punch vÔi Block, ja kasutasime 10-grammi, siis tekib umbes 60 tuhat erinevat varianti.

Bigrammi mudel on lihtne Markovi ahel — iga paar "eelmine seisund / praegune seisund" on bigramm ja vĂ”ite ennustada teist seisundit esimesest. 3-gramm ja suuremad N-grammid vĂ”ivad samuti olla Markovi ahelad, kus kĂ”ik elemendid (v.a viimane N-grammis) koos moodustavad esimese seisundi ja viimane element — teise. NĂ€ide, kus on vĂ”itlus, nĂ€itab ĂŒlemineku tĂ”enĂ€osust olukorrast Kick ja Kick olukorda Kick ja Punch. Arvestades mitmeid sissejuhatusajaloo kirjeid kui ĂŒhte ĂŒksust, muundame me sisendi jĂ€rjestuse osaks terviklikust seisundist. See annab meile Markovi omaduse, mis vĂ”imaldab kasutada Markovi ahelaid jĂ€rgnevate sisendite ennustamiseks ja Ă€ra arvata, milline tehnikakĂ€ik jĂ€rgneb.

KokkuvÔte

RÀÀkisime kÔige levinumatest tööriistadest ja lÀhenemistest tehisintellekti arenduses. Samuti arutasime olukordi, kus neid tuleks rakendada ja kus nad on eriti kasulikud.

Seda peaks olema piisavalt, et mÔista mÀngu tehisintellekti pÔhiasju. Kuid muidugi pole see kaugeltki kÔik meetodid. VÀhem levinud, kuid samas efektiivsed on:

  • optimeerimisalgoritmid, sealhulgas mĂ€gede tĂ”us, gradientne langus ja geneetilised algoritmid
  • konkurentsilised otsingu / planeerimise algoritmid (minimax ja alpha-beta kĂ€rpimine)
  • klassifitseerimismeetodid (perceptroonid, nĂ€rvivĂ”rgud ja toele suunatud masinad)
  • sĂŒsteemid agentide tajumise ja mĂ€lu töötlemiseks
  • arhitektuurilised lĂ€henemised tehisintellektile (hĂŒbriidsĂŒsteemid, arhitektuuride alamkogud ja teised tehisintellekti sĂŒsteemide ĂŒlekandmise viisid)
  • animatsiooni tööriistad (liikumise planeerimine ja sĂŒnkroniseerimine)
  • tulemusfaktorid (detailide tase, anytime algoritmid ja timeslicing)

Internetiallikad teemal:

1. GameDev.net sisaldab artiklite ja Ôpetuste jaotist tehisintellekti kohta, samuti a forum.
2. AiGameDev.com kÀtkeb hulgaliselt esitlusmaterjale ja artikleid laia valiku teemade kohta seotud mÀngu tehisintellekti arendusega.
3. The GDC Vault sisaldab GDC AI tippkohtumise teemasid, mille hulgast paljusid saab tasuta ligipÀÀseda.
4. Kasulikke materjale vÔib leida ka saidilt AI Game Programmers Guild.
5. Tommy Thompson, tehisintellekti ja mÀngude arendamise uurija, teeb YouTube'i kanalil AI and Games videoid tehisintellekti selgitamiseks ja uurimiseks kommertsmÀngudes.

Teemakohased raamatud:

1. Raamatute sari Game AI Pro koosneb lĂŒhikestest artiklitest, mis selgitavad, kuidas rakendada konkreetseid funktsioone vĂ”i kuidas lahendada konkreetseid probleeme.

Game AI Pro: MĂ€ngude AI professionaalide kogutud tarkus
Game AI Pro 2: MĂ€ngude AI professionaalide kogutud tarkus
Game AI Pro 3: MĂ€ngude AI professionaalide kogutud tarkus

2. Sarja AI Game Programming Wisdom eelkÀija on sari Game AI Pro. Selles on vanemaid meetodeid, kuid peaaegu kÔik on tÀnapÀeval siiski asjakohased.

AI Game Programming Wisdom 1
AI Game Programming Wisdom 2
AI Game Programming Wisdom 3
AI Game Programming Wisdom 4

3. Tehisintellekt: Kaasaegne lĂ€henemine — see on ĂŒks pĂ”hitekste kĂ”igile, kes soovivad aru saada tehisintellekti ĂŒldisest valdkonnast. See raamat ei kĂ€sitle mĂ€ngude arendust — see Ă”petab tehisintellekti pĂ”hialuseid.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster