{"id":52118,"date":"2019-11-01T00:00:00","date_gmt":"2019-10-31T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih"},"modified":"2020-02-18T13:59:47","modified_gmt":"2020-02-18T10:59:47","slug":"kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/novosti-interneta\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","title":{"rendered":"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/9e57175b233a104e0df98383b374eded.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLeidsin huvitava materjali tehisintellekti kohta m\u00e4ngudes. Selgitustega p\u00f5hiasjadest tehisintellekti kohta lihtsate n\u00e4idetega, samuti palju kasulikke t\u00f6\u00f6riistu ja meetodeid selle mugavaks arendamiseks ja projekteerimiseks. Kuidas, kus ja millal neid kasutada \u2013 ka see on olemas.<\/p>\n<p>Enamik n\u00e4iteid on kirjutatud pseudokoodis, seega ei ole s\u00fcgavad programmeerimise teadmised vajalikud. Postituse all 35 lehek\u00fclge teksti koos piltide ja GIFidega, seega valmistuge.<\/p>\n<p>UPD. Vabandan, kuid olen juba teinud enda t\u00f5lke sellest artiklist Habras. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/PatientZero\/\">PatientZero<\/a><\/noindex>. Tema versiooni saab lugeda <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/420219\/\">siit<\/a><\/noindex>, kuid mingil p\u00f5hjusel j\u00e4i artikkel minust m\u00f6\u00f6da (kasutasin otsingut, aga midagi l\u00e4ks valesti). Ja kuna kirjutan m\u00e4nguarendusele p\u00fchendatud blogisse, otsustasin j\u00e4tta oma t\u00f5lke variandi tellijatele (m\u00f5ned punktid on mul teistmoodi vormistatud, m\u00f5ned \u2013 teadlaste soovitusel j\u00e4etud v\u00e4lja).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mis on tehisintellekt?<\/h2>\n<p>\nM\u00e4ngu tehisintellekt keskendub sellele, milliseid tegevusi objekt peab olukordade p\u00f5hjal tegema, milles ta asub. Seda nimetatakse tavaliselt \u201eintelligentsete agentide\u201d juhtimiseks, kus agent on m\u00e4ngu tegelane, s\u00f5iduk, robot v\u00f5i m\u00f5ni muu abstraktsem asi: terviklik olek v\u00f5i isegi tsivilisatsioon. Igal juhul peab see subjekt n\u00e4gema oma keskkonda, tegema selle p\u00f5hjal otsuseid ja tegutsema vastavalt. Seda nimetatakse Sense\/Think\/Act (Tunne\/M\u00f5tle\/Toimi) ts\u00fckliks:<\/p>\n<ul>\n<li>Tunne: agent leiab v\u00f5i saab teavet oma keskkonnas asjade kohta, mis v\u00f5ivad m\u00f5jutada tema k\u00e4itumist (l\u00e4heduses olevaid ohte, kogutavaid esemeid, huvitavaid kohti uurimiseks).<\/li>\n<li>M\u00f5tle: agent otsustab, kuidas reageerida (hindab, kas on piisavalt ohutu esemeid koguda v\u00f5i peaks ta esmalt v\u00f5itlema\/peitma).<\/li>\n<li>Toimi: agent teostab tegevusi eelmise otsuse elluviimiseks (alustab liikumist vaenlase v\u00f5i eseme suunas).<\/li>\n<li>\u2026n\u00fc\u00fcd on olukord muutunud tegelaste tegevuste t\u00f5ttu, seega kordub ts\u00fckkel uute andmetega.<\/li>\n<\/ul>\n<p>\nTehisintellekt keskendub tavaliselt Sense-osale ts\u00fcklis. N\u00e4iteks autonoomsed autod teevad teest pilte, \u00fchendavad need radarist ja lidarst saadud andmetega ning t\u00f5lgendavad neid. Selle tavaliselt teeb masin\u00f5pe, mis t\u00f6\u00f6tleb sissetulevaid andmeid ja annab neile t\u00e4henduse, tuues v\u00e4lja semantilist teavet nagu \"seal on veel \u00fcks auto 20 jala kaugusel teie ees\". Need on nn klassifitseerimisprobleemid.<\/p>\n<p>M\u00e4ngud ei vaja keerukat s\u00fcsteemi teabe v\u00e4ljat\u00f5mbamiseks, kuna suur osa andmeid on juba nende lahutamatu osa. Pole vaja kasutada pildituvastusalgoritme, et m\u00e4\u00e4rata, kas ees on vaenlane \u2014 m\u00e4ng teab seda juba ja edastab teavet otsuste tegemise protsessi k\u00e4igus. Seet\u00f5ttu on Sense-o osa ts\u00fcklist sageli palju lihtsam kui Think ja Act.<\/p>\n<h2>M\u00e4ngude tehisintellekti piirangud<\/h2>\n<p>\nTehisintellektil on mitmeid piiranguid, mida tuleb j\u00e4rgida:<\/p>\n<ul>\n<li>Tehisintellekti ei ole vaja eelnevalt treenida, nagu see oleks masin\u00f5ppe algoritm. T\u00fchja m\u00f5tted kirjutada n\u00e4rviv\u00f5rgustiku arendamise ajal, et j\u00e4lgida k\u00fcmneid tuhandeid m\u00e4ngijaid ja \u00f5ppida nende vastu parimat m\u00e4ngimise viisi, on m\u00f5ttetu. Miks? Sest m\u00e4ng ei ole veel v\u00e4lja antud ja m\u00e4ngijaid ei ole.<\/li>\n<li>M\u00e4ng peab olema l\u00f5bus ja v\u00e4ljakutsuv, seega ei tohi agentidel olla paremat l\u00e4henemist inimeste vastu.<\/li>\n<li>Agendid peavad v\u00e4lja n\u00e4gema realistlikud, et m\u00e4ngijad tunneksid, et nad m\u00e4ngivad p\u00e4ris inimeste vastu. AlphaGo programm suudab inimesest \u00fcle, kuid valitud k\u00e4igud olid v\u00e4ga kaugel traditsioonilisest m\u00e4ngu m\u00f5istmisest. Kui m\u00e4ng j\u00e4ljendab inimvastast vastast, ei tohi seda tunnet olla. Algoritmi tuleb muuta, et see teeks usutavaid otsuseid, mitte ideaalseid.<\/li>\n<li>Tehisintellekt peab t\u00f6\u00f6tama reaalajas. See t\u00e4hendab, et algoritm ei tohi monopoliseerida protsessori kasutamist pikka aega otsuste tegemiseks. Isegi 10 millisekundi kasutamine on liiga kaua, sest enamikule m\u00e4ngudele piisab kogu t\u00f6\u00f6tlemise ja j\u00e4rgmise graafikakaadri vahetamise jaoks 16 kuni 33 millisekundist.<\/li>\n<li>Ideaalis peaks v\u00e4hemalt osa s\u00fcsteemist olema andmete kaudu juhitud, et 'mitte-koodijad' saaksid muudatusi teha ja et kohandamised toimuksid kiiremini.<\/li>\n<\/ul>\n<p>\nVaatame tehisintellekti l\u00e4henemisviise, mis katab kogu Sense\/Think\/Act ts\u00fckli.<\/p>\n<h3>P\u00f5hikohtade vastuv\u00f5tmine<\/h3>\n<p>\nAlustame k\u00f5ige lihtsamast m\u00e4ngust \u2014 Pong. Eesm\u00e4rk: liigutada platvormi (paddle) nii, et pall p\u00f5rkaks sellest tagasi, mitte ei lendaks m\u00f6\u00f6da. See on nagu tennis, kus kaotate, kui ei l\u00f6\u00f6 palli tagasi. Siin on AI-l suhteliselt lihtne \u00fclesanne \u2014 otsustada, millises suunas platvormi liikuda.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/e1935d657b9f090bf60c365c21e8f92b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Tingimuslikud operaatorid<\/h3>\n<p>\nPongis on AI jaoks k\u00f5ige ilmsem lahendus \u2014 proovida alati hoida platvorm palliga all.<\/p>\n<p>Lihtne algoritm selle jaoks, kirjutatud pseudokoodis:<\/p>\n<p><i>iga kaader\/uuendus, kui m\u00e4ng on k\u00e4imas:<br \/>\nkui pall on platvormi vasakul:<br \/>\n liiguta platforma vasakule<br \/>\nkui pall on platvormi paremal:<br \/>\n liiguta platforma paremale<\/i><\/p>\n<p>Kui platvorm liigub sama kiiresti kui pall, siis on see ideaalne algoritm AI jaoks Pongis. Pole vaja midagi keeruliseks muuta, kui andmeid ja v\u00f5imalikke tegevusi agendile pole eriti palju.<\/p>\n<p>See l\u00e4henemine on nii lihtne, et kogu Sense\/Think\/Act ts\u00fckkel on vaevu tajutav. Kuid see on olemas:<\/p>\n<ul>\n<li>Sense'i osa on kahes if operaatoris. M\u00e4ng teab, kus pall on ja kus platvorm asub, seega p\u00f6\u00f6rdub AI nende andmete saamiseks m\u00e4ngu poole. <\/li>\n<li>Osa Think sisaldab ka kahte if-operatsioonis\u00fcsteemi. Need moodustavad kaks lahendust, mis on antud juhul v\u00e4listavad. Tulemusena valitakse \u00fcks kolmest tegevusest \u2014 liigutada platvorm vasakule, liigutada paremale v\u00f5i mitte midagi teha, kui see on juba \u00f5igesti paigutatud.<\/li>\n<li>Osa Act asub Move Paddle Left ja Move Paddle Right operatsioonides. Olenevalt m\u00e4ngu kujundusest v\u00f5ivad need platvormi liigutada koheselt v\u00f5i teatud kiirusel. <\/li>\n<\/ul>\n<p>\nSelliseid l\u00e4henemisi nimetatakse reageerivateks \u2014 on olemas lihtne reeglite kogu (antud juhul koodis olevad if-operatsioonid), mis reageerivad maailma praegusele olekule ja tegutsevad.<\/p>\n<h3>Otsustuspuu<\/h3>\n<p>\nN\u00e4ide m\u00e4ngust Pong on tegelikult v\u00f5rdne formaalse tehisintellekti kontseptsiooniga, mida nimetatakse otsustuspuuks. Algoritm liigub selle kaudu, et j\u00f5uda 'leheni' \u2014 otsusele, millist tegevust v\u00f5tta.<\/p>\n<p>Vaatame otsustuspuu plokkskeemi meie platvormi algoritmile:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/d3b7290ba93144967cd849416cd5eef3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIga osa puust on nimetatud node'iks (s\u00f5lm) \u2014 tehisintellekt kasutab analoogiat graafiteooriaga, et kirjeldada sarnaseid struktuure. On kaks t\u00fc\u00fcpi s\u00f5lmi:<\/p>\n<ul>\n<li>Otsustuspunktid: valik kahe alternatiivi vahel, mis p\u00f5hineb m\u00f5nedel tingimustel, kus iga alternatiiv esindatakse kui eraldi s\u00f5lm.<\/li>\n<li>L\u00f5pps\u00f5lmed: teostamine, mis esindab l\u00f5plikku otsust.<\/li>\n<\/ul>\n<p>\nAlgoritt algab esimesest s\u00f5lmest (\"puu juurest\"). See kas otsustab, millisele t\u00fctre s\u00f5lmele liikuda, v\u00f5i t\u00e4idab s\u00f5lmes s\u00e4ilitatud toimingu ja l\u00f5petatakse.<\/p>\n<p>Kuidas on siis kasu, kui otsuste puu teeb sama t\u00f6\u00f6d, mis if-operaatorid eelnevas osas? Siin on \u00fchine s\u00fcsteem, kus igal otsusel on ainult \u00fcks tingimus ja kaks v\u00f5imalikku tulemust. See v\u00f5imaldab arendajal luua tehisintellekti andmete p\u00f5hjal, mis esindab otsuseid puus, v\u00e4ltides selle k\u00f5vasti kodeerimist. Kujutame seda tabelina:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/6875293a60ff9d0efa26fb5e1aa4b21c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKoodi poolel saate rea lugemise s\u00fcsteemi. Looge iga\u00fche jaoks s\u00f5lm, \u00fchendage otsuste langetamise loogika teise veeru p\u00f5hjal ja alams\u00f5lmed kolmanda ja neljanda veeru p\u00f5hjal. Teil on endiselt vaja programmeerida tingimused ja toimingud, kuid n\u00fc\u00fcd on m\u00e4ngustruktuur keerukam. Lisate t\u00e4iendavaid otsuseid ja toiminguid ning seadistate kogu tehisintellekti, redigeerides lihtsalt tekstifaili puu m\u00e4\u00e4ratlemiseks. Seej\u00e4rel edastate faili m\u00e4ngudisainerile, kes saab k\u00e4itumist muuta ilma m\u00e4ngu uuesti kompileerimata v\u00f5i koodi muutmata.<\/p>\n<p>Otsustuspuud on \u00fcsna kasulikud, kui neid ehitatakse automaatselt suure n\u00e4idiste kogumi p\u00f5hjal (n\u00e4iteks ID3 algoritmi kasutades). See muudab need t\u00f5husaks ja suure j\u00f5udlusega t\u00f6\u00f6riistaks olukordade klassifitseerimiseks saadud andmete p\u00f5hjal. Siiski \u00fcletame lihtsa s\u00fcsteemi, mis valib tegevusi agentide jaoks.<\/p>\n<h3>Stsenaariumid<\/h3>\n<p>\nOleme v\u00e4lja t\u00f6\u00f6tanud otsuste puus\u00fcsteemi, mis kasutas eelnevalt loodud tingimusi ja tegevusi. Kunstliku intelligentsuse projekteerija saab korraldada puu nii, nagu ta soovib, kuid ta peab ikkagi tuginema programmeerijale, kes kogu selle loonud on. Mis siis, kui me saaksime anda disainerile t\u00f6\u00f6riistad oma tingimuste v\u00f5i tegevuste loomiseks?<\/p>\n<p>Kuna programmeerija ei pea pingutama koodi kirjutamisega tingimuste Is Ball Left Of Paddle ja Is Ball Right Of Paddle jaoks, v\u00f5ib ta luua s\u00fcsteemi, kus disainer salvestab tingimused nende v\u00e4\u00e4rtuste kontrollimiseks. Siis n\u00e4eks otsuste puu andmed v\u00e4lja j\u00e4rgmiselt:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/8e77f7c3410d097e8b7d8e1209355cc6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSisuliselt on see sama, mis esimeses tabelis, kuid lahendused omavad omavahelist koodi, mis on veidi sarnane if-lausete tingimuslikule osale. Koodi poole pealt loetaks see otsustuspindade teises veerus, kuid eristava tingimuse otsimise asemel (Kas pall on raceri vasakul k\u00fcljel?) hinnatakse tingimuslauset ja tagastatakse vastavalt true v\u00f5i false. Selleks kasutatakse skriptikeelt Lua v\u00f5i Angelscript. Nende abil saab arendaja oma m\u00e4ngus objekte (pall ja ratas) t\u00f6\u00f6delda ning luua muutujaid, mis on skriptis kergesti k\u00e4tte saadavad (ball.position). Lisaks on skriptikeel lihtsam kui C++. See ei n\u00f5ua t\u00e4iskompileerimise etappi, mist\u00f5ttu sobib see ideaalselt m\u00e4ngulogika kiireks kohandamiseks ja v\u00f5imaldab \u201ekoodita\u201c inimestel ise vajalikke funktsioone luua.<\/p>\n<p>Antud n\u00e4ites kasutatakse skriptikeelt ainult tingimuslause hindamiseks, kuid seda saab kasutada ka tegevuste jaoks. N\u00e4iteks v\u00f5ivad andmed Move Paddle Right muutuda skriptioperatsiooniks (ball.position.x += 10). Nii v\u00f5ib tegevuse m\u00e4\u00e4ratlemine toimuda skriptis ilma vajaduseta programmeerida Move Paddle Right.<\/p>\n<p>V\u00f5ite minna veelgi kaugemale ja kirjutada otsuste puu t\u00e4ielikult skriptikeeles. See on kood, mis koosneb rangelt programmeeritud tingimuslausete p\u00f5hjal, kuid need on v\u00e4liste skriptifailide sees, mis t\u00e4hendab, et neid saab muuta ilma kogu programmi uuesti kompileerimata. Tihti saab skriptifaili muuta otse m\u00e4ngu ajal, et kiiresti testida erinevaid teid AI reageerimist.<\/p>\n<h3>Olenemised s\u00fcndmustele<\/h3>\n<p>\n\u00dclaltoodud n\u00e4ited sobivad ideaalselt Pongile. Need k\u00e4ivitavad pidevalt Sense\/Think\/Act ts\u00fckli ja tegutsevad viimase maailma seisundi p\u00f5hjal. Kuid keerukamates m\u00e4ngudes tuleb reageerida \u00fcksikutele s\u00fcndmustele, mitte hinnata k\u00f5ike korraga. Pong ei ole sellisel juhul enam hea n\u00e4ide. Vaatame midagi muud. <\/p>\n<p>Kujutage ette tulistamism\u00e4ngu, kus vaenlased on liikumatud seni, kuni nad avastavad m\u00e4ngija, p\u00e4rast mida nad tegutsevad vastavalt oma 'spetsialiseerumisele': keegi jookseb 'rushing' peale, keegi r\u00fcndab kaugelt. See on endiselt p\u00f5hine reageerimise s\u00fcsteem \u2014 'kui m\u00e4ngija on n\u00e4htud, siis tee midagi', \u2014 kuid seda saab loogiliselt jagada s\u00fcndmuseks M\u00e4ngija N\u00e4hud (Player Seen) ja reaktsiooniks (valige vastus ja teostage see).<\/p>\n<p>See tagasi meid Sense\/Think\/Act ts\u00fcklisse. Me saame kirjutada Sense-osa, mis iga kaadri jaoks kontrollib \u2014 kas AI n\u00e4eb m\u00e4ngijat. Kui ei, siis ei juhtu midagi, aga kui n\u00e4eb, siis luuakse s\u00fcndmus Player Seen. Koodil on eraldi jaotis, kus on kirjas: \u201ekui toimub s\u00fcndmus Player Seen, tee\u201d, kus \u2014 vastus, mida vajate Tellimise ja Tegevuse osadele viitamiseks. Nii seadistate reaktsioonid s\u00fcndmusele Player Seen: \u201er\u00fcndava\u201d karakteri puhul \u2014 ChargeAndAttack, ja sniperi puhul \u2014 HideAndSnipe. Need seosed saab luua andmefailis kiireks redigeerimiseks ilma vajaduseta uuesti kompileerida. Ja siin saab kasutada ka skriptikeelt.<\/p>\n<h2>Kohakohaste otsuste vastuv\u00f5tmine<\/h2>\n<p>\nKuigi lihtsad reaktsioonis\u00fcsteemid on v\u00e4ga t\u00f5husad, on palju olukordi, kus need ei piisa. M\u00f5nikord on vaja teha erinevaid otsuseid, mis p\u00f5hinevad sellel, mida agent praegu teeb, kuid nende esitamine tingimustena on keeruline. M\u00f5nikord on liiga palju tingimusi, et neid t\u00f5husalt otsustepuudel v\u00f5i skriptides esitada. M\u00f5nikord on oluline eelnevalt hinnata, kuidas olukord muutub, enne j\u00e4rgmise sammu jaoks otsuse tegemist. Nende probleemide lahendamiseks on vajalikud keerukamad l\u00e4henemisviisid.<\/p>\n<h3>L\u00f5plik olekumasin<\/h3>\n<p>\nL\u00f5plik olekumasin ehk FSM (l\u00f5plik automaat) on viis \u00f6elda, et meie agent on praegu \u00fches mitmest v\u00f5imalikust olekust ning et ta v\u00f5ib liikuda \u00fchest olekust teise. Sellega on m\u00e4\u00e4ratud kindel hulk olekuid \u2014 seet\u00f5ttu ka nimi. Parim n\u00e4ide igap\u00e4evaelust on liiklusfoor. Erinevates kohtades on erinevad tulede j\u00e4rjestused, kuid p\u00f5him\u00f5te on sama \u2014 iga olek esindab midagi (seisa, mine jne). Liiklusfoor on igal ajal ainult \u00fches olekus ja liigub \u00fchelt teisele lihtsate reeglite alusel.<\/p>\n<p>NPC-de m\u00e4ngudes on sarnane lugu. V\u00f5tame n\u00e4iteks patrulli, millel on j\u00e4rgmised seisundid:<\/p>\n<ul>\n<li>Patrullimine (Patrolling).<\/li>\n<li>R\u00fcndamine (Attacking).<\/li>\n<li>P\u00f5genemine (Fleeing).<\/li>\n<\/ul>\n<p>\nJa selliste tingimustega, et muuta tema seisundit:<\/p>\n<ul>\n<li>Kui patrull n\u00e4eb vaenlast, r\u00fcndab ta.<\/li>\n<li>Kui patrull r\u00fcndab, kuid enam ei n\u00e4e vaenlast, naaseb ta patrullimise juurde.<\/li>\n<li>Kui patrull r\u00fcndab, aga on t\u00f5siselt haavatud, p\u00f5geneb ta.<\/li>\n<\/ul>\n<p>\nSamuti saab kirjutada if-k\u00e4sklusi, kasutades patrulli seisundi muutujat ja erinevaid kontrolle: kas vaenlane on l\u00e4heduses, mis on NPC tervise tase jne. Lisa veel m\u00f5ned seisundid:<\/p>\n<ul>\n<li>Mugavolek (Idling) \u2014 patrullide vahel.<\/li>\n<li>Otsing (Searching) \u2014 kui n\u00e4htud vaenlane on kadunud.<\/li>\n<li>Abi palumine (Finding Help) \u2014 kui vaenlane on n\u00e4htud, aga liiga tugev, et \u00fcksi temaga v\u00f5idelda.<\/li>\n<\/ul>\n<p>\nIga\u00fche valik on piiratud \u2014 n\u00e4iteks ei l\u00e4he patrull otsima varjunud vaenlast, kui tal on madal tervis.<\/p>\n<p>L&otilde;ppkokkuv&otilde;ttes v&otilde;ib tohutu &quot;kui... siis&quot; nimekiri muutuda liiga mahukaks, seet&otilde;ttu tuleks formaliseerida meetod, mis aitab meil meeles pidada olekuid ja &uuml;leminekuid nende vahel. Selleks v&otilde;tame arvesse k&otilde;ik olekud ja iga oleku puhul kirjutame &uuml;les k&otilde;ik &uuml;leminekud teistesse olekutesse koos nende jaoks vajalike tingimustega. &lt;x \u0438 y, \u043d\u043e \u043d\u0435 z&gt;, siis &lt;p&gt;&raquo;, v&otilde;ib muutuda liiga keeruliseks, seega tuleks v&auml;lja t&ouml;&ouml;tada meetod, mis aitab meil meeles pidada olekuid ja &uuml;leminekuid nende vahel. Selleks arvestame k&otilde;iki olekuid ja iga oleku alla koostame nimekirja k&otilde;ikidest &uuml;leminekutest teistesse olekutesse koos nende jaoks vajalikud tingimustega.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/ba4c401aa20de3d22d2478cba5a4b1ec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on seisundite \u00fcleminekute tabel \u2014 kompleksne viis FSM-i esitlemiseks. Joonistame diagrammi ja saame t\u00e4ieliku \u00fclevaate sellest, kuidas NPC k\u00e4itumine muutub.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/b4182359983cf573872dacc575af13dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDiagramm illustreerib otsuste langetamise olemust selle agendi jaoks, tuginedes praegusele olukorrale. Iga nool n\u00e4itab \u00fcleminekuid olekute vahel, kui k\u00f5rval olev tingimus on t\u00f5ene.<\/p>\n<p>Iga uuendusega kontrollime agendi praegust olekut, vaatame \u00fcleminekute nimekirja ja kui \u00fclemineku tingimused on t\u00e4idetud, v\u00f5tab ta uue oleku. N\u00e4iteks kontrollitakse igal kaadril, kas 10-sekundiline timer on aegunud, ja kui jah, siis liigub strahh olekust Idling olekusse Patrolling. Samamoodi kontrollib olek Attacking agendi tervist \u2014 kui see on madal, siis liigub ta olekusse Fleeing.<\/p>\n<p>See on \u00fcleminekute t\u00f6\u00f6tlemine olekute vahel, aga kuidas on lood k\u00e4itumisega, mis on seotud nende endi olekute talitustega? Mis puudutab konkreetse oleku tegelikku k\u00e4itumise rakendamist, siis tavaliselt on olemas kaks t\u00fc\u00fcpi 'konksu', kus me seome tegevused FSM-iga:<\/p>\n<ul>\n<li>Tegevused, mida me praeguses olekus perioodiliselt teeme.<\/li>\n<li>Tegevused, mida me teeme, kui liigume \u00fchest olekust teise.<\/li>\n<\/ul>\n<p>\nEsimene t\u00fc\u00fcp. Patrolling olek liigub iga raami jooksul agendi patrullmarsruuti. Attacking olek p\u00fc\u00fcab iga raami jooksul alustada r\u00fcnnakut v\u00f5i minna olekusse, kui see on v\u00f5imalik.<\/p>\n<p>Teise t\u00fc\u00fcbi puhul vaatame \u00fcleminekute avaldust: \u201ekui vaenlane on n\u00e4htav ja vaenlane on liiga tugev, siis mine olekusse Finding Help.\u201d Agent peab valima, kuhu abi minna ning salvestama selle teabe, et olek Finding Help teaks, kuhu p\u00f6\u00f6rduda. Kui abi on leitud, naaseb agent tagasi olekusse Attacking. Sellel hetkel soovib ta teavitada liitlast ohust, seega v\u00f5ib tekkida tegevus NotifyFriendOfThreat.<\/p>\n<p>J\u00e4llegi saame seda s\u00fcsteemi vaadata Sense\/Think\/Act ts\u00fckli kaudu. Sense v\u00e4ljendub andmetes, mida kasutatakse \u00fcleminekuloogikas. Think \u2014 \u00fcleminekutes, mis on saadaval igas olekus. Ja Act toimub tegevustega, mis aset leiavad regulaarselt oleku piires v\u00f5i olekute vahel \u00fcleminekute ajal.<\/p>\n<p>M\u00f5nikord v\u00f5ib pidev \u00fclemineku tingimuste k\u00fcsitlemine olla kulukas. N\u00e4iteks, kui iga agent teostab keerulisi arvutusi igas kaadris, et m\u00e4\u00e4rata, kas ta n\u00e4eb vaenlasi ja aru saada, kas liikuda Patrolling olekust Attacking olekusse \u2014 v\u00f5tab see palju protsessoriaega. <\/p>\n<p>Olulisi muutusi maailma seisundis v\u00f5ib k\u00e4sitleda s\u00fcndmustena, mida t\u00f6\u00f6deldakse nende ilmumise ajal. Selle asemel, et FSM igas kaadris kontrolliks \u00fclemineku tingimust 'kas mu agent n\u00e4eb m\u00e4ngijat?', saab seadistada eraldi s\u00fcsteemi, et teostada kontrolle harvemini (n\u00e4iteks 5 korda sekundis). Tulemuseks on Player Seen, kui kontroll l\u00e4bib. <\/p>\n<p>See edastatakse FSM-ile, mis peab n\u00fc\u00fcd \u00fclemineku tingimuseks Player Seen s\u00fcndmuse saamise ja vastavalt reageerima. L\u00f5ppk\u00e4itumine on sama, v\u00e4lja arvatud peaaegu m\u00e4rkamatu viivitus enne vastust. Kuid n\u00fc\u00fcd on j\u00f5udlus parem, kuna osa Sense'ist on eraldatud eraldi programmiosaks.<\/p>\n<h3>Hierarchical finite state machine<\/h3>\n<p>\nKuid t\u00f6\u00f6tamine suurte FSM-idega ei ole alati mugav. Kui soovime r\u00fcnnakuseisundit laiendada, asendades selle eraldi MeleeAttacking (l\u00e4hedane r\u00fcnnak) ja RangedAttacking (kaug r\u00fcnnak), peame muutma \u00fcleminekud k\u00f5igist teistest seisunditest, mis viivad r\u00fcnnakuseisundisse (nii praegused kui tulevased).<\/p>\n<p>Olete kindlasti m\u00e4rganud, et meie n\u00e4ITES on palju dubleeritud \u00fcleminekuid. Enamiku \u00fcleminekud seisu Idling on identsed \u00fcleminekud seisu Patrolling. Hea oleks mitte korduda, eriti kui lisame rohkem sarnaseid seisundeid. On m\u00f5istlik r\u00fchmitada Idling ja Patrolling \u00fchise sildi \u201emitte-kerged\u201d alla, kus on vaid \u00fcks \u00fchine \u00fcleminekute kogum lahingu seisunditesse. Kui me kujutame seda sildi kui staatust, siis Idling ja Patrolling saavad alam-seisunditeks. N\u00e4ide eraldi \u00fcleminekute tabeli kasutamisest uue mitte-kerge alam-seisundi jaoks:<\/p>\n<p><i>P\u00f5hiseisundid:<\/i><br \/>\n<img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/d86dd918acbe81b9bf22c2fb34aecee3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<i>V\u00e4ljas olek:<\/i><br \/>\n<img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/9d5bc2053010a32c5f68d7f0192c04ed.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa diagrammi kujul:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/0ccf95ecafa9ce2a6ea5b5b9833ddc4f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on sama s\u00fcsteem, kuid uue mittev\u00f5itlusliku olekuga, mis sisaldab Idling ja Patrolling. Iga olekuga on seotud FSM (l\u00f5ppm\u00f5ju automaat), millel on alamolekud (ja need alamolekud sisaldavad omakorda oma FSM-e \u2014 niikaua kui teil on vaja), saame Hierarchical Finite State Machine ehk HFSM (hierarhiline l\u00f5ppautomaat). \u00dchtlustades mittev\u00f5itluslikku olekut, oleme pidevalt v\u00e4hendanud \u00fcleliigseid \u00fcleminekuid. Sama saame teha k\u00f5igi uute olekute puhul, millel on \u00fchised \u00fcleminekud. N\u00e4iteks kui tulevikus laiendame olekut Attacking olekute MeleeAttacking ja MissileAttacking juurde, siis need on alamolekud, mis \u00fcksteise vahel liiguvad s\u00f5ltuvalt vahemaa suurusest vaenlase ja ammunition'i olemasolu j\u00e4rgi. L\u00f5ppkokkuv\u00f5ttes saab keerulisi k\u00e4itumismudeleid ja alamk\u00e4itumismudeleid esitada minimaalsete dubleeritud \u00fcleminekute arvuga.<\/p>\n<h3>K\u00e4itumiste puu<\/h3>\n<p>\nHFSM-i abil saate keerulisi k\u00e4itumise kombinatsioone luua lihtsal viisil. Kuid on \u00fcks v\u00e4ike raskus, et otsuste tegemine \u00fclemineku reeglite kaudu on tihedalt seotud praeguse olekuga. Ja paljudes m\u00e4ngudes on see t\u00e4pselt see, mida vaja. Hoolikas seisundihierarhia kasutamine v\u00f5ib v\u00e4hendada \u00fcleminekute korduste arvu. Kuid m\u00f5nikord on vajalikud reeglid, mis toimivad s\u00f5ltumatult sellest, millisest seisundist oletate v\u00f5i mis kehtivad peaaegu igas seisundis. N\u00e4iteks kui agendi tervis langeb 25%-ni, soovite, et ta jookseks minema, olenemata sellest, kas ta on lahingus, jalutab v\u00f5i vestleb \u2014 peate selle tingimuse igasse olekusse lisama. Ja kui teie disainer soovib hiljem madala tervise piiri muuta 25%-lt 10%-le, peab sellega uuesti tegelema.<\/p>\n<p>Ideaaljuhul vajab see olukord s\u00fcsteemi, kus otsus \u201emillises olekus olla\u201d j\u00e4\u00e4b seisundite endi piiridest v\u00e4lja, et muudatusi saaks teha ainult \u00fches kohas ning ei peaks puutuma \u00fclemineku tingimustesse. Siin tulevad m\u00e4ngu k\u00e4itumispuud.<\/p>\n<p>On mitu viisi nende rakendamiseks, kuid sisu on k\u00f5igi puhul enam-v\u00e4hem sama ja sarnaneb otsusepuule: algoritm algab \u201ejuure\u201c s\u00f5lmest, puus on s\u00f5lmed, mis esindavad kas otsuseid v\u00f5i tegevusi. T\u00f5si, m\u00f5ned olulised erinevused on siiski olemas:<\/p>\n<ul>\n<li>N\u00fc\u00fcd tagastavad s\u00f5lmed \u00fche kolmest v\u00e4\u00e4rtusest: Succeeded (kui t\u00f6\u00f6 on tehtud), Failed (kui ei saa k\u00e4ivitada) v\u00f5i Running (kui see on endiselt k\u00e4imas ja pole l\u00f5plikku tulemust).<\/li>\n<li>Otsustuskohti, kus valida kahe alternatiivi vahel, enam pole. Selle asemel on olemas Decorator s\u00f5lmed, millel on \u00fcks alam-s\u00f5lm. Kui nad Successful, siis t\u00e4idavad nad oma ainukese alam-s\u00f5lme.<\/li>\n<li>Tegevusi teostavad s\u00f5lmed tagastavad v\u00e4\u00e4rtuse Running, et esindada teostatavaid tegevusi.<\/li>\n<\/ul>\n<p>\nSeda v\u00e4ikest s\u00f5lmede kogumit saab \u00fchendada, et luua suur hulk keerukaid k\u00e4itumismudeleid. Kujutlegem n\u00e4iteks eelneva mustri HFSM valveallikat k\u00e4itumispuuna:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/5eaa5c725e4ada8285f16f95bb206d53.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelle struktuuriga ei tohiks olla selget \u00fcleminekut olekute Idling\/Patrolling ja oleku Attacking v\u00f5i m\u00f5nede teiste vahel. Kui vaenlane on n\u00e4htav ja tegelase elu on madal, siis peatub t\u00e4itmine s\u00f5lmes Fleeing, s\u00f5ltumata sellest, millist s\u00f5lme ta varem t\u00e4itis \u2014 Patrolling, Idling, Attacking v\u00f5i m\u00f5ni muu.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/e1c1dcc2055174aa7cfa846364b1709a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00e4itumispuud on keerulised \u2014 neid on palju erinevaid koostamise viise, kuid \u00f5ige dekoratorite ja komposiit-s\u00f5lmede kombinatsiooni leidmine v\u00f5ib olla probleem. On ka k\u00fcsimusi selle kohta, kui sageli puu kontrollida \u2014 kas me soovime seda l\u00e4bida iga osa v\u00f5i ainult siis, kui \u00fcks tingimus muutub? Kuidas hoida s\u00f5lmedega seotud olekut \u2014 kuidas teada, kui oleme olnud olekus Idling 10 sekundi jooksul v\u00f5i kuidas teada, millised s\u00f5lmed viimasel korral t\u00e4ideti, et \u00f5igesti j\u00e4rjestust t\u00f6\u00f6delda?<\/p>\n<p>Just sellep\u00e4rast on olemas mitmeid teostusi. N\u00e4iteks m\u00f5nedes s\u00fcsteemides on dekoratoris\u00f5lmed asendatud sisseehitatud dekoratoritega. Need uuesti hindavad puu tingimuste muutumisel, aitavad s\u00f5lmedega liituda ja tagavad perioodilised uuendused.<\/p>\n<h3>Utility-p\u00f5hine s\u00fcsteem<\/h3>\n<p>\nM\u00f5nel m\u00e4ngul on mitmeid erinevaid mehhanisme. Soovitav on, et nad saaksid k\u00f5ik eelised lihtsatest ja \u00fchestest reeglitevahenditest, kuid see ei pea olema t\u00e4ieliku k\u00e4itumise puu kujul. Selle asemel, et omada selget valikute komplekti v\u00f5i v\u00f5imalike tegevuste puu, on lihtsam uurida k\u00f5iki tegevusi ja valida hetke k\u00f5ige sobivam.<\/p>\n<p>Kasulikkusele p\u00f5hinev s\u00fcsteem aitab selles osas. See on s\u00fcsteem, kus agendil on palju tegevusi ja ta valib ise, millist teostada, p\u00f5hinedes iga tegevuse suhteliselt kasulikusele. Siinjuures t\u00e4hendab kasulikkus meelevaldset m\u00f5\u00f5tu, kuiv\u00f5rd oluline v\u00f5i soovitav on selle tegevuse teostamine agendi jaoks. <\/p>\n<p>Arvestatud tegevuse kasulikkust praeguse oleku ja keskkonna p\u00f5hjal saab agent igal ajal kontrollida ja valida sobivama teise oleku. See sarnaneb FSM-iga, v\u00e4lja arvatud see, et \u00fcleminekud m\u00e4\u00e4ratakse iga potentsiaalse oleku, sealhulgas praeguse, hindamise j\u00e4rgi. P\u00f6\u00f6rake t\u00e4helepanu sellele, et valime \u00fcleminekuks k\u00f5ige kasulikuma tegevuse (v\u00f5i j\u00e4\u00e4me paigale, kui oleme juba selle teinud). Suurema mitmekesisuse jaoks v\u00f5ib see olla kaalutud, kuid juhuslik valik v\u00e4iksemast nimekirjast.<\/p>\n<p>S\u00fcsteem m\u00e4\u00e4rab suvalise kasulikkuse v\u00e4\u00e4rtuste vahemiku \u2014 n\u00e4iteks vahemikus 0 (t\u00e4iesti ebasoovitav) kuni 100 (t\u00e4iesti soovitav). Igal tegevusel on mitmed parameetrid, mis m\u00f5jutavad selle v\u00e4\u00e4rtuse arvutamist. Tagasi meie n\u00e4ite juurde valvuri kohta:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/085fb2c197bde93d78455d18e63c9c25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTegevuste vahelised \u00fcleminekud on mitmeti m\u00f5istetavad \u2014 \u00fckski olek ei saa j\u00e4rgneda ainult teisele. Tegevuste prioriteedid tulenevad tagastatavast kasulikkusest. Kui vaenlane on n\u00e4htav, tugev ja tegelase elu on madal, siis nii p\u00f5genemine kui ka abi leidmine annavad k\u00f5rgeid mitte-null v\u00e4\u00e4rtusi. Samas on abi leidmine alati k\u00f5rgem. Samuti ei anna mitte-eri tegevused kunagi rohkem kui 50, seega j\u00e4\u00e4vad need alati madalamale kui lahingu tegevused. Seda tuleb arvestada tegevuste loomisel ja nende kasulikkuse arvutamisel.<\/p>\n<p>Meie n\u00e4ites tagastavad toimingud kas fikseeritud v\u00e4\u00e4rtuse v\u00f5i \u00fche kahest fikseeritud v\u00e4\u00e4rtusest. Realistlikum s\u00fcsteem eeldab, et hindamine toimub pidevas v\u00e4\u00e4rtuste vahemikus. N\u00e4iteks, kui agent on madala eluj\u00f5u tasemega, tagastab toiming \u201eP\u00f5genemine\u201d k\u00f5rgema kasulikkuse v\u00e4\u00e4rtuse, samas kui toiming \u201eR\u00fcndamine\u201d tagastab madalama, kui vaenlane on liiga tugev. Seet\u00f5ttu on toimingul \u201eP\u00f5genemine\u201d prioriteet toimingu \u201eR\u00fcndamine\u201d \u00fcle igas olukorras, kus agent tunneb, et tal ei ole piisavalt eluj\u00f5udu vastase v\u00f5itmiseks. See v\u00f5imaldab muuta toimingute prioriteete, tuginedes mistahes kriteeriumitele, muutes l\u00e4henemise paindlikumaks ja varieeruvamaks kui k\u00e4itumise puu v\u00f5i FSM.<\/p>\n<p>Iga tegevus sisaldab paljusid tingimusi programmi arvutamiseks. Neid saab kirjutada skriptikeeles v\u00f5i matemaatiliste valemite seeriana. The Sims, mis modelleerib tegelase p\u00e4evakava, lisab t\u00e4iendava arvutustaseme \u2014 agent saab rea \"motivatsioone\", mis m\u00f5jutavad kasulikkuse hinnanguid. Kui tegelane on n\u00e4ljane, siis aja jooksul muutub ta n\u00e4ljasemaks, ja EatFood tegevuse kasulikkuse tulemus t\u00f5useb, kuni tegelane teeb selle, v\u00e4hendades n\u00e4lga ja naastes EatFood v\u00e4\u00e4rtusega null. <\/p>\n<p>Tegevuste valimise idee p\u00f5hineb hinna s\u00fcsteemil, seega saab Utility-based s\u00fcsteemi kasutada AI otsustusprotsessides osana, mitte nende t\u00e4ieliku asendusena. Otsustuspuu v\u00f5ib k\u00fcsida kahe alam\u00f5le otsuse kasulikkuse hindamist ja valida k\u00f5rgema. Samamoodi v\u00f5ib k\u00e4itumispuu sisaldada komposiitnode Utility, et hinnata tegevuste kasulikkust, et otsustada, millist alamelementi t\u00e4ita.<\/p>\n<h2>Liikumine ja navigeerimine<\/h2>\n<p>\nEelmistes n\u00e4idetes oli meil platvorm, mida me liigutame vasakule v\u00f5i paremale, ja valvuri, kes patrullib v\u00f5i r\u00fcndab. Kuid kuidas me t\u00e4pselt k\u00e4sitleme agendi liikumist teatava aja jooksul? Kuidas me m\u00e4\u00e4rame kiirus, kuidas me takistusi v\u00e4ltime ja kuidas me marsruuti planeerime, kui sihtkohta j\u00f5udmine on keerulisem kui lihtsalt sirgjooneliselt liikuda? Vaatame sellele l\u00e4hemalt.<\/p>\n<h3>Halduse<\/h3>\n<p>\nAlguses eeldame, et igal agendil on kiirus, mis h\u00f5lmab, kui kiiresti ta liigub ja mis suunas. Seda saab m\u00f5\u00f5ta meetrites sekundis, kilomeetrites tunnis, pikseldes sekundis jne. Meeles pidades tunnustamine \/ M\u00f5tle \/ Toimi ts\u00fcklit, v\u00f5ime ette kujutada, et osa m\u00f5tlemisest valib kiirus ja osa tegevusest rakendab seda kiirusest agenti. M\u00e4ngudes on tavaliselt f\u00fc\u00fcsikas\u00fcsteem, mis teeb selle \u00fclesande teie eest, uurides iga objekti kiirusv\u00e4\u00e4rtust ja reguleerides seda. Seet\u00f5ttu v\u00f5ib j\u00e4tta AI-le \u00fche \u00fclesande \u2014 otsustada, kui kiiresti agent peab olema. Kui on teada, kus agent peab olema, tuleb see liikuda \u00f5iges suunas m\u00e4\u00e4ratud kiirusel. V\u00e4ga triviaalne v\u00f5rrand:<\/p>\n<p><i>desired_travel = destination_position \u2013 agent_position<\/i><\/p>\n<p>Kujutage ette 2D maailma. Agend asub punktis (-2,-2), sihtkoht asub kuskil kirdes punktis (30, 20), ning vajalik tee agendi j\u00f5udmiseks sinna on (32, 22). Eeldame, et need positsioonid on m\u00f5\u00f5detud meetrites \u2014 kui v\u00f5tta agendi kiirus 5 meetrit sekundis, siis me skaleerime meie liikumisvektori ja saame kiirusena umbes (4.12, 2.83). Nende parameetritega j\u00f5uaks agent sihtkohta peaaegu 8 sekundi p\u00e4rast.<\/p>\n<p>V\u00e4\u00e4rtusi saab igal ajal uuesti arvutada. Kui agent oleks sihtpunkti poole poolel teel, oleks liikumine poole pikem, kuid kuna agendi maksimaalne kiirus on 5 m\/s (nagu me eespool otsustasime), j\u00e4\u00e4b kiirus samaks. See kehtib ka liikuvate sihtide puhul, v\u00f5imaldades agendil teha v\u00e4ikeseid kohandusi nende liikumise ajal.<\/p>\n<p>Kuid me soovime rohkem variatiivsust \u2014 n\u00e4iteks, et kiirus kasvaks aeglaselt, simuleerides tegelast, kes liigub seismise seisundist jooksmisele. Sama saab teha ka enne peatumist. Need omadused on tuntud kui steering behaviours, millest iga\u00fchel on spetsiifilised nimed: Seek (otsimine), Flee (p\u00f5genemine), Arrival (saabumine) jne. Idee on selles, et kiirusj\u00f5ud v\u00f5ivad olla rakendatud agendi kiirusest, v\u00f5ttes aluseks agendi asendi ja praeguse kiiruse v\u00f5rdlemise sihtpunktiga, et kasutada erinevaid viise eesm\u00e4rgini j\u00f5udmiseks.<\/p>\n<p>Iga k\u00e4itumine omab veidi erinevat eesm\u00e4rki. Seek ja Arrival on viisid, kuidas agent liigub sihtkohta. Obstacle Avoidance (takistuste v\u00e4ltimine) ja Separation (eraldamine) kohandavad agendi liikumist, et v\u00e4ltida teel olevaid takistusi. Alignment (s\u00fcnkroniseerimine) ja Cohesion (sidusus) hoiavad agente koos liikumise ajal. Erinevaid steering behaviours (suunamisviise) saab kokku liita, et luua \u00fcks marsruut, arvestades k\u00f5iki tegureid. Agent, kes kasutab Arrival, Separation ja Obstacle Avoidance k\u00e4itumisi, et hoida eemale seintest ja teistest agentidest. See l\u00e4henemine t\u00f6\u00f6tab h\u00e4sti avatud paikades, kus ei ole liigseid detaile. <\/p>\n<p>Raskemates tingimustes erinevate k\u00e4itumiste liitmine t\u00f6\u00f6tab halvemini \u2014 n\u00e4iteks v\u00f5ib agent l\u00f5ksu j\u00e4\u00e4da seina, kuna Arrival ja Obstacle Avoidance konfliktimeetodid. Seet\u00f5ttu tuleks arvesse v\u00f5tta keerulisemaid variante kui lihtsalt k\u00f5igi v\u00e4\u00e4rtuste liitmine. \u00dcks v\u00f5imalus on see, et tulemuste liitmise asemel saab kaaluda liikumist erinevates suundades ja valida parim variant. <\/p>\n<p>Kuid keerulises keskkonnas, kus on ummikud ja on valik, millises suunas minna, vajame midagi veelgi arenenumat.<\/p>\n<h3>Teekonna leidmine<\/h3>\n<p>\nJuhitavad k\u00e4itumised sobivad suurep\u00e4raselt lihtsaks liikumiseks avatud maastikul (jalgpalliv\u00e4ljak v\u00f5i areen), kus A-st B-sse j\u00f5udmine on sirge tee v\u00e4ikeste k\u00f5rvalekaldumistega takistustest m\u00f6\u00f6da. Kompleksemate marsruutide jaoks on meil vaja teepunktide leidmist, mis on viis maailma uurimiseks ja marsruudi valimiseks selle kaudu.<\/p>\n<p>K\u00f5ige lihtsam viis on kanda ruudustik iga ruudu kohal, kus agent asub, ja hinnata, millised neist on liikumise jaoks lubatud. Kui m\u00f5ni neist on sihtkoht, siis liikuge sellest m\u00f6\u00f6da teed igast ruudust tagasi eelmise suunas, kuni j\u00f5uate algusesse. See on marsruut. Kui ei, korrake protsessi l\u00e4himates muudes ruutudes, kuni leiate sihtkoha v\u00f5i kui ruudud on otsa saanud (mis t\u00e4hendab, et ei ole v\u00f5imalikku marsruuti). Seda tuntakse ametlikult kui laiaulatuslikku otsingut v\u00f5i BFS (Breadth-First Search). Iga sammu korral vaatab see igas suunas (seega on see 'laius'). Otsinguruum sarnaneb lainete frontiga, mis liigub, kuni saavutab soovitud koha \u2014 otsinguala laieneb iga sammu kaupa, kuni see saavutab l\u00f5pp-punkti, p\u00e4rast mida saab trajektoori algusesse j\u00e4lgida.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/d367e62bc53033b05388538649853a41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTulemusena saate loendi ruutudest, mille kaudu koostatakse vajalik marsruut. See on teekond (seet\u00f5ttu 'pathfinding') \u2014 loetelu kohtadest, mida agent k\u00fclastab, liikudes sihtkohta.<\/p>\n<p>Arvestades, et me teame iga ruudu asukohta maailmas, on v\u00f5imalik kasutada steering behaviours'i, et liikuda m\u00f6\u00f6da teed \u2014 alates s\u00f5lmest 1 s\u00f5lmeni 2, seej\u00e4rel 2 s\u00f5lmest 3 ja nii edasi. Lihtsaim variant on liikuda j\u00e4rgmise ruudu keskpunkti suunas, kuid veel parem oleks peatuda praeguse ruudu ja j\u00e4rgmise vaheline \u00e4\u00e4r keskel. Sel viisil suudab agent teravaid nurki j\u00e4rsudel p\u00f6\u00f6rdel k\u00e4rpida.<\/p>\n<p>BFS-algoritmil on ka miinuseid \u2014 see uurib sama palju ruute 'vale' suunas kui '\u00f5ige'. Siit tuleb keerulisem algoritm, mida nimetatakse A* (A star). See t\u00f6\u00f6tab samuti, kuid selle asemel, et irratiivselt uurida naaberruute (seej\u00e4rel naabrid naabritele jne), kogub see s\u00f5lmed listi ja sorteerib need nii, et j\u00e4rgmiseks uurimiseks on alati s\u00f5lm, mis viib l\u00fchimale marsruudile. S\u00f5lmi sorteeritakse heuristika alusel, mis arvestab kahte asja \u2014 'kulude' h\u00fcpoteetilist marsruuti soovitud ruuduni (sealhulgas k\u00f5ik liikumiskulud) ja hindamist, kui kaugel see ruut sihtkohast on (suunates otsingut \u00f5igesse suunda).<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/1cab4f53fa5af6b31d352c7bcf453d7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelles n\u00e4ites uurib agent ruute \u00fckshaaval, valides iga kord naaberi, mis n\u00e4ib k\u00f5ige lootustandvam. Saadud tee on sama nagu BFS-i puhul, kuid protsessi k\u00e4igus on kaalutud v\u00e4hem ruute \u2014 see on m\u00e4ngu j\u00f5udluse jaoks v\u00e4ga oluline.<\/p>\n<h3>Liikumine ilma ruudustikuta<\/h3>\n<p>\nKuid enamik m\u00e4nge ei p\u00f5hine ruudustikul, ja tihti ei saa seda realistlikkuse nimel \u00e4ra teha. Vajalikud on kompromissid. Millised peaksid olema ruutude m\u00f5\u00f5tmed? Kui need on liiga suured, ei suuda nad korralikult n\u00e4idata v\u00e4ikeseid koridore v\u00f5i p\u00f6\u00f6rdeid, ja kui nad on liiga v\u00e4iksed, on otsimiseks liiga palju ruute, mis l\u00f5puks aega raiskab.<\/p>\n<p>Esimene asi, mida m\u00f5ista, on see, et v\u00f5rk annab meile seotud s\u00f5lmede graafi. A* ja BFS algoritmid t\u00f6\u00f6tavad tegelikult graafidel ega hooli meie v\u00f5rgust \u00fcldse. Me v\u00f5ime paigutada s\u00f5lmed m\u00e4ngumaailma mistahes kohtadesse: kui kahe seotud s\u00f5lme vahel on \u00fchendus ning algus- ja l\u00f5pp-punkti vahel v\u00e4hemalt \u00fcks s\u00f5lm, t\u00f6\u00f6tab algoritm endiselt sama h\u00e4sti kui varem. Seda nimetatakse sageli teepunktide s\u00fcsteemiks, kuna iga s\u00f5lm esindab olulist positsiooni maailmas, mis v\u00f5ib olla osa igasugustest h\u00fcpoteetilistest teedest.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/d87e9d4bb2a2fc713d32abc158506eaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>N\u00e4ide 1: s\u00f5lm igas ruudus. Otsing algab s\u00f5lmest, kus agent asub, ja l\u00f5peb soovitud ruudu s\u00f5lmes.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/b535a5db805efdc427d7c5724b866982.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>N\u00e4ide 2: v\u00e4iksem s\u00f5lmede kogum (teepunktid). Otsing algab ruudust, kus agent on, l\u00e4bib vajaliku arvu s\u00f5lmi ja j\u00e4tkub seej\u00e4rel sihtpunkti.<\/i><\/p>\n<p>See on \u00fcsna paindlik ja v\u00f5imas s\u00fcsteem. Kuid vajatakse teatud ettevaatust otsuste tegemisel, kus ja kuidas waypoint paigutada, vastasel juhul v\u00f5ivad agentid lihtsalt l\u00e4himat punkti mitte m\u00e4rgata ja oma teed alustada. Oluliselt lihtsam oleks, kui saaksime automaatselt teepunktid paigutada maailma geomeetria p\u00f5hjal.<\/p>\n<p>Siia tuleb navigeerimisv\u00f5rk ehk navmesh. See on tavaliselt 2D kolmnurkade v\u00f5rk, mis kantakse maailma geomeetriale \u2014 igal pool, kus agent on lubatud liikuda. Iga kolmnurk v\u00f5rgus muutub graafis s\u00f5lmpunktiks ja sellel on kuni kolm k\u00fclgnevat kolmnurka, mis muutuvad graafis naabers\u00f5lmedeks. <\/p>\n<p>See pilt on n\u00e4ide Unity mootorist \u2014 see anal\u00fc\u00fcsis maailma geomeetriat ja l\u00f5i navmeshi (halli sinise v\u00e4rviga ekraanipildil). Iga pol\u00fcgoon navmeshis on piirkond, kus agent saab seista v\u00f5i liikuda \u00fchest pol\u00fcgoonist teise. Antud n\u00e4ites on pol\u00fcgoonid v\u00e4iksemad kui korrused, millel nad asuvad \u2014 see on tehtud, et arvestada agendi suurusi, mis v\u00f5ivad \u00fcletada tema nimelisest asukohast v\u00e4ljapoole.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/845705ba7b9a9d469203aedf7942da41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSaame otsida marsruuti selle v\u00f5rgu kaudu, kasutades j\u00e4lle A* algoritmi. See annab meile peaaegu ideaalse marsruudi maailmas, mis arvestab kogu geomeetriaga ja samal ajal ei vaja \u00fclearuseid s\u00f5lmi ega teepunkte.<\/p>\n<p>Marsruudi leidmine on liiga ulatuslik teema, mille kohta ei piisa \u00fchest artikli jaost. Kui soovite seda p\u00f5hjalikumalt uurida, siis aitab teid <noindex><a rel=\"nofollow\" href=\"https:\/\/www.redblobgames.com\/pathfinding\/a-star\/introduction.html\">Amit Patel'i veebisait<\/a><\/noindex>.<\/p>\n<h2>Planeerimine<\/h2>\n<p>\nOleme leidnud, et marsruudi leidmine ei t\u00e4henda lihtsalt suuna valimist ja liikumist \u2014 peame valima marsruudi ja tegema mitu p\u00f6\u00f6rde, et j\u00f5uda soovitud sihtkohta. Saame selle idee kokku v\u00f5tta: eesm\u00e4rgi saavutamine ei ole lihtsalt j\u00e4rgmine samm, vaid terviklik jada, kus m\u00f5nikord on vajalik ette n\u00e4ha mitu sammu, et teada, milline peaks olema esimene. Seda nimetatakse planeerimiseks. Marsruudi leidmist v\u00f5ib pidada \u00fcheks planeerimise lisandiks. Meie Sense\/Think\/Act ts\u00fckli perspektiivist on see see, kus Think plaanib mitmeid tulevasi Act komponente.<\/p>\n<p>K\u00e4sitleme n\u00e4idet lauam\u00e4ngust Magic: The Gathering. Meie k\u00e4ik alustab selliste kaartidega k\u00e4es:<\/p>\n<ul>\n<li>Swamp \u2014 annab 1 musta mannat (maa kaart).<\/li>\n<li>Mets \u2014 annab 1 rohelise mana (maa kaart).<\/li>\n<li>P\u00f5genenud n\u00f5id \u2014 n\u00f5uab 1 sinist mana kutsumiseks.<\/li>\n<li>Elfide m\u00fcstik \u2014 n\u00f5uab 1 rohelist mana kutsumiseks.<\/li>\n<\/ul>\n<p>\nJ\u00e4tame viimased kolm kaarti t\u00e4helepanuta, et asjad lihtsamaks teha. Reeglite j\u00e4rgi on m\u00e4ngijal lubatud m\u00e4ngida 1 maa kaarti \u00fchel k\u00e4igul, ta v\u00f5ib selle kaardi 'tapida', et saada mana, ja siis kasutada loitse (sealhulgas olendi kutsumist) nii palju kui tuleb mana. Selles olukorras teab inimesest m\u00e4ngija, et peab m\u00e4ngima Mets, 'tapima' 1 rohelise mana ja siis kutsuma Elfide m\u00fcstiku. Kuid kuidas sellest m\u00e4ngu AI-le teada anda?<\/p>\n<h3>Lihtne planeerimine<\/h3>\n<p>\nTriviaalne l\u00e4henemine \u2014 proovida iga tegevust j\u00e4rjestikku, kuni sobivaid enam ei j\u00e4\u00e4. Kaartidele vaadates n\u00e4eb AI, et saab m\u00e4ngida Soost. Ja m\u00e4ngib selle. Kas sellel k\u00e4igul on veel muid tegevusi? Ta ei saa kutsuda ei Elfide m\u00fcstikut ega p\u00f5genenud n\u00f5ida, kuna nende kutsumiseks on vastavalt vajalikud roheline ja sinine mana, aga Soost annab ainult musta mana. Ja ta ei saa enam m\u00e4ngida Mets, kuna on juba m\u00e4nginud Soost. Seega m\u00e4ngis m\u00e4ngu AI reeglite j\u00e4rgi, kuid tegi seda halvasti. Seda saab parandada.<\/p>\n<p>Planeerimine v\u00f5ib leida loetelu tegevustest, mis viivad m\u00e4ngu soovitud olekusse. Nii nagu iga ruut teel omas naabreid (teede leidmine), on igal tegevusel plaanis samuti naabrid v\u00f5i j\u00e4rgijad. Me saame neid tegevusi ja j\u00e4rgmisi samme otsida, kuni saavutame soovitud oleku.<\/p>\n<p>Meie n\u00e4ites on soovitud tulemus \u201ekutsuda olend, kui see on v\u00f5imalik\u201c. K\u00e4igu alguses n\u00e4eme vaid kahte v\u00f5imalikku tegevust, mille m\u00e4ngureeglid lubavad:<\/p>\n<p><i>1. M\u00e4ngida Swamp (tulemus: Swamp m\u00e4ngus)<br \/>\n2. M\u00e4ngida Forest (tulemus: Forest m\u00e4ngus)<\/i><\/p>\n<p>Iga tehtud tegevus v\u00f5ib viia edasiste tegevusteni ja sulgeda teisi, uuesti m\u00e4ngureeglite kohaselt. Kujutage ette, et m\u00e4ngisime Swamp \u2014 see eemaldab Swamp j\u00e4rgmise sammuna (me oleme selle juba m\u00e4nginud), samuti eemaldab see Forest (sest reeglite j\u00e4rgi saab \u00fche m\u00e4ngimise k\u00e4igus m\u00e4ngida vaid \u00fche maakaardi). P\u00e4rast seda lisab AI j\u00e4rgmise sammu \u2014 1 musta mana saamine, kuna teisi v\u00f5imalusi pole. Kui ta j\u00e4tkab ja valib Tap the Swamp, siis saab ta 1 musta mana ja ei saa sellega midagi teha.<\/p>\n<p><i>1. M\u00e4ngida Swamp (tulemus: Swamp m\u00e4ngus)<br \/>\n 1.1 \u00abTap\u00bb Soost (tulemus: Soost \u00abtapped\u00bb, +1 musta maagi \u00fchik)<br \/>\n Ei ole saadaval tegevusi \u2013 L\u00d5PP<br \/>\n2. M\u00e4ngida Forest (tulemus: Forest m\u00e4ngus)<\/i><\/p>\n<p>Tegevuste nimekiri on l\u00fchike, oleme ummikusse j\u00f5udnud. Korrake protsessi j\u00e4rgmise tegevuse jaoks. Me m\u00e4ngime Mets, avame tegevuse \u201esaada 1 roheline maagi\u201c, mis omakorda avab kolmanda tegevuse \u2014 Elvish Mystic'i kutse.<\/p>\n<p><i>1. M\u00e4ngida Swamp (tulemus: Swamp m\u00e4ngus)<br \/>\n 1.1 \u00abTap\u00bb Soost (tulemus: Soost \u00abtapped\u00bb, +1 musta maagi \u00fchik)<br \/>\n Ei ole saadaval tegevusi \u2013 L\u00d5PP<br \/>\n2. M\u00e4ngida Forest (tulemus: Forest m\u00e4ngus)<br \/>\n 2.1 \u00abTap\u00bb Mets (tulemus: Mets \u00abtapped\u00bb, +1 roheline maagi \u00fchik)<br \/>\n 2.1.1 Kutse Elvish Mystic (tulemus: Elvish Mystic m\u00e4ngus, -1 roheline maagi \u00fchik)<br \/>\n Ei ole saadaval tegevusi \u2013 L\u00d5PP<\/i><\/p>\n<p>L\u00f5puks oleme uurinud k\u00f5iki v\u00f5imalikke tegevusi ja leidnud plaani, mis kutsub olendi.<\/p>\n<p>See on v\u00e4ga lihtsustatud n\u00e4ide. Soovitav on valida parim v\u00f5imalik plaan, mitte lihtsalt miski, mis vastab m\u00f5ningatele kriteeriumidele. \u00dcldiselt saab potentsiaalseid plaane hinnata l\u00f5pptulemuse v\u00f5i nende t\u00e4itmisest saadava koguhinna p\u00f5hjal. V\u00f5ite endale teenida 1 punkti maakaartide m\u00e4ngimise eest ja 3 punkti olendi v\u00e4ljakutsumise eest. Soost m\u00e4ngimine oleks plaan, mis annab 1 punkti. Kuid Mets \u2192 Tap the Mets \u2192 Elvish Mystic'i v\u00e4ljakutsumine toob kohe 4 punkti. <\/p>\n<p>Nii toimib Magic: The Gathering'i planeerimine, kuid sama loogika kehtib ka teistes olukordades. N\u00e4iteks nihutada odavat, et vabastada ruumi elevandi k\u00e4iguks malet. V\u00f5i peituda seina taha, et XCOMis ohutult tulistada. \u00dcldiselt saite aru.<\/p>\n<h3>Parandatud planeerimine<\/h3>\n<p>\nM\u00f5nikord on liiga palju v\u00f5imalikke tegevusi, et kaaluda iga v\u00f5imalikku varianti. Tagasi tulles Magic: The Gathering'i n\u00e4itena: oletame, et m\u00e4ngus ja teil on k\u00e4es mitu maakaarti ja olendit \u2014 v\u00f5imalike kombinatsioonide arv v\u00f5ib olla k\u00fcmnete kaupa. Probleemi lahendamiseks on mitu v\u00f5imalust.<\/p>\n<p>Esimene meetod on backwards chaining (tagurpidi ahelate loomine). Selle asemel, et k\u00f5iki kombinatsioone l\u00e4bi t\u00f6\u00f6tada, on parem alustada l\u00f5pptulemusest ja proovida leida otsene marsruut. Selle asemel, et liikuda puu juurest konkreetse leheni, liigume vastupidises suunas \u2014 lehelt juure poole. See meetod on lihtsam ja kiirem.<\/p>\n<p>Kui vastasel on 1 elupunkt, saab leida plaani, et \"tekitada 1 v\u00f5i rohkem kahju\". Selle saavutamiseks tuleb t\u00e4ita mitu tingimust: <\/p>\n<p>1. Kahju v\u00f5ib tekitada loits \u2014 see peab olema k\u00e4es.<br \/>\n2. Loitsimise jaoks on vajalik mana.<br \/>\n3. Mana saamiseks tuleb m\u00e4ngida maakaart.<br \/>\n4. Maakaardi m\u00e4ngimiseks tuleb see olla k\u00e4es.<\/p>\n<p>Teine v\u00f5imalus on best-first search (parim esimene otsing). Selle asemel, et uurida k\u00f5iki teid, valime k\u00f5ige sobivama. Enamasti annab see meetod optimaalse plaani ilma liigsete otsingukuludeta. A* on parima esimese otsingu vorm \u2014 uurides k\u00f5ige lootustandvamaid marsruute algusest peale, v\u00f5ib see leida parima tee ilma vajaduseta kontrollida \u00fclej\u00e4\u00e4nud variante.<\/p>\n<p>\u00dcha populaarsem alternatiiv parim-eesotsas otsingule on Monte Carlo puuotsing. Selle asemel, et arvata, millised plaanid on parimad iga j\u00e4rgmise tegevuse valimisel, valib algoritm igal sammul juhuslikke j\u00e4reltulijaid, kuni j\u00f5uab l\u00f5puni (kui plaan viib v\u00f5iduni v\u00f5i kaotusele). Seej\u00e4rel kasutatakse l\u00f5pptulemust eelnevate valikute \u201ekaalu\u201c t\u00f5stmiseks v\u00f5i langetamiseks. Korrates seda protsessi mitu korda j\u00e4rjest, annab algoritm hea hinnangu, milline j\u00e4rgmine samm on parem, isegi kui olukord muutub (kui vastane astub samme, et m\u00e4ngijat takistada). <\/p>\n<p>M\u00e4ngude planeerimise narratiivis ei saa m\u00f6\u00f6da Goal-Oriented Action Planning'ust ehk GOAP'ist (sihtsuunatud tegevuste planeerimine). See on laialdaselt kasutatav ja arutatav meetod, kuid lisaks m\u00f5nele eristavale detailile on see p\u00f5him\u00f5tteliselt tagasikett, millest me varem r\u00e4\u00e4kisime. Kui \u00fclesanne on \u201eh\u00e4vitada m\u00e4ngija\u201c ja m\u00e4ngija on varjatud, v\u00f5ib plaan olla j\u00e4rgnev: h\u00e4vita granadiga \u2192 saa see k\u00e4tte \u2192 viska.<\/p>\n<p>Tavaliselt on mitmeid eesm\u00e4rke, millest iga\u00fchel on oma prioriteet. Kui k\u00f5rgeima prioriteediga eesm\u00e4rk ei ole t\u00e4idetav (kuna m\u00e4ngija ei ole n\u00e4htav, ei suuda \u00fckski tegevuste kombinatsioon luua plaani \"h\u00e4vitada m\u00e4ngijat\"), p\u00f6\u00f6rdub tehisintellekt madalama prioriteediga eesm\u00e4rkide juurde.<\/p>\n<h2>Koolitus ja kohandamine<\/h2>\n<p>\nOleme juba maininud, et m\u00e4ngu tehisintellekt ei kasuta tavaliselt masin\u00f5pet, kuna see ei sobi reaalajas agentide juhtimiseks. Kuid see ei t\u00e4henda, et sellest valdkonnast midagi laenata ei saa. Me tahame, et laskmism\u00e4ngus oleks vastane, kellelt saab \u00f5ppida. N\u00e4iteks teada parimad positsioonid kaardil. V\u00f5i maadlusm\u00e4ngus, kus vastane blokeeriks tihti kasutatavaid m\u00e4ngijate kombotehnikaid, motiveerides kasutama teisi. Seega v\u00f5ib masin\u00f5pe sellistes olukordades olla v\u00e4ga kasulik.<\/p>\n<h3>Statistika ja t\u00f5en\u00e4osused<\/h3>\n<p>\nEnne kui liigume keerukate n\u00e4idete juurde, arutame, kui kaugele me saame minna, tehes m\u00f5ned lihtsad m\u00f5\u00f5tmised ja kasutades neid otsuste tegemiseks. N\u00e4iteks reaalajas strateegia \u2014 kuidas saame m\u00e4\u00e4rata, kas m\u00e4ngija suudab m\u00e4ngu esimestel minutitel r\u00fcnnaku alustada ja millise kaitse selle vastu valmistada? Saame uurida m\u00e4ngija varasemaid kogemusi, et m\u00f5ista, milline v\u00f5ib olla tema tulevane reaktsioon. Alguses ei ole meil selliseid algandmeid, kuid me saame neid koguda \u2014 iga kord, kui IA m\u00e4ngib inimese vastu, saab ta registreerida esimese r\u00fcnnaku aja. P\u00e4rast mitmeid seansse saame keskmise aja, mille jooksul m\u00e4ngija tulevikus r\u00fcndab.<\/p>\n<p>Keskmiste v\u00e4\u00e4rtustega on aga probleem: kui m\u00e4ngija 20 korda \u201ekiirusest\u201d m\u00e4ngib ja 20 korda aeglaselt, siis vajalikud v\u00e4\u00e4rtused asuvad kuskil keskel, mis ei paku meile midagi kasulikku. \u00dcks lahendus on sisendandmete piiramine - saame arvesse v\u00f5tta viimased 20 juhtumit.<\/p>\n<p>Sarnast l\u00e4henemist kasutatakse teatud tegevuste t\u00f5en\u00e4osuse hindamisel, eeldades, et m\u00e4ngija varasemad eelistused j\u00e4\u00e4vad tulevikus samaks. Kui m\u00e4ngija r\u00fcndab meid viis korda tulepalliga, kaks korda v\u00e4lguga ja \u00fcks kord l\u00e4hiv\u00f5itlusena, on ilmselge, et ta eelistab tulepalli. Ekstrapoleerime ja n\u00e4eme erineva relvastuse kasutamise t\u00f5en\u00e4osust: tulepall=62,5%, v\u00e4lk=25% ja l\u00e4hiv\u00f5itlus=12,5%. Meie m\u00e4ngu AI peab valmistuma tule eest kaitsmiseks.<\/p>\n<p>Teine huvitav meetod on kasutada Naive Bayes Classifier (naivne Bayesi klassifikaator) suurte andmemahtude uurimiseks ja olukorra klassifitseerimiseks, et tehisintellekt saaks \u00f5igesti reageerida. Bayesi klassifikaatoreid tuntakse enim e-kirjade r\u00e4mpsposti filtrite kasutamise t\u00f5ttu. Need uurivad s\u00f5nu, v\u00f5rreldes neid varasemate esinemistega (kas r\u00e4mpspostis v\u00f5i mitte) ja teevad j\u00e4reldusi saabuvate kirjade kohta. Saame sama teha, isegi v\u00e4iksema sisendi hulgaga. K\u00f5ikide kasulike andmete p\u00f5hjal, mida tehisintellekt n\u00e4eb (n\u00e4iteks milliseid vaenulikke \u00fcksusi on loodud, milliseid loitse kasutatakse v\u00f5i milliseid tehnoloogiaid uuritakse) ja l\u00f5pptulemus (s\u00f5da v\u00f5i rahu, \u201er\u00fcndamine\u201d v\u00f5i kaitsmine jne) \u2014 valime tehisintellekti jaoks sobiva k\u00e4itumise.<\/p>\n<p>K\u00f5ik need \u00f5ppeviisid on piisavad, kuid soovitatav on kasutada neid testimise k\u00e4igus kogutud andmete p\u00f5hjal. Tehisintellekt \u00f5pib kohanduma erinevate strateegiatega, mida on kasutanud teie m\u00e4ngijate testijad. Tehisintellekt, mis kohandub m\u00e4ngijaga p\u00e4rast v\u00e4ljaandmist, v\u00f5ib muutuda liiga ettearvatavaks v\u00f5i vastupidi, liiga raskeks v\u00f5ita.<\/p>\n<h3>Kohandamine v\u00e4\u00e4rtuste p\u00f5hjal<\/h3>\n<p>\nArvestades meie m\u00e4ngumaailma ja reeglite t\u00e4itmist, saame muuta v\u00e4\u00e4rtuste kogumit, mis m\u00f5jutab otsuste tegemist, mitte lihtsalt kasutada sisendandmeid. Teeme nii:<\/p>\n<ul>\n<li>Lubame tehisintellektil koguda andmeid maailma seisundist ja olulistest s\u00fcndmustest m\u00e4ngu ajal (nagu \u00fclalpool kirjeldatud).<\/li>\n<li>Muudame m\u00f5ningaid olulisi v\u00e4\u00e4rtusi (value) nende andmete p\u00f5hjal.<\/li>\n<li>Rakendame oma otsuseid, mis p\u00f5hinevad nende v\u00e4\u00e4rtuste t\u00f6\u00f6tlemisel v\u00f5i hindamisel.<\/li>\n<\/ul>\n<p>\nN\u00e4iteks agent saab valida mitme toa vahel esmaklassilise tulistamism\u00e4ngu kaardil. Igal toal on oma value, mis m\u00e4\u00e4rab, kui soovitav see k\u00fclastamiseks on. Tehisintellekt valib juhuslikult, millisesse tuppa minna, l\u00e4htudes value'ist. Seej\u00e4rel m\u00e4letab agent, millises toas ta tapeti, ja v\u00e4hendab selle value't (t\u00f5en\u00e4osust, et ta sinna tagasi p\u00f6\u00f6rdub). Sama kehtib vastupidise olukorra puhul \u2014 kui agent h\u00e4vitab palju vastaseid, siis toa value suureneb.<\/p>\n<h3>Markovi mudel<\/h3>\n<p>\nKuidas oleks, kui kasutaksime kogutud andmeid prognoosimiseks? Kui m\u00e4rkida iga toa, kus n\u00e4eme m\u00e4ngijat teatud aja jooksul, siis oskame prognoosida, millisesse tuppa m\u00e4ngija v\u00f5ib minna. J\u00e4lgides ja salvestades m\u00e4ngija liikumisi tubades (values), saame neid ennustada.<\/p>\n<p>V\u00f5tame kolm tuba: punane, roheline ja sinine. Samuti vaatame t\u00e4helepanekuid, mida oleme kogunud m\u00e4ngu sessiooni j\u00e4lgimise k\u00e4igus:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/6e90a365b72a176c36c9a14213baaafc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nIga toa j\u00e4lgimise arv on peaaegu \u00fchesugune - kus luua hea peidupaik, me ikka veel ei tea. Statistika kogumist raskendab ka m\u00e4ngijate respawn, kes ilmuvad kaardil \u00fchtlaselt. Kuid andmed j\u00e4rgmise toa kohta, kuhu nad p\u00e4rast kaardile ilmumist sisenevad, on juba kasulikud.<\/p>\n<p>On n\u00e4ha, et roheline tuba meeldib m\u00e4ngijatele - enamus punase toa inimesi liigub sinna, kellest 50% j\u00e4\u00e4b sinna edasi. Sinine tuba on vastupidiselt eba\u00f5nnestunud, sinna peaaegu ei minda, aga kui minnakse, siis ei peeta seal kaua aega. <\/p>\n<p>Kuid andmed r\u00e4\u00e4givad meile midagi veel olulisemat \u2014 kui m\u00e4ngija viibib sinises toas, on j\u00e4rgmine tuba, kus me teda t\u00f5en\u00e4oliselt n\u00e4eme, punane, mitte roheline. Kuigi roheline tuba on populaarsem kui punane, muutub olukord sinises toas viibides. J\u00e4rgmine seisund (st tuba, kuhu m\u00e4ngija liigub) s\u00f5ltub eelnevast seisundist (st toast, kus m\u00e4ngija hetkel viibib). Seoste uuringu t\u00f5ttu saame teha t\u00e4psemaid prognoose, kui kui arvutaksime vaatlusandmeid iseseisvalt.<\/p>\n<p>Mine minevikus toimunud andmete p\u00f5hjal tuleviku seisundi ennustamist nimetatakse Markovi mudeliks (Markov model), ning selliseid n\u00e4iteid (tubadega) nimetatakse Markovi ahelateks. Kuna mudelid esindavad t\u00f5en\u00e4osust muutuste vahel j\u00e4rjestikustes seisundites, kuvatakse need visuaalselt FSM-ina, kus iga \u00fcleminekuga kaasneb t\u00f5en\u00e4osus. Varem oleme kasutanud FSM-i agendi k\u00e4itumisseisundi esitlemiseks, kuid see kontseptsioon laieneb k\u00f5ikidele seisunditele, olenemata sellest, kas need on seotud agendiga v\u00f5i mitte. Sellisel juhul esindavad seisundid tuba, kus agent viibib:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/edb32dff7a3298b19c3fa4d66f48e9f4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on lihtne variant suhtep\u00e4rase t\u00f5en\u00e4osuse muutuste esitlemiseks, andes AI-le v\u00f5imaluse ennustada j\u00e4rgmist seisundit. Saame ennustada mitmeid samme ette.<\/p>\n<p>Kui m\u00e4ngija on rohelises toas, on 50% t\u00f5en\u00e4osus, et ta j\u00e4\u00e4b sinna ka j\u00e4rgmisel vaatlusel. Aga kui suur on t\u00f5en\u00e4osus, et ta on seal isegi p\u00e4rast seda? On olemas mitte ainult t\u00f5en\u00e4osus, et m\u00e4ngija j\u00e4i rohelisse tuppa p\u00e4rast kahte vaatlust, vaid ka v\u00f5imalus, et ta lahkus ja tuli tagasi. Siin on uus tabel, mis arvestab uusi andmeid:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/f87afff68b066a879661e37f68654ae2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSellest n\u00e4htub, et t\u00f5en\u00e4osus n\u00e4ha m\u00e4ngijat rohelises toas p\u00e4rast kahte vaatlust on 51% \u2014 21%, et ta tuli punasest toast, 5% sellest, et m\u00e4ngija k\u00fclastab sinist tuba nende vahel, ja 25%, et m\u00e4ngija ei lahku \u00fcldse rohelisest toast.<\/p>\n<p>Tabel on lihtsalt visuaalne t\u00f6\u00f6riist - protseduur n\u00f5uab vaid t\u00f5en\u00e4osuste korrutamist igas etapis. See t\u00e4hendab, et saate vaadata kaugele tulevikku, \u00fche reservatsiooniga: me eeldame, et sisenemise v\u00f5imalus ruumi s\u00f5ltub t\u00e4ielikult praegusest ruumist. Seda nimetatakse Markovi omaduseks (Markov Property) - tulevane seisund s\u00f5ltub ainult olevikust. Kuid see ei ole 100% t\u00e4pne. M\u00e4ngijad v\u00f5ivad teha otsuseid s\u00f5ltuvalt muudest teguritest: tervise tasemest v\u00f5i muude laskemoona kogusest. Kuna me neid v\u00e4\u00e4rtusi ei fikseeri, on meie prognoosid v\u00e4hem t\u00e4psed.<\/p>\n<h3>N-Gramid<\/h3>\n<p>\nAga mis saab n\u00e4iteks n\u00e4itest v\u00f5itlusm\u00e4ngust ja m\u00e4ngija kombo-move ennustamisest? Sama asi! Kuid \u00fche seisundi v\u00f5i s\u00fcndmuse asemel uurime terveid j\u00e4rjestusi, millest kombo-l\u00f6\u00f6k koosneb.<\/p>\n<p>\u00dcks viis seda teha on salvestada iga sisend (nt Kick, Punch v\u00f5i Block) vahemuisti ja salvestada kogu vahem\u00e4lu \u00fche s\u00fcndmusena. Nii et m\u00e4ngija vajutab korduvalt Kick, Kick, Punch, et kasutada r\u00fcnnakut SuperDeathFist, AI s\u00fcsteem salvestab k\u00f5ik sisendid vahemuisti ja m\u00e4letab viimaseid kolme, mida kasutatakse igas etapis.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu tehisintellekti: algajatele m\u00f5eldud juhend\" src=\"\/wp-content\/uploads\/2019\/11\/9a95226ae155dca5e45a66d4440f3cd4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Rasv\u012bti r\u0101d\u012bjumi tiek par\u0101d\u012bti, kad sp\u0113l\u0113t\u0101js uzs\u0101k SuperDeathFist uzbrukumu.)<\/p>\n<p>M\u0101ksl\u012bgais intelekts redz\u0113s visas iesp\u0113jas, kad sp\u0113l\u0113t\u0101js izv\u0113las Kick, p\u0113c tam v\u0113l vienu Kick, un beig\u0101s paman\u012bs, ka n\u0101kamais ievads vienm\u0113r ir Punch. Tas \u013caus a\u0123entam prognoz\u0113t SuperDeathFist kombin\u0101cijas un blo\u0137\u0113t to, ja tas ir iesp\u0113jams.<\/p>\n<p>\u0160\u012bs notikumu sec\u012bbas sauc par N-gram\u0101m, kur N ir saglab\u0101to elementu skaits. Iepriek\u0161\u0113j\u0101 piem\u0113r\u0101 tas bija 3-grama (trigramma), kas noz\u012bm\u0113: pirm\u0101s divas ieraksti tiek izmantoti, lai prognoz\u0113tu tre\u0161o. T\u0101d\u0113j\u0101di 5-gram\u0101 pirmie \u010detri ieraksti paredz piekto un t\u0101 t\u0101l\u0101k.<\/p>\n<p>Izstr\u0101d\u0101t\u0101jam r\u016bp\u012bgi j\u0101izv\u0113las N-gramu izm\u0113rs. Maz\u0101ks N skaits prasa maz\u0101k atmi\u0146as, bet ar\u012b glab\u0101 maz\u0101ku v\u0113sturi. Piem\u0113ram, 2-grama (bigramma) pierakst\u012bs Kick, Kick vai Kick, Punch, bet nesp\u0113s uzglab\u0101t Kick, Kick, Punch, t\u0101d\u0113\u013c m\u0101ksl\u012bgais intelekts nerea\u0123\u0113s uz SuperDeathFist kombin\u0101ciju.<\/p>\n<p>Teiselt poolt n\u00f5uavad suured numbrid rohkem m\u00e4lu ning AI-l on keerulisem \u00f5ppida, kuna v\u00f5imalike variantide arv suureneb oluliselt. Kui teil oli kolm v\u00f5imalikku sisendit: Kick, Punch v\u00f5i Block, ja me kasutasime 10-grammi, siis saame umbes 60 tuhat erinevat varianti.<\/p>\n<p>Bigrammimudel on lihtne Markovi ahel \u2014 iga paar \"eelmine seisund\/praegune seisund\" on bigramm, ning saate ennustada teist seisundit esimese p\u00f5hjal. 3-grammid ja suuremad N-grammid v\u00f5ib samuti k\u00e4sitleda kui Markovi ahelaid, kus k\u00f5ik elemendid (v\u00e4lja arvatud viimane N-grammis) koos moodustavad esimese seisundi, ja viimane element \u2014 teise. N\u00e4ide v\u00f5itlusm\u00e4ngust n\u00e4itab \u00fclemineku v\u00f5imalust olukorrast Kick ja Kick olukorda Kick ja Punch. Vaadates mitmeid sisendi ajalugu kirjeid kui \u00fchtset \u00fcksust, muudame sisendisegu p\u00f5him\u00f5tteliselt osaks terviklikust seisundist. See annab meile Markovi omaduse, mis v\u00f5imaldab kasutada Markovi ahelaid j\u00e4rgmise sisendi ennustamiseks ja arvata, milline kombo k\u00e4ik j\u00e4rgmiseks tuleb.<\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nR\u00e4\u00e4kisime k\u00f5ige levinumatest t\u00f6\u00f6riistadest ja l\u00e4henemistest tehisintellekti arendamisel. Samuti vaatasime \u00fcle olukorrad, kus neid tuleks rakendada ja kus need eriti kasulikud on. <\/p>\n<p>Seda peaks olema piisavalt, et m\u00f5ista p\u00f5hiteemasid m\u00e4ngu tehisintellektis. Kuid see ei ole muidugi kaugeltki k\u00f5ik meetodid. V\u00e4hem tuntud, kuid mitte v\u00e4hem efektiivsed on:<\/p>\n<ul>\n<li>optimeerimisalgoritmid, sealhulgas m\u00e4est \u00fcles ronimine, gradientne allak\u00e4ik ja geneetilised algoritmid<\/li>\n<li>konkurentsi otsingu\/planeerimise algoritmid (minimax ja alfa-beeta k\u00e4rpimine)<\/li>\n<li>klassifitseerimismeetodid (perceptroonid, n\u00e4rviv\u00f5rgud ja tugivektorite masinad)<\/li>\n<li>agentide tajumise ja m\u00e4lu t\u00f6\u00f6tlemise s\u00fcsteemid<\/li>\n<li>tehisintellekti arhitektuuri l\u00e4henemised (h\u00fcbriids\u00fcsteemid, arhitektuuride alamhulged ja muud tehisintellekti s\u00fcsteemide \u00fclev\u00f5tmise viisid)<\/li>\n<li>animatsioonit\u00f6\u00f6riistad (liikumise planeerimine ja s\u00fcnkroniseerimine)<\/li>\n<li>toimefaktorid (detailide tase, anytime algoritmid ja timeslicing)<\/li>\n<\/ul>\n<p>\nTeemaga seotud Interneti-ressursid:<\/p>\n<p>1. GameDev.net-l on <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/articles\/programming\/artificial-intelligence\/\">osi artiklite ja \u00f5petustega tehisintellekti kohta<\/a><\/noindex>, samuti <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/forums\/forum\/6-artificial-intelligence\/\">projekti foorum,<\/a><\/noindex>.<br \/>\n2. <noindex><a rel=\"nofollow\" href=\"http:\/\/aigamedev.com\/\">AiGameDev.com<\/a><\/noindex> pakub palju esitlusi ja artikleid laia valiku m\u00e4ngu tehisintellekti arendamisega seotud teemadel.<br \/>\n3. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gdcvault.com\/\">GDC Vault<\/a><\/noindex> sisaldab GDC AI tippseminari teemasid, millest paljusid on tasuta saadaval.<br \/>\n4. Kasulikke materjale leiate ka veebisaidilt <noindex><a rel=\"nofollow\" href=\"http:\/\/gameai.com\/\">AI M\u00e4ngu Arendajate Gild<\/a><\/noindex>.<br \/>\n5. Tommy Thompson, tehisintellekti teadlane ja m\u00e4nguarendaja, teeb YouTube'i kanalis videoid <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/user\/tthompso\">AI ja M\u00e4ngud<\/a><\/noindex> selgitustega ja tehisintellekti uurimisega kommerts m\u00e4ngudes.<\/p>\n<p>Teemaga seotud raamatud:<\/p>\n<p>1. Game AI Pro raamatute seeria koosneb l\u00fchikesi artikleid sisaldavatest kogumikest, mis selgitavad, kuidas rakendada konkreetseid funktsioone v\u00f5i kuidas lahendada konkreetseid probleeme.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/go.gamedev.net\/?id=13722X707581&amp;xs=1&amp;isjs=1&amp;url=https%3A%2F%2Famzn.to%2F2KGoB8n&amp;xguid=f8ad586e5984991508efff4754027dbd&amp;xuuid=305451ecead59d76ca830fded0aab276&amp;xsessid=6ccb8b9fa3f10b478b65f7ed703a447b&amp;xcreo=0&amp;xed=0&amp;sref=https%3A%2F%2Fwww.gamedev.net%2Farticles%2Fprogramming%2Fartificial-intelligence%2Fthe-total-beginners-guide-to-game-ai-r4942%2F%3Fdo%3Dedit%26d%3D1%26id%3D4942%26csrfKey%3D7015c6d2c5c643e87baa74f8e5d2c094&amp;pref=https%3A%2F%2Fwww.gamedev.net%2Farticles%2Fprogramming%2Fartificial-intelligence%2Fthe-total-beginners-guide-to-game-ai-r4942%2F&amp;xtz=420&amp;jv=13.7.1&amp;bv=2.5.1\">Game AI Pro: Kogutud Tarkus M\u00e4ngu AI Professionaalidelt<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"http:\/\/go.gamedev.net\/?id=13722X707581&amp;xs=1&amp;isjs=1&amp;url=https%3A%2F%2Famzn.to%2F2KFKyoe&amp;xguid=f8ad586e5984991508efff4754027dbd&amp;xuuid=305451ecead59d76ca830fded0aab276&amp;xsessid=6ccb8b9fa3f10b478b65f7ed703a447b&amp;xcreo=0&amp;xed=0&amp;sref=https%3A%2F%2Fwww.gamedev.net%2Farticles%2Fprogramming%2Fartificial-intelligence%2Fthe-total-beginners-guide-to-game-ai-r4942%2F%3Fdo%3Dedit%26d%3D1%26id%3D4942%26csrfKey%3D7015c6d2c5c643e87baa74f8e5d2c094&amp;pref=https%3A%2F%2Fwww.gamedev.net%2Farticles%2Fprogramming%2Fartificial-intelligence%2Fthe-total-beginners-guide-to-game-ai-r4942%2F&amp;xtz=420&amp;jv=13.7.1&amp;bv=2.5.1\">Game AI Pro 2: Kogutud Tarkus M\u00e4ngu AI Professionaalidelt<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2KF4irS\">Game AI Pro 3: Kogutud Tarkus M\u00e4ngu AI Professionaalidelt<\/a><\/noindex><\/p>\n<p>2. AI M\u00e4ngu Programmeerimise Tarkuse seeria \u2014 eelk\u00e4ija Game AI Pro seeriale. Seal on vanemaid meetodeid, kuid peaaegu k\u00f5ik on t\u00e4nap\u00e4evani aktuaalsed.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2ARFhKx\">AI M\u00e4ngu Programmeerimise Tarkus 1<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2Mkv4eh\">AI M\u00e4ngu Programmeerimise Tarkus 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2nnuYEh\">AI M\u00e4ngu Programmeerimise Tarkus 3<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2ARFEEV\">AI M\u00e4ngu Programmeerimise Tarkus 4<\/a><\/noindex><\/p>\n<p>3. <noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2AWKuRh\">Tehisintellekt: Kaasaegne L\u00e4henemine<\/a><\/noindex> \u2014 on \u00fcks p\u00f5hiteoseid k\u00f5ikidele, kes soovivad m\u00f5ista tehisintellekti laiemat valdkonda. See raamat ei k\u00e4sitle m\u00e4ngu arendamist \u2014 see \u00f5petab tehisintellekti p\u00f5hialuseid.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/pixonic\/blog\/428892\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0435 \u0432 \u0438\u0433\u0440\u0430\u0445. \u0421 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 \u043f\u0440\u043e \u0418\u0418 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u0430 \u0435\u0449\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0435\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u0430\u043a, \u0433\u0434\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u2014 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c 35 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-52118","post","type-post","status-publish","format-standard","hentry","category-novosti-interneta"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/novosti-interneta\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0418\u0418: \u0433\u0430\u0439\u0434 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/novosti-interneta\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:59:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Kuidas luua m\u00e4ngu AI-d: algajatele m\u00f5eldud juhend | ProHoster","description":"J\u00f5udsin huvitava materjalini.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/novosti-interneta\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0418\u0418: \u0433\u0430\u0439\u0434 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 | ProHoster","og:description":"\u041d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431.","og:url":"https:\/\/prohoster.info\/et\/blog\/novosti-interneta\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T21:00:00+00:00","article:modified_time":"2020-02-18T10:59:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52118","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 02:32:21","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:49:49","updated":"2026-01-24 02:32:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/52118","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=52118"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/52118\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=52118"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=52118"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=52118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}