poniedziałek, 28 sierpnia 2017

AI vs AI i statystyki

Postanowiłem przekodować nieco aplikację abym mógł uruchomić grę AI vs AI z pominięciem tego co widzimy na kliencie, czyli z pominięciem wszystkich animacji itp. Z perwspektywy programowania taka funkcjonalność ma 3 następujące zalety:
- Pozwala wykryć błędy zwązane z wywoływaniem funkcji nie na tym sprzęcie co trzeba (przykładowo okazało się, że niektóre fragmenty kodu były wywoływane zarówno na serwerze jak i kliencie, mimo iż powinny być wywoływane tylko na kliencie),
- Przy wielokrotnym uruchomieniu gry AI vs AI pozwala szybko wykryć błędy które występują w bardzo specyficznych sytuacjach.
- Pozwala sprawdzić optymalność kodu, czyli ile gier na sekundę byłby w stanie utrzymać serwer (gdyby był moim laptopem).

Statystyki


Po załataniu kilku błędów postanowiłem pójść o krok naprzód i zacząłem zbierać statystyki z tych gier. Zbierałem 3 rodzaje statystyk:
- Win ratio kart żetonów.
- Win ratio kombinacji par kart żetonów w zestawach.
- Win ratio kart żetonów przeciwko innym określonym kartom żetonów.

Właściwie to nie do końca było to prawdziwe "win ratio". Zamiast tego wszystkie podstawowe wartości ustawiłem na 0.5, a po każdej grze mnożyłem odpowiednie wartości przez 0.999, oraz dodawałem 0.001 w przypadku wygranych. Od zwykłego win ratio różni się tym, że największy wpływ na statystyki mają najnowsze gry, dzięki czemu można szybko obserwować zmiany wynikłe ze zmian w balansie/AI, ale jednocześnie statystyki nie wahają się zbytnio wskutek losowości. Alternatywnym rozwiązaniem byłoby zapamiętywanie historii tylko 1000 ostatnich gier, przy początkowym wypełnieniu ich naprzemiennymi wygranymi i przegranymi, ale takie rozwiązanie nie byłoby praktyczne.

Takie statystyki są bardzo pomocne. Jeśli jakaś karta ma zbyt duże win ratio, to znaczy że albo AI nie potrafi sobie z nią radzić, albo ta karta jest zbyt silna. Jeśli jakaś karta ma zbyt niskie win ratio, to albo AI nie potrafi z niej poprawnie korzystać, albo jest zbyt słaba. Dzięki tym statystykom szybko zorientowałem się po ostatniej zmianie w działaniu umiejętności dającej bonusową turę właścicielowi AI nie posługiwało się nią prawidłowo, więc szybko mogłem naprawić ten problem.

Mimo iż statystyki obejmowały wiele gier, to nie uznawałem je za zbyt wartościowe. Powód jest prosty: karty żetonów posiadają różną skuteczność w zależności od tego jakie ma się pozostałe karty w zestawie. Przykładowo jeśli posiadamy żeton który wzmacnia przyrost punktacji sąsiednich żetonów, to będzie on znacznie lepiej sobie radził jeśli będziemy posiadali umiejętności które generują wiele żetonów.

Poprawiony generator zestawów kart żetonów

Skoro już zebrałem statystyki dotyczące synergii żetonów, postanowiłem je wykorzystać. Dotychczas zestawy były generowane w taki sposób, aby w pierwszej kolumnie były losowe żetony którymi opłaca się rozpocząć grę, a prócz tego jedyną zasadą był brak powtórek kart - wszystkie miały tę samą wagę. Postanowiłem to zmienić i przerobiłem algorytm tak, aby wagi wszystkich dostępnych kart były wymnażane przez win ratio każdej dodawanej do zestawu talii. Innymi słowi jeśli jakaś karta nie zgrywa się z tymi które już wylosowaliśmy, to mieliśmy mniejszą szansę na jej otrzymanie.

Ku moim oczekiwaniom po wprowadzeniu tej zmiany win ratio poszczególnych elementów zmieniło się. Jeśli jakiś element wymagał synergii, to jego win ratio wzrosło, bo zwyczajnie rzadziej zdażały się sytuacje w których ta synergia nie występowała. Co więcej zmiana ta spowodowała nieustanne zmiany w win ratio wszystkich kart - jeśli jakaś karta okazywała się słaba, zaczęła występować rzadziej, a wtedy karty przeciwko którym była skuteczna zaczęły występować częściej, ponieważ zginęło ich naturalne zagrożenie. Elementy papier-kamień-nożyce w tej grze są dosyć mocne, więc takie zmiany mogą zachodzić niemal bez końca.

Balans na podstawie statystyk

Karty żetonów które mocno wychodziły na plus postanowiłem osłabić, a karty które radziły sobie okropnie postanowiłem wzmocnić. Zmieniałem tylko te karty, które odstawały najmocniej, a następnie analizowałem zmiany. Zmienione karty albo pozostawały słabe/silne (choć w nieco mniejszym stopniu), albo stawały się przeciętne, co pozwala mi sądzić że zmiany były w miarę rozsądne.

Wraz z wprowadzaniem zmian można było zauważyć, że zmiana najbardziej skrajnych kart sprawiała tylko, że mniej skrajne karty zajmowały ich miejsce, co jest dysyć przewidywalne, bo jeśli jakiś element przestał być słabszy od innego elementu, to prawdopodobnie będzie teraz z nim wygrywać.

Inną przewidywalną zależnością było dążenie statystyk do małej liczby kart z pozytywnym win ratio, przy jednoczesną nieznaczną pozytywnością. Win ratio żadnej karty nie przekroczyło 53%, a większość pozytywnych kart miała w przybliżeniu 51% win ratio, z kolei siła słabych kart była bardzo różnorodna i potrafiła sięgać nawet 37%. Powód tego był prosty: najlepsze karty występowały w zestawach częściej, a więc "wygrani grali z wygranymi". Nawet gdyby któraś karta początkowo miała 90% win ratio, to po rozegraniu dużej liczby gier z przeciwnikiem na tym samym poziomie win ratio zbliżyłoby się do 50%. Z kolei słabsze karty rzadko miały okazję grać naprzeciw słabszym kartom, a więc ich win ratio spadało w dół.

Przy całej tej zabawie najbardziej rzuciło mi się w oczy, że karta z żetonem o wartości 9 (dotychczas 8) dająca bonusową turę przeciwnikowi na przemian miała neutralne i negatywne win ratio. Gdy jej win ratio stawało się neutralne, win ratio kart które mogły wypchnąć ten żeton poza planszę wzrastało. Gdy wzrastało win ratio kart przemieszczających, to win ratio karty z bonusową turą dla przeciwnika malało, a gdy zmalało, to win ratio kart wypychających znowu spadało. Spośród wszystkich kart ta jest chyba najbardziej ryzykowna.

Oto grafika przedstawiająca zebrane dane: po lewej jest win ratio poszczególnych kart, po środku jest win ratio ich kombinacji, a po prawej jest win ratio ich potyczek:


Czysty żółty kolor oznacza 50% win ratio, czysty zielony 60% win ratio, czysty czerwony oznacza 40% win ratio, a czysty fiolet oznacza 30% win ratio. Kolory pośrednie to oczywiście wartości pośrednie.

Póki co zagwozdkę dla mnie stanowią karty które mają inną skuteczność mimo iż różnią się tylko obszarem umiejętności, nawet jeśli obszar umiejętności obejmuje tyle samo pól. O ile w przypadku umiejętności przemieszczających łatwo zrozumieć dlaczego tak się dzieje (umiejętności przemieszczające po skosie częściej natrafiają na sytuacje w której mogą coś wypchnąć poza planszę), to w przypadku innych umiejętności nie jest to takie jasne. Różnica ta jest najbardziej widoczna w przypadku umiejętności przejmującej, która w działaniu skośnym ma lepsze wyniki. Przypuszczam że jest to związane z żetonem który co turę właściciela rani wrogów w linii pionowej/poziomej - wtedy przejęcie żetonów po skosie jest dla nas bardziej opłacalne, ponieważ można przejąć więcej żetonów przy jednoczesnym nie narażaniu ich na obrażenia.

No cóż, pozostaje mi posiedzieć jeszcze nad sztuczną inteligencją. Obecnie unika ona stawiania wartościowych żetonów w obszarze obrażeń wieżyczek, więc to może być przyczyną niektórych zaburzeń. Niedługo dojdzie jeszcze nieco nowych kart, które także mogą zamieszać w balansie.

Brak komentarzy:

Prześlij komentarz