Z je realtime strategie od Bitmap Brothers z roku 1996. Dva týmy robotů, červený a modrý, bojují na demo mapě o dvanáct území s vlajkami. Kdo drží víc území, tomu továrny vyrábějí rychleji. Vyhrává ten, kdo pronikne do nepřátelské pevnosti.

Zeta je můj port pro tuhle hru napsaný v C++, který načte původní data hry. Snažil jsem se, aby byl gameplay 1:1 s originálem. Právě přesnost se stala základem projektu s neuronovou sítí. Když se hra chová stejně, dá se v ní učit.

Ve videu níže proti sobě hrají dvě malé neuronové sítě. Není to ChatGPT ani nic podobného. Je to pár tisíc čísel, která se naučila jedinou věc: rozhodovat ve hře, kam poslat skupinu vojáků. O tom, jak se hraje, předem nevěděly nic. Naučily se to hraním, několik tisíc zápasů za sebou.

Červený a modrý portrét robota proti sobě nad bojištěm, mezi nimi nápis AI vs AI a Z 1996
Video se zápasem na YouTube (3:14, anglicky). Červená je síť druhé generace, modrá třetí.

Proč to vůbec jde

Hra z roku 1996 počítá svůj svět v pevném rytmu. Zeta tenhle rytmus přesně dodržuje a navíc je deterministická. Stejný začátek (seed) a stejné rozkazy dají vždy stejný zápas, do posledního pixelu. To má dva důsledky.

  1. Hra se dá spustit bez okna. Nic se nekreslí, nehraje žádný zvuk, jen se počítá. Celá mise, která v reálném čase trvá deset minut, tak proběhne za 1,5 s. Souběžně jsem spustil šest zápasů a dvacet čtyři jich bylo hotových za 18 s. Bez toho by učení trvalo měsíce.

  2. Každý zápas se dá přehrát znovu. Stačí si zapsat seed a všechny rozkazy. Když se pak zápas pustí ještě jednou, vyjde stejně. Tak vzniklo i video: nejsou to animace, je to hra, která opravdu proběhla, přehraná ještě jednou s kamerou.

Jak síť hru „vidí“

Síť se nedívá na obrazovku. Hra každé dvě sekundy pošle textové hlášení: která území komu patří, kde stojí vlastní skupiny a kolik mají vojáků a zdraví, kde jsou nepřátelé, kde leží opuštěná vozidla a kanóny, jak jsou na tom budovy. Je to stejná informace, kterou má hráč na minimapě, nic navíc.

Síť odpoví rozkazy. A tady je trik, díky kterému je celý projekt poctivý: rozkaz sítě je přesně to, co udělá hráč myší. „Vyber tuhle skupinu a klikni na tenhle bod mapy.“ Hra pak sama rozhodne, co to znamená: jít tam, sebrat vlajku, zaútočit na robota nebo budovu, nebo vejít do nepřátelské pevnosti. Hra vůbec neví, že za myší sedí nějaká neuronová síť. :)

Jak jedno rozhodnutí vypadá

Každé dvě sekundy dostane každá skupina vojáků na výběr ze 17 možností:

  • nechat být, co právě dělá (1 možnost)
  • jít k jednomu z dvanácti území (12)
  • zaútočit na jednu ze čtyř nejbližších nepřátelských skupin (4)

Každou možnost popíše program 55 čísly: pár čísel o stavu celé hry (třeba kolik území kdo drží), čísla o skupině samotné (jaký druh vojáků, kolik jich je, kolik mají zdraví, kde stojí, jestli jdou nebo bojují) a čísla o cíli (jak je daleko a kterým směrem, komu patří, kolik síly tam mají obě strany).

Těch 55 čísel vezme neuronová síť a vrátí jedno číslo: známku. Síť má dvě skryté vrstvy po 64 „neuronech“ a dohromady 7 809 vah. To je celý její mozek.

Sedmnáct známek se pak převede na pravděpodobnosti (softmax: čím lepší známka, tím větší šance) a skupina si jednu možnost vylosuje. Losuje se schválně. Kdyby síť vždycky brala tu nejlepší známku, hrála by pořád stejně a nikdy by neobjevila nic nového.

Výřez z hry: červený lehký tank v kroužku, od něj šipka k modré skupině s popiskem 40 %, dál dvě menší kolečka s 9 % a 3 %
Kroužek je skupina, o které panel vpravo mluví. Kolečka jsou její možnosti, velikost kolečka je pravděpodobnost. Šipka ukazuje, co si vylosovala
Panel Inside the network: schéma sítě s 55 vstupy, dvěma vrstvami po 64 neuronech a výsledným skóre +7,4, pod ním seznam pěti možností s procenty
Totéž rozhodnutí zevnitř. Vlevo 55 vstupů, uprostřed obě skryté vrstvy, vpravo známka vylosované možnosti. Čáry jsou příspěvky, které známku ovlivnily nejvíc. Dole pět nejpravděpodobnějších možností.

Vedle toho běží ještě druhá, menší síť (6 273 vah), která z celkového stavu odhaduje, jak zápas dopadne. Tu ve hře nikdo neposlouchá, slouží při učení a ve videu kreslí graf „kdo vede“.

Jak se učila

Generace 0: Nejdřív jsem napsal jednoduchého skriptovaného hráče, pár pravidel na pár řádků: nečinnou skupinu pošli k nejbližší cizí vlajce, na nepřítele ve vlastním území zaútoč, a když držíš víc území než soupeř, zaútoč na jeho pevnost. Síť se potom 48 zápasů dívala a učila se skript napodobit. Výsledek byl slabý hráč, ale už ne náhodný.

Pak učení odměnou. Od téhle chvíle už síť nikdo nic neučil. Jen hrála a po každém zápase dostala zpětnou vazbu: body za území navíc, body za zdraví svých vojáků oproti soupeřovým a velkou odměnu za výhru nebo trest za prohru. Tisíckrát za sebou.

Proti komu hrála? Proti původní AI z roku 1996 (ta je v Zetě přenesená podle originálu a umí hrát za obě barvy), proti skriptu, proti soupeři, který nedělá nic, sama proti sobě a ve třetím kole i proti svým starším verzím.

generacezápasů celkem (přibližně)
gen 11 600
gen 24 000
gen 35 600

Všechno běželo na jednom obyčejném počítači, pár hodin dohromady.

Jak jsou dobré

Abych to nehádal z pár zápasů, uspořádal jsem turnaj: šest hráčů, každý s každým, 32 různých začátků, vždy z obou barev. Celkem 960 zápasů. Z výsledků se spočítal rating Elo, stejný systém jako v šachu, s původní AI jako nulovým bodem na 1000.

hráčElo
síť gen 21183
síť gen 31162
skriptovaný hráč1082
síť gen 11032
původní AI (1996)1000
síť gen 0 (script)820

Rozdíl mezi gen 2 a gen 3 je v mezích nejistoty (asi ±28 bodů), třetí kolo tedy měřitelně nepomohlo. Obě sítě ale porážejí původní AI i ruční skript.

Jak vzniklo video

Zápas ve videu je jeden zápas z turnaje: gen 2 za červené proti gen 3 za modré. Přehrál jsem ho ještě jednou stejnou cestou a přitom uložil každé rozhodnutí sítě: všech 17 možností, jejich pravděpodobnosti, vylosovanou volbu a to, co se dělo uvnitř sítě. Pak ještě jednou, tentokrát s kreslením celé mapy do videa.

Celý snímek z videa: vlevo bojiště s označenou skupinou a jejími možnostmi, vpravo panel se skóre, minimapou, grafem kdo vede a schématem sítě
Celý obraz videa. Vlevo hra, vpravo panel: počty území a jednotek, minimapa, graf „kdo vede“ z odhadů obou hodnotových sítí a schéma sítě pro poslední rozhodnutí sledované skupiny.

Hudba je původní hudba hry. Skladba z hlavního menu je úvod, bojová skladba pod zápasem, vítězná na konci, vše přehrané přes emulovaný zvukový čip OPL3. Zvuky jsou ty, které hra sama zahrála tam, kde se kamera zrovna dívala. Střelba, výbuchy a rádio vojáků. Hra hlásí do rádia jen za červenou stranu.

Červená pevnost v plamenech, kolem ní modré jednotky a trosky, nahoře lávová řeka
Konec zápasu po 9 minutách a 10 sekundách hry: modré skupiny pronikly do červené pevnosti.

Co to není

K mezím:

  • Síť nevymýšlí vlastní tahy, vybírá z 17 možností, které jsem navrhl já. Podobně těch 55 čísel, kterými se možnost popisuje, je ručně vybraných. Síť se naučila jen to, jak vybírat.
  • Umí jedinou mapu, misi z dema. Na jiné by se musela učit znovu.
  • Odměna je společná pro celý tým, takže síť těžko pozná, která skupina rozhodla dobře a která špatně. To je nejslabší místo a první věc k vylepšení.
  • Původní hra zůstává nedotčená. Agenti jsou nástroj vedle hry, ne součást hry.

Co by mohlo být dál

Lepší odměna pro jednotlivé skupiny. Export naučených vah do hry, aby si proti síti mohl zahrát i člověk jako proti volitelnému soupeři. A stránka, kde půjde zápasy z turnaje projít na taktické mapě.