Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Unity 3D
Gamedevelopment

Cíl orientovaný, akční plánování pro chytřejší AI

by
Difficulty:IntermediateLength:LongLanguages:

Czech (Čeština) translation by Tereza Foretová (you can also view the original English article)

Cíl orientované akce plánování (GOAP) je systém AI, který snadno dát své agenty, možnosti a nástroje pro efektivní rozhodování, aniž by museli udržovat rozsáhlé a složité konečný automat.

Zobrazit Demo

V této ukázce jsou čtyři třídy znaků, každý pomocí nástroje, které za použití nějakou dobu konec:

  • Horník: Miny rudy na skalách. Potřebuje Nástroj pro práci.
  • Záznamník: Kotlety stromy vyrábět protokolů. Potřebuje Nástroj pro práci.
  • Dřevorubec: Krájí stromy do použitelné dřevo. Potřebuje Nástroj pro práci.
  • Kovář: Fanfáry nástroje v kovárně. Všichni používají tyto nástroje.

Každá třída bude zjistit automaticky, pomocí cíleně akční plánování, jaké akce potřebují provádět k dosažení svých cílů. Je-li jejich nástroj zlomí, půjdou k zásobování elektrárny, která má jeden od kováře.

Co je GOAP?

Cíle akce plánování je systém umělé inteligence pro agenty, který umožňuje plánovat posloupnost akcí ke splnění určitého cíle. Konkrétní posloupnost akcí závisí nejen na cíl, ale i o současném stavu světa a agent. To znamená, že pokud jde o stejný cíl pro různé agenty nebo státy světa, můžete získat zcela odlišné sekvenci akce., která dělá AI, dynamické a realistické. Podívejme se na příklad, jak je vidět v ukázce výše.

Máme agenta, dřevo štípačka, která přijímá protokoly a kotlety je do palivového dříví. Vrtulník může být dodán s cílem MakeFirewood a má akce, ChopLog, GetAxe a CollectBranches.

ChopLog akce se změní protokol dříví, ale pouze pokud dřevo fréza má sekeru. Akce GetAxe dá dřevorubec sekeru. Konečně CollectBranches akce bude vyrábět dříví stejně, bez nutnosti sekeru, ale dříví nebude tak vysoké kvality.

Když jsme se dát agent MakeFirewood cíl, dostaneme tyto dvě různé akční sekvence:

  • Potřebuje dřevo-> GetAxe-> ChopLog = dělá dřevo
  • Potřebuje dřevo-> CollectBranches = dělá dřevo

Pokud agent může mít sekeru, se mohou nasekat log aby dříví. Ale možná se nemohou dostat sekeru; pak oni mohou jen Jdi a sbírat větve. Každý z těchto sekvencí bude plnit cíl MakeFirewood.

GOAP mohou vybrat nejlepší pořadí, na základě Jaké předpoklady jsou k dispozici. Pokud neexistuje žádný sekera handy, pak dřevorubec musí uchýlit k vyzvednutí větve. Uchopení větve může trvat opravdu dlouho a poskytují nekvalitní dřevo, takže nechceme ji běžet pořád, jen když musí.

Kdo je GOAP

Jsi teď, pravděpodobně obeznámeni s konečný stav stroje (FSM), ale pokud ne, pak se podívat na tento úžasný kurz.

Můžete mít narazit na velmi rozsáhlé a složité států pro některé z FSM agentů, kde nakonec dostat do bodu, kde chcete přidat nové způsoby chování, protože způsobují příliš mnoho vedlejších účinků a mezery v AI.

To se změní GOAP:

Finite State Machine státy: připojeno všude.

Do toho:

GOAP: pěkné a zvládnutelný.


Oddělení akce od sebe, můžeme nyní zaměřit se na každou akci zvlášť. Díky kód modulární a snadno testovat a udržovat. Pokud chcete přidat další akce, můžete prostě odprásknout v a žádná další akce musí být změněny. To zkuste s FSM!

Také můžete přidat nebo odstranit akce za běhu změnit chování agenta tak, aby byly ještě dynamičtější. Mají zlobr, který najednou začal bouřlivý? Dát jim novou akci "rage útoku", která odstraníme, když kamarád uklidní. Jednoduše přidáním akce v seznamu akcí je vše, co musíte udělat; GOAP Plánovač se postará o zbytek.

Pokud zjistíte, že máte velmi složité FSM pro své agenty, pak měli dát GOAP zkusit. Jeden znak, vaše FSM je stále příliš složité je, když každý stát má bezpočet if-else příkazy testování stavu by měla jít na další a přidání v novém státě je sten na všechny důsledky, které mohou mít.

Pokud máte velmi jednoduchý agenta, který právě provádí jeden nebo dva úkoly, pak GOAP by mohl být trochu těžkopádný a FSM postačí. Však to stojí za to při pohledu na pojmy zde a viděli, zda by bylo snadné pro vás zapojit do svého agenta.

Akce

Akce je něco, co agent. Obvykle je jen hraje animaci a zvuk a změna trochu státu (například přidání dříví). Otevření dveří je různé akce (a animace), než zvedne tužku. Akce je zapouzdřen a neměli starat o co jsou ostatní akce.

Chcete-li určit, jaké akce chceme použít GOAP, každé akce je uveden náklady. Vysoké náklady akce nebude zvolen za nižší náklady akce. Když jsme posloupnost akcí dohromady, sečíst náklady a pak zvolte pořadí s nejnižšími náklady.

Umožňuje přiřadit některé náklady na akce:

  • GetAxe náklady: 2
  • ChopLog náklady: 4
  • CollectBranches cena: 8

Pokud budeme znovu podívat na posloupnost akcí a sečíst celkové náklady, uvidíme, co je nejlevnější sekvence:

  • Potřebuje dřevo-> GetAxe (2)-> ChopLog (4) = dělá dříví (celkem: 6)
  • Potřebuje dřevo-> CollectBranches (8) = dělá dříví (celkem: 8)

Získání sekeru a sekání protokol vytváří dříví za nižší cenu 6, zatímco sběr větví produkuje dřevo na vyšší náklady na 8. Náš zástupce, rozhodne si sekeru a nasekat dřevo.

Ale nebude to stejné sekvence spuštěn po celou dobu? Ne, pokud se seznámíme předpoklady...

Předpoklady a účinky

Akce mají předpoklady a účinky. Podmínkou je stav, který je vyžadován pro spuštění akce a účinky jsou změny stavu po spuštění akce.

Například ChopLog akce vyžaduje agenta mít po ruce sekera. Není-li agent sekeru, je třeba najít jinou akci, která může splnit tuto podmínku aby běh ChopLog akce. Naštěstí, to dělá GetAxe akce – to je efekt akce.

GOAP Planner

GOAP Plánovač je kus kódu, který se dívá na akce a účinky a vytváří fronty akcí, které bude plnit cíl. Tohoto cíle je dodávána agentem, stát světa, a seznam akcí, které může provést agent. Pomocí těchto informací GOAP může Plánovač objednat akce, které lze spustit a které nemohou a pak se rozhodnout, jaké akce jsou nejlepší provést. Naštěstí pro vás, jsem napsal tento kód, takže není nutné.

Chcete-li toto nastavení, umožňuje doplnit náš dřevěný vrtulník akce předpoklady a účinky:

  • GetAxe cena: 2. předpoklady: "Sekyra není k dispozici", "nemá sekeru". Efekt: "má sekeru".
  • ChopLog cena: 4. předpoklady: "má sekeru". Účinek: "make dříví"
  • CollectBranches cena: 8. předpoklady: (žádný). Účinek: "aby dříví".

GOAP Plánovač nyní obsahuje informace potřebné k uspořádání pořadí akcí aby dříví (naším cílem).

Začínáme poskytnutím Plánovač GOAP současný stav světa a stav agenta. Tento stav kombinovaný svět je:

  • "nemá sekeru"
  • "Sekyra není k dispozici"
  • "svítí slunce"

Při pohledu na naše současné dostupné akce, pouze část států, které jsou důležité pro ně je "nemá sekeru" a "Sekyra není k dispozici" státy; ten druhý mohou být použity pro jiné látky s jinými akcemi.

Dobře máme naší momentální svět, naše činy (s jejich předpoklady a účinky) a cíl. Vyrazíme!

Plánovač poběží prostřednictvím akcí, také, a to jen nezastaví, když nalezne řešení k cíli. Co když další sekvence má nižší cenu? Bude probíhat přes všechny možnosti, jak najít nejlepší řešení.

Plánuje, buduje strom. Pokaždé, když je použita akce, je popped ze seznamu dostupných akcí, takže nemáme řetězec akcí 50 GetAxe zády. Stav se změní s efektem této akce.

Strom, který Plánovač se hromadí vypadá takto:

Můžeme vidět, že to bude skutečně najít tři cesty k cíli s jejich celkové náklady:

  • GetAxe-> ChopLog (celkem: 6)
  • GetAxe-> CollectBranches (celkem: 10)
  • CollectBranches (celkem: 8)

GetAxe-> CollectBranches funguje, nejlevnější cesta je GetAxe-> ChopLog, takže tenhle je vrácena.

Jak předpoklady a účinky skutečně vypadá v kódu? No, to záleží na vás, ale jsem zjistil, že nejjednodušší je uložit jako dvojice klíč hodnota, kde klíč je vždy řetězec a hodnota je object nebo primitivní typ (float, int, Boolean, nebo podobné). V jazyce C#, který by mohl vypadat takto:

Když akce provádí, jak tyto účinky skutečně vypadá a co vlastně dělají? No, nebudou muset nic dělat – používají se opravdu jen pro plánování a neovlivní skutečné zástupce státu, dokud se doopravdy.

To je třeba zdůraznit: plánování akcí není stejný jako jejich spouštění. Když agent provádí akci GetAxe, bude pravděpodobně poblíž hromadu nástrojů, přehrát animaci ohybu down a pick-up a pak uložit objekt sekera v jeho batohu. Tím se změní stav agenta. Během plánování GOAP, změna stavu je však jen dočasné, tak, že Plánovač může zjistit optimální řešení.

Procesní podmínky

Někdy akce třeba udělat něco více k určení, zda lze spustit. Například GetAxe akce má předpoklad "Sekyra není k dispozici", který budou muset hledat svět, či v bezprostřední blízkosti, zda je sekera, agent může mít. Může zjistit, že nejbližší sekera je prostě příliš daleko, nebo za nepřátelskou linií a řekne, že to nemůže spustit. Tento předpoklad je procedurální a je třeba spustit nějaký kód; to není jednoduchý logický operátor, který můžeme lze jen přepnout.

Samozřejmě, některé z těchto procesních podmínek může trvat dlouho spustit a je třeba provést na něco jiného než vykreslení podproces, ideálně jako pozadí podproces nebo Coroutines (v jednotě).

Můžete mít procesní účinky, pokud si to přejí. A pokud chcete zavést ještě dynamičtější výsledky, můžete změnit náklady na opatření průběžně!

GOAP a státu

Náš systém GOAP bude muset žít v malé konečný stav stroj (FSM), pouze proto, že, v mnoha hrách, akce bude muset být blízko cíle plnit. Nakonec jsme se třemi státy:

  • Nečinný
  • MoveTo
  • PerformAction

Při nečinnosti, agent bude zjistit, které chtějí splnit cíle. Tato část je zpracována mimo GOAP; GOAP jen ti akce, které lze spustit k provádění tohoto cíle. Je-li vybrán cíl je předána GOAP Plánovač, svět a agent od státu, a Plánovač vrátí seznam akcí (je-li to může splnit tento cíl).

Když se provádí projektant a agent má svůj seznam akcí, pokusí se provést první akci. Všechny akce budou muset vědět, jestli musí být v dosahu cíle. Pokud ano, pak FSM bude tlačit na další stav: MoveTo.

MoveTo stát řekne agent, že je třeba přesunout do konkrétní cíl. Agent bude dělat pohyblivé (a hrát animace chůze), a pak nechte FSM vědět, kdy bude v dosahu cíle. Tento stav je pak odskočilo a mohou provádět akce.

PerformAction stát spustí další akci v fronty akce vrácené GOAP Planner. Akce může být okamžitá nebo poslední nad mnoho snímků, ale když je to dostane odskočilo a poté se provádí další akce (opět, po ověření, zda že příští akce musí být provedena v rozsahu objektu).

Toto všechna opakování dokud neexistují akce zbývá provést, jdeme zpět do stavu nečinnosti, získat nový cíl a plán znovu.

Skutečný příklad

Je na čase podívat se na skutečný příklad! Nedělejte si starosti; není to tak složité, a jsem poskytl pracovní kopie v jednotě a C# pro vás vyzkoušet. Budu jen mluvit o tom krátce zde tak dostanete pocit, pro architekturu. Kód používá některé stejné příklady WoodChopper jako výše.

Pokud chcete kopat přímo v, tady by pomohlo pro kód: https://github.com/sploreg/goap

Máme čtyři dělníci:

  • Kovář: promění nástroje železné rudy.
  • Záznamník: používá nástroj pokácet stromy na výrobu protokolů.
  • Horník: doly skály s nástrojem k výrobě železné rudy.
  • Dřevorubec: používá nástroj pro sekání protokoly na výrobu palivového dříví.

Nástroje se časem opotřebují a bude třeba vyměnit. Naštěstí Kovář dělá nástroje. Ale Železná Ruda je zapotřebí, aby nástroje; To je místo, kde přijde horník (kdo také potřebuje nástroje). Řezačka dřeva potřebuje protokoly, a ty pocházejí z protokolování; Oba potřebují nástroje také.

Nástroje a prostředky jsou uloženy na dodávky piloty. Agenti budou shromažďovat materiály či nástroje potřebují od kůlů a také vysadit jejich produktů na ně.

Kód má šest hlavních GOAP třídy:

  • GoapAgent: chápe stát a používá FSM a GoapPlanner k provozu.
  • GoapAction: akce, které agenti mohou provádět.
  • GoapPlanner: plány akcí GoapAgent.
  • FSM: konečný stavový stroj.
  • FSMState: stát ve FSM.
  • IGoap: rozhraní, které používají naše skutečné herci dělník. Vazby do události pro GOAP a FSM.

Podívejme se na třídu GoapAction, protože to je ten bude podtřídy:

Nic moc tady: uloží předpoklady a účinky. Také ví, zda to musí být v dosahu cíle, a pokud ano, pak FSM ví tlačit MoveTo státu, je-li zapotřebí. Ví, kdy se to dělá, příliš; To je dáno prováděcí třídy akce.

Zde je jeden z akcí:

Největší část této akce je checkProceduralPreconditions metoda. Vyhledá nejbližší herní objekt, se IronRockComponent a uloží tento cíl rock. Poté když provádí, získá ten kámen uložený cíl a provede akci na něm. Když akce je opětovně použita v plánování znovu, budou obnoveny všechny jeho polí, tak, že mohou být vypočítány znovu.

Toto jsou všechny komponenty, které jsou přidány do objektu entity horník v jednotě:


Aby váš agent fungovat je nutné přidat následující součásti k ní:

  • GoapAgent.
  • Třída, která implementuje IGoap (ve výše uvedeném příkladu, který je Miner.cs).
  • Některé akce.
  • Batoh (jen proto, že akce použít; to nesouvisí s GOAP).
Můžete přidat libovolné akce, které chcete, a to by změnilo chování agenta. Byste mohli dokonce dát to všechny akce tak může těžit rudy, forge nástroje a nasekat dřevo.

Tady je demo v akci:

Každý dělník přejde na cíl, který potřebují k naplnění jejich akce (strom, skála, Řeznické špalky nebo cokoliv), provádí akci a často vrací k hromadě dodávek vyložit své zboží. Kovář se chvíli počkat, dokud železné rudy v jedné z dodávek piloty (přidal horník). Kováři pak zhasne a dělá nástroje a vysadí nástroje nabídky vedle hromady nejbližší mu. Když Dělnický nástroj se bude se vypraví do nabídky hromádku poblíž Kovář, kde jsou nové nástroje.

Můžete chytit kód a plná verze aplikace: http://github.com/sploreg/goap.

Závěr

S GOAP můžete vytvořit velké řady akcí bez hlavy států, vzájemně propojených, která často přichází s konečný automat. Akce mohou být přidány a odebrána z agenta k výrobě dynamické výsledky, stejně jako udržet si zdravý rozum při udržování kódu. Skončí s flexibilní, chytré a dynamické AI.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.