Išsamus vadovas, padedantis suprasti elgsenos medžius DI, nuo pagrindinių sąvokų ir komponentų iki praktinio pritaikymo žaidimuose, robotikoje ir kitur.
Dirbtinis intelektas: išsami elgsenos medžių analizė
Didžiuliame ir nuolat besikeičiančiame dirbtinio intelekto pasaulyje kūrėjai nuolat ieško galingų, lanksčių ir intuityvių įrankių. Nuo ne žaidėjų valdomų personažų (NPC), kurie apgyvendina mūsų mėgstamus vaizdo žaidimus, iki autonominių robotų, rūšiuojančių siuntas sandėlyje, sukurti įtikinamą ir efektyvią DI elgseną yra milžiniška užduotis. Nors egzistuoja daugybė technikų, viena iš jų tapo dominuojančia dėl savo elegancijos ir lankstumo: elgsenos medis (EM).
Jei kada nors žavėjotės žaidimo priešu, kuris protingai ieško priedangos, koordinuoja veiksmus su sąjungininkais ir keičia taktiką priklausomai nuo situacijos, tikėtina, kad matėte veikiantį elgsenos medį. Šiame straipsnyje pateikiamas išsamus elgsenos medžių tyrimas, pradedant nuo pagrindinių sąvokų ir baigiant pažangiomis programomis, skirtas pasaulinei kūrėjų, dizainerių ir DI entuziastų auditorijai.
Paprastesnių sistemų problema: kodėl mums reikalingi elgsenos medžiai
Norint įvertinti elgsenos medžių naujovę, naudinga suprasti, kas buvo anksčiau. Daugelį metų pagrindinis sprendimas paprastam DI buvo baigtinių būsenų automatas (BBA).
BBA susideda iš būsenų rinkinio (pvz., Patruliavimas, Vaikymasis, Puolimas) ir perėjimų tarp jų (pvz., jei „Priešas pastebėtas“, pereinama iš Patruliavimo į Vaikymąsi). Paprastam DI su keliomis skirtingomis elgsenomis BBA veikia gerai. Tačiau, didėjant sudėtingumui, jie greitai tampa nevaldomi.
- Mastelio keitimo problemos: Pridėjus naują būseną, pavyzdžiui, „Slėptis priedangoje“, gali tekti sukurti perėjimus iš visų kitų esamų būsenų. Tai veda prie to, ką kūrėjai vadina „spageti kodu“ – painaus jungčių tinklo, kurį sunku derinti ir plėsti.
- Moduliariškumo trūkumas: Elgsenos yra glaudžiai susijusios su būsenomis. Pakartotinai naudoti „Rasti amuniciją“ logiką skirtinguose scenarijuose yra sudėtinga, nedubliuojant kodo ir logikos.
- Standumas: BBA vienu metu visada yra vienoje ir tik vienoje būsenoje. Dėl to sunku modeliuoti niuansuotą ar daugiasluoksnę elgseną.
Elgsenos medžiai buvo sukurti būtent šioms problemoms spręsti, siūlant struktūrizuotesnį, modularesnį ir lankstesnį požiūrį į sudėtingų DI agentų kūrimą.
Kas yra elgsenos medis? Hierarchinis požiūris į DI
Iš esmės elgsenos medis yra hierarchinis mazgų medis, kontroliuojantis DI agento sprendimų priėmimo eigą. Pagalvokite apie tai kaip apie įmonės organizacinę schemą. Generalinis direktorius viršuje (šakninis mazgas) nevykdo kiekvienos užduoties; vietoj to, jis deleguoja vadovams (sudėtiniams mazgams), kurie savo ruožtu deleguoja darbuotojams, atliekantiems konkrečius darbus (lapų mazgams).
Medis vertinamas iš viršaus į apačią, pradedant nuo šaknies, paprastai kiekviename kadre arba atnaujinimo cikle. Šis procesas vadinamas „ciklu“ (angl. tick). Ciklo signalas sklinda žemyn medžiu, aktyvuodamas mazgus tam tikru keliu pagal taisyklių rinkinį. Kiekvienas mazgas, baigęs darbą, grąžina būseną savo tėviniam mazgui:
- SĖKMĖ (SUCCESS): Užduotis, kurią mazgas atstovauja, buvo sėkmingai įvykdyta.
- NESĖKMĖ (FAILURE): Užduoties nepavyko įvykdyti.
- VYKDOMA (RUNNING): Užduotis yra vykdoma ir reikalauja daugiau laiko (pvz., einama į tikslą).
Tėvinis mazgas naudoja šias būsenas, kad nuspręstų, kurį iš savo vaikų vykdyti toliau. Šis nuolatinis, iš viršaus į apačią vykstantis pervertinimas daro EM neįtikėtinai reaktyvius į besikeičiančias pasaulio sąlygas.
Pagrindiniai elgsenos medžio komponentai
Kiekvienas elgsenos medis yra sudarytas iš kelių pagrindinių tipų mazgų. Suprasti šiuos statybinius blokus yra raktas į sistemos įvaldymą.
1. Lapų mazgai: veiksmai ir sąlygos
Lapų mazgai yra medžio galiniai taškai – jie yra tikrieji darbininkai, kurie atlieka užduotis arba tikrina sąlygas. Jie neturi vaikų.
- Veiksmų mazgai: Šie mazgai vykdo veiksmą žaidimų pasaulyje. Jei veiksmas yra momentinis (pvz., ginklo iššovimas), jis gali nedelsiant grąžinti `SĖKMĖ`. Jei tai užtrunka (pvz., judėjimas į tašką), jis kiekvieną ciklą grąžins `VYKDOMA`, kol bus baigtas, ir tada grąžins `SĖKMĖ`. Pavyzdžiai: `JudėtiPriePriešo()`, `PaleistiAnimaciją("Ataka")`, `UžtaisytiGinklą()`.
- Sąlygų mazgai: Tai specialus lapų mazgo tipas, kuris tikrina pasaulio būseną jos nekeisdamas. Jie veikia kaip vartai medyje, grąžindami `SĖKMĖ`, jei sąlyga teisinga, ir `NESĖKMĖ`, jei ji klaidinga. Pavyzdžiai: `ArMažaiGyvybių?`, `ArPriešasMatomumoZonoje?`, `ArYraAmunicijos?`.
2. Sudėtiniai mazgai: valdymo srautas
Sudėtiniai mazgai yra medžio valdytojai. Jie turi vieną ar daugiau vaikų ir naudoja konkretų taisyklių rinkinį, kad nuspręstų, kurį vaiką vykdyti. Jie apibrėžia DI logiką ir prioritetus.
-
Sekvencijos mazgas: Dažnai vaizduojamas kaip rodyklė (→) arba žymimas „IR“. Sekvencija vykdo savo vaikus paeiliui, iš kairės į dešinę. Ji sustoja ir grąžina `NESĖKMĖ`, kai tik vienas iš jos vaikų patiria nesėkmę. Jei visi vaikai pavyksta, pati sekvencija grąžina `SĖKMĖ`. Tai naudojama kuriant užduočių seką, kuri turi būti atlikta tvarkingai.
Pavyzdys: `Užtaisymo` seka gali būti: Sekvencija( `ArYraAmunicijosInventoriuje?`, `PaleistiUžtaisymoAnimaciją()`, `AtnaujintiAmunicijosKiekį()` ). Jei agentas neturi amunicijos inventoriuje, pirmasis vaikas patiria nesėkmę ir visa seka nedelsiant nutraukiama.
-
Selektoriaus mazgas (arba Atsarginis mazgas): Dažnai vaizduojamas kaip klaustukas (?) arba žymimas „ARBA“. Selektorius taip pat vykdo savo vaikus paeiliui, iš kairės į dešinę. Tačiau jis sustoja ir grąžina `SĖKMĖ`, kai tik vienas iš jo vaikų pavyksta. Jei visi vaikai patiria nesėkmę, pats selektorius grąžina `NESĖKMĖ`. Tai naudojama kuriant atsarginę elgseną arba renkantis vieną veiksmą iš galimybių sąrašo.
Pavyzdys: `Kovos` selektorius galėtų būti: Selektorius( `AtliktiArtimosKovosAtaką()`, `AtliktiTolimosKovosAtaką()`, `Bėgti()` ). DI pirmiausia bandys atlikti artimos kovos ataką. Jei tai neįmanoma (pvz., taikinys per toli), ji patiria nesėkmę, ir selektorius pereina prie kito vaiko: tolimos kovos atakos. Jei ir tai nepavyksta (pvz., nėra amunicijos), pereinama prie paskutinės galimybės: bėgti.
-
Lygiagretus mazgas: Šis mazgas vykdo visus savo vaikus vienu metu. Jo paties sėkmė ar nesėkmė priklauso nuo nurodytos politikos. Pavyzdžiui, jis galėtų grąžinti `SĖKMĖ`, kai tik vienas vaikas pavyksta, arba laukti, kol pavyks visi vaikai. Tai naudinga vykdant pagrindinę užduotį ir tuo pačiu metu vykdant antrinę, stebėjimo užduotį.
Pavyzdys: `Patruliavimo` lygiagretus mazgas galėtų būti: Lygiagretus( `JudėtiPatruliavimoMaršrutu()`, `IeškotiPriešų()` ). DI eina savo keliu, nuolat skenuodamas aplinką.
3. Dekoratoriaus mazgai: modifikatoriai
Dekoratoriaus mazgai turi tik vieną vaiką ir yra naudojami modifikuoti to vaiko elgesį ar rezultatą. Jie prideda galingą valdymo ir logikos sluoksnį, neapkraudami medžio.
- Inverteris: Apverčia savo vaiko rezultatą. `SĖKMĖ` tampa `NESĖKME`, o `NESĖKMĖ` tampa `SĖKME`. `VYKDOMA` paprastai perduodama nepakeista. Tai puikiai tinka kuriant „jei ne“ logiką.
Pavyzdys: Inverteris( `ArPriešasMatomas?` ) sukurtų sąlygą, kuri pavyksta tik tada, kai priešas nėra matomas.
- Kartotuvas: Vykdo savo vaiką nurodytą skaičių kartų arba neribotai, kol vaikas patiria nesėkmę.
- Sėkmės / Nesėkmės mazgas: Visada grąžina atitinkamai `SĖKMĖ` arba `NESĖKMĖ`, nepriklausomai nuo to, ką grąžina jo vaikas. Tai naudinga, norint padaryti medžio šaką neprivalomą.
- Ribotuvas / Atvėsimo laikmatis: Apriboja, kaip dažnai galima vykdyti jo vaiką. Pavyzdžiui, `GranatosMetimo` veiksmas gali būti dekoruotas ribotuvu, siekiant užtikrinti, kad jį galima atlikti tik kartą per 10 sekundžių.
Viską sujungiant: praktinis pavyzdys
Sukurkime elgsenos medį paprastam priešo kareivio DI pirmojo asmens šaudyklės žaidime. Norima elgsena: kareivio svarbiausias prioritetas yra pulti žaidėją, jei jis matomas. Jei žaidėjas nematomas, kareivis turėtų patruliuoti nurodytoje teritorijoje. Jei kareivio gyvybės kovoje sumažėja, jis turėtų ieškoti priedangos.
Štai kaip galėtume struktūrizuoti šią logiką elgsenos medyje (skaitoma iš viršaus į apačią, įtraukos rodo hierarchiją):
Šaknis (Selektorius) |-- Pabėgimas esant mažai gyvybių (Sekvencija) | |-- ArMažaiGyvybių? (Sąlyga) | |-- RastiPriedangosTašką (Veiksmas) -> grąžina VYKDOMA judant, tada SĖKMĖ | `-- SlėptisPriedangoje (Veiksmas) | |-- Pulti žaidėją (Sekvencija) | |-- ArŽaidėjasMatomas? (Sąlyga) | |-- ArGinklasParuoštas? (Sąlyga) | |-- Kovos logika (Selektorius) | | |-- Šaudyti į žaidėją (Sekvencija) | | | |-- ArŽaidėjasTiesioginioMatomumoZonoje? (Sąlyga) | | | `-- Šaudyti (Veiksmas) | | `-- Judėti į puolimo poziciją (Sekvencija) | | |-- Inverteris(ArŽaidėjasTiesioginioMatomumoZonoje?) (Dekoratorius + Sąlyga) | | `-- JudėtiLinkŽaidėjo (Veiksmas) | `-- Patruliuoti (Sekvencija) |-- GautiKitąPatrulioTašką (Veiksmas) `-- JudėtiĮTašką (Veiksmas)
Kaip tai veikia kiekvieno „ciklo“ metu:
- Prasideda Šakninis selektorius. Jis bando savo pirmąjį vaiką – `Pabėgimas esant mažai gyvybių` seką.
- `Pabėgimas esant mažai gyvybių` seka pirmiausia tikrina `ArMažaiGyvybių?`. Jei gyvybių pakanka, ši sąlyga grąžina `NESĖKMĖ`. Visa seka žlunga, ir valdymas grįžta į šaknį.
- Šakninis selektorius, matydamas, kad jo pirmasis vaikas nepavyko, pereina prie antrojo vaiko: `Pulti žaidėją`.
- `Pulti žaidėją` seka tikrina `ArŽaidėjasMatomas?`. Jei ne, ji žlunga, ir šaknis pereina prie `Patruliuoti` sekos, priversdama kareivį ramiai patruliuoti.
- Tačiau, jei `ArŽaidėjasMatomas?` pavyksta, seka tęsiama. Ji tikrina `ArGinklasParuoštas?`. Jei pavyksta, pereinama prie `Kovos logikos` selektoriaus. Šis selektorius pirmiausia bandys `Šaudyti į žaidėją`. Jei žaidėjas yra tiesioginio matomumo zonoje, vykdomas `Šaudyti` veiksmas.
- Jei kovos metu kareivio gyvybės sumažėja, kitame cikle pati pirmoji sąlyga (`ArMažaiGyvybių?`) pavyks. Tai privers vykdyti `Pabėgimas esant mažai gyvybių` seką, priversdama kareivį rasti ir slėptis priedangoje. Kadangi šaknis yra selektorius, ir jo pirmasis vaikas dabar pavyksta (arba yra vykdomas), jis niekada net neįvertins `Pulti žaidėją` ar `Patruliuoti` šakų. Štai kaip natūraliai tvarkomi prioritetai.
Ši struktūra yra švari, lengvai skaitoma ir, svarbiausia, lengvai plečiama. Norite pridėti granatos metimo elgseną? Galite įterpti kitą seką į `Kovos logikos` selektorių su aukštesniu prioritetu nei šaudymas, su savo sąlygomis (pvz., `ArŽaidėjasPriedangoje?`, `ArTuriGranatą?`).
Elgsenos medžiai vs. Baigtinių būsenų automatai: aiškus nugalėtojas sudėtingumo atveju
Formalizuokime palyginimą:
Savybė | Elgsenos medžiai (EM) | Baigtinių būsenų automatai (BBA) |
---|---|---|
Moduliariškumas | Itin aukštas. Pomedžiai (pvz., „Rasti gyvybių paketą“ seka) gali būti sukurti vieną kartą ir pakartotinai naudojami daugelyje skirtingų DI arba skirtingose to paties medžio dalyse. | Žemas. Logika yra įdėta į būsenas ir perėjimus. Elgsenos pakartotinis naudojimas dažnai reiškia būsenų ir jų jungčių dubliavimą. |
Mastelio keitimas | Puikus. Naujų elgsenų pridėjimas yra toks pat paprastas, kaip naujos šakos įterpimas į medį. Poveikis likusiai logikai yra lokalizuotas. | Prastas. Pridėjus naujų būsenų, galimų perėjimų skaičius gali augti eksponentiškai, sukeldamas „būsenų sprogimą“. |
Reaktyvumas | Iš prigimties reaktyvus. Medis yra pervertinamas nuo šaknies kiekvieną ciklą, leidžiantis nedelsiant reaguoti į pasaulio pokyčius pagal apibrėžtus prioritetus. | Mažiau reaktyvus. Agentas yra „įstrigęs“ savo dabartinėje būsenoje, kol suveikia konkretus, iš anksto nustatytas perėjimas. Jis nuolat nepervertina savo bendro tikslo. |
Skaitomumas | Aukštas, ypač su vizualiniais redaktoriais. Hierarchinė struktūra aiškiai parodo prioritetus ir logikos srautą, todėl ji suprantama net neprogramuotojams, pavyzdžiui, žaidimų dizaineriams. | Didėjant sudėtingumui tampa žemas. Vizualus sudėtingo BBA grafikas gali atrodyti kaip lėkštė spagečių. |
Taikymas ne tik žaidimuose: robotika ir simuliacija
Nors elgsenos medžiai išgarsėjo žaidimų pramonėje, jų nauda siekia daug toliau. Bet kuri sistema, reikalaujanti autonomiško, į užduotis orientuoto sprendimų priėmimo, yra pagrindinis kandidatas EM.
- Robotika: Sandėlio roboto visa darbo diena gali būti sumodeliuota su EM. Šaknis gali būti selektorius `ĮvykdytiUžsakymą` arba `ĮkrautiBateriją`. `ĮvykdytiUžsakymą` seka apimtų vaikus, tokius kaip `NaviguotiĮLentyną`, `IdentifikuotiPrekę`, `PaimtiPrekę` ir `PristatytiĮSiuntimoSkyrių`. Sąlygos, tokios kaip `ArBaterijaSenka?`, valdytų aukšto lygio perėjimus.
- Autonominės sistemos: Bepiločiai orlaiviai (UAV) ar marsaeigiai tyrinėjimo misijose gali naudoti EM sudėtingiems misijų planams valdyti. Seka gali apimti `Pakilti`, `SkristiĮTarpinįTašką`, `SkenuotiSritį` ir `GrįžtiĮBazę`. Selektorius galėtų tvarkyti avarinius atsarginius variantus, tokius kaip `AptiktaKliūtis` ar `PrarastasGPS`.
- Simuliacija ir mokymas: Kariniuose ar pramoniniuose simuliatoriuose EM gali valdyti simuliuojamų subjektų (žmonių, transporto priemonių) elgseną, siekiant sukurti realistiškas ir sudėtingas mokymo aplinkas.
Iššūkiai ir geriausios praktikos
Nepaisant jų galios, elgsenos medžiai nėra be iššūkių.
- Derinimas: Atsekti, kodėl DI priėmė konkretų sprendimą, gali būti sunku dideliame medyje. Vizualiniai derinimo įrankiai, rodantys tiesioginę kiekvieno mazgo būseną (`SĖKMĖ`, `NESĖKMĖ`, `VYKDOMA`), kai medis vykdomas, yra beveik būtini sudėtingiems projektams.
- Duomenų perdavimas: Kaip mazgai dalijasi informacija? Įprastas sprendimas yra bendras duomenų kontekstas, vadinamas Duomenų lenta (angl. Blackboard). `ArPriešasMatomas?` sąlyga gali nuskaityti žaidėjo vietą iš Duomenų lentos, o `AptiktiPriešą` veiksmas įrašytų vietą į ją.
- Našumas: Labai didelio, gilaus medžio vykdymas kiekviename kadre gali būti skaičiavimo požiūriu brangus. Optimizacijos, tokios kaip įvykiais pagrįsti EM (kai medis veikia tik įvykus atitinkamam įvykiui), gali tai sušvelninti, tačiau tai prideda sudėtingumo.
Geriausios praktikos:
- Laikykite medį negilų: Pirmenybę teikite platesniems, o ne gilesniems medžiams. Giliai įdėtą logiką gali būti sunku sekti.
- Pasinaudokite moduliariškumu: Kurkite mažus, pakartotinai naudojamus pomedžius bendroms užduotims, tokioms kaip navigacija ar inventoriaus valdymas.
- Naudokite Duomenų lentą: Atskirkite medžio logiką nuo agento duomenų, naudodami Duomenų lentą visai būsenos informacijai.
- Pasinaudokite vizualiniais redaktoriais: Įrankiai, tokie kaip integruotas į Unreal Engine arba priedai kaip Behavior Designer Unity varikliui, yra neįkainojami. Jie leidžia greitai kurti prototipus, lengvai vizualizuoti ir geriau bendradarbiauti programuotojams ir dizaineriams.
Ateitis: elgsenos medžiai ir mašininis mokymasis
Elgsenos medžiai nekonkuruoja su šiuolaikinėmis mašininio mokymosi (MM) technikomis; jie yra vieni kitus papildantys. Hibridinis požiūris dažnai yra galingiausias sprendimas.
- MM lapų mazgams: EM gali tvarkyti aukšto lygio strategiją (pvz., `NuspręstiPulti` ar `NuspręstiGintis`), o apmokytas neuroninis tinklas gali vykdyti žemo lygio veiksmą (pvz., `NutaikytiIrŠauti` veiksmo mazgas, kuris naudoja MM tiksliam, į žmogų panašiam taikymuisi).
- MM parametrų derinimui: Sustiprinamasis mokymasis galėtų būti naudojamas optimizuoti parametrus EM viduje, tokius kaip specialios galimybės atvėsimo laikas ar gyvybių slenkstis atsitraukimui.
Šis hibridinis modelis sujungia nuspėjamą, valdomą ir dizaineriams draugišką elgsenos medžio struktūrą su niuansuota, adaptyvia mašininio mokymosi galia.
Išvada: esminis įrankis šiuolaikiniam DI
Elgsenos medžiai yra reikšmingas žingsnis į priekį nuo standžių Baigtinių būsenų automatų rėmų. Suteikdami modulinę, lanksčią ir gerai skaitomą sprendimų priėmimo sistemą, jie leido kūrėjams ir dizaineriams sukurti vienas sudėtingiausių ir įtikinamiausių DI elgsenų, matytų šiuolaikinėse technologijose. Nuo gudrių priešų populiariame žaidime iki efektyvių robotų futuristinėje gamykloje, elgsenos medžiai suteikia loginį pagrindą, kuris paverčia paprastą kodą protingu veiksmu.
Nesvarbu, ar esate patyręs DI programuotojas, žaidimų dizaineris ar robotikos inžinierius, elgsenos medžių įvaldymas yra investicija į pagrindinį įgūdį. Tai įrankis, kuris užpildo atotrūkį tarp paprastos logikos ir sudėtingo intelekto, o jo svarba autonominių sistemų pasaulyje tik augs.