AI
Z EGA Wiki
Sztuczna inteligencja jest zarządzana poprzez AIManager. W tym miejscu tworzone są jednostki AI, które następnie można przydzielić odpowiedniej postaci w grze. Engine gry wywołuje update na całym managerze, który wysyła zapytania do każdej jednostki, przekazując aktualny stan postaci zawarty w klasie PlayerState. W ten sposób, tworzy się jeden obiekt intelignecji, który jest współdzielony przez wszystkie boty z danej grupy. Update na obiekcie inteligencji zwraca strukture RelativeAction, w której określony jest kolejny ruch postaci wyliczony na podstawie stanu poprzez AI.
Do tej pory został stworzony EasyBot, który używa jedynie sieci neuronowych do poruszania sie i celowania oraz MoonWalkBot, który jak ten wyżej, tyle ze chodzi do tyłu.
Spis treści |
IAI
Klasy reprezentujące AI, implementują interfejs IAI, w którym obecnie jest tylko jedna metoda update, pobierająca jako argument aktualny stan bota (PlayerState) i zwracająca odpowiedź inteligencji w postaci struktury RelativeAction. Wewnątrz AI, używane są odpowiednio TransitionData oraz ResponseData. W metodzie update nastepuje przetłumaczenie z PlayerState na TransitionData oraz uzupełnienie o jakieś dodatkowe informacje, pochodzące na przykład z pamięci AI, oraz zinterpretowanie odpowiedzi AI czyli ResponseData na RelativeAction.
Struktura AI
AI jest zbudowana w postaci szeregu strategii, służących do wybrania odpowiedniego mechanizmu działania. Główna strategia określa sposób wyboru algorytmu, który ma wyliczyć ruch w zależności od stanu postaci.
Strategy
Klasa Strategy, zawiera kolekcje algorytmów takich jak inne strategie, FSMy, sieci neuronowe lub algorytmy genetyczne, oraz metody update i getResponse. Tworząc strategie, należy dodać do niej mechanizmy na których bedzie wykonywany update i opisać sposób wyboru aktualnie używanego.
W przypadku EasyBota, tworzona jest główna strategia (MainStrategy), która zawiera maszyne 4 stanów (MainFSM): idle, roam, manhunt, escape. Każdemu stanowi odpowiada osobna strategia, wyspecjalizowana w danym działaniu. MainFSM określa warunki przejścia pomiędzy stanami. Update na głównej strategii, zostaje przeniesiony na update na maszynie stanow, która to następnie wywołuje update na strategii, aktualnego stanu.
StateMachine
Klasa maszyny stanów, zawiera wskaźnik do aktualnego stanu, w którym się znajduje oraz metode update, która na podstawie danych wejściowych i warunków przejść określonych dla każdego stanu, wybiera aktualny stan i wywołuje na nim update.
Stan jest reprezentowany poprzez klasę FsmState, która zawiera jedną strategię oraz warunki przejścia do innych stanów w postaci pary wektorów. W jednym wektorze są wskaźniki do obiektów stanów do których da się przejść, natomiast w drugi zawiera wskaźniki do obiektów implementujących interfejs ITransition. Interfejs ten zawiera jedną metodę zwracającą bool a przyjmującą stan bota. Wywołanie metody checkTransition na itym obiekcie w wektorze zawierającym przejścia, określa czy przy aktualnym stanie bota, da się przejść do itego stanu w wektorze kolejnych stanów. Gdy aktualny stan jest wybrany, wywołanie na nim update zostaje przeniesione na wywołanie update na strategii, która zawiera.
Stworzenie maszyny stanów polega na napisaniu osobnej implementacji ITransition dla każdego przejścia między stanami a następnie wypełnienu wektorów kolejnych stanów i przejść, w każdym obiekcie stanu.
NeuralNet
Klasa sieci neuronowych reprezentuje prostą sieć feed forward, uczoną algorytmem wstecznej propagacji. Tworząc sieć określa sie ilość wejść, wyjść warstw ukrytych, oraz neuronów w tych warstwach. Klasa posiada metode update, w której należy przemienić klase ze stanem bota na wejścia sieci, oraz odpowiednio zinterpretować wyjście sieci tak aby zwrócić obiekt ResponseData. Dodatkowo posiada metode learn, do której można podać jako argument poprawne wyjście sieci, które zostanie poddane wstecznej propagacji, oraz metody getWeights i putWeights, ktore można użyc w algorytmie genetycznym.
EasyBot
Poniżej jest schemat budowy EasyBota. Jest to prosty przykład AI sterowanej sieciami neuronowymi oraz maszynami stanów. Wejściem dla bota są jego odległości od ścian oraz pozostałych botów na mapie, jeśli zostały zauważone poprzez 9 detektorów, które ograniają pole widzenia bota. Zadaniem bota było chodzić po planszy nie wpadając na ściany i wypatrywac bota z drugiej drużyny. Po napotkaniu takiego, bot przechodził ze stanu roam do stanu manhunt w ktorym zbliżał sie do przeciwnego bota na dana odległość i strzelał do niego przez jakiś czas.

