Masarykova univerzita Fakulta informatiky

Umělá inteligence pro OpenTTD s prvky emotivního chování

Bakalárska práca

Michal Zopp

Brno, jar 2018 Na tomto mieste sa v tlačenej práci nachádza oficiálne podpísané zadanie práce a vyhlásenie autora školského diela. Vyhlásenie

Vyhlasujem, že táto bakalárska práca je mojím pôvodným autorským dielom, ktoré som vypracoval samostatne. Všetky zdroje, pramene a literatúru, ktoré som pri vypracovaní používal alebo z nich čerpal, v práci riadne citujem s uvedením úplného odkazu na príslušný zdroj.

Michal Zopp

Vedúci práce: Jaroslav Bayer

i Poďakovanie

Rád by som týmto poďakoval RNDr. Jaroslavovi Bayerovi za vedenie práce, odbornú pomoc, cenné rady pri implementácií a usmernenie pri testovaní. Ďalej by som chcel poďakovať svojej rodine a priateľke za podporu a pomoc pri korektúre práce.

ii Zhrnutie

Táto práca sa zameriava na rozšírenie umelej inteligencie o prvky emotívneho správania do hry Open Deluxe. Pojem emotívne správanie sa v kontexte práce chápe ako detekcia, obrana a reakcia na útoky smerované proti umelej inteligencií. Vytvoreńa umelá inteligencia sa snaží, čo najlepšie napodobniť správanie ľud- ského protivníka. Súčasťou práce je porovnanie dostupných umelých inteligencií a vybratie najlepšieho kandidáta na implementáciu vlast- ného emotívneho správania. Túto implementáciu následne porovnať pri výkone s ostatnými umelými inteligenciami.

iii Kľúčové slová game AI, OpenTTD, emotions, Squirrel

iv Obsah

1 Úvod 1

2 Open Transport Tycoon Deluxe 3 2.1 Cieľ hry ...... 3 2.2 Popis hry ...... 4

3 Programové prostredie 7 3.1 Squirrel ...... 7 3.2 NoAI framework ...... 8 3.3 Štruktúra AI ...... 9 3.4 Práca s AI ...... 10

4 Typy útokov a obrana 12 4.1 Cestná doprava ...... 12 4.2 Ostatné typy dopravy ...... 16

5 Výber vhodnej umelej inteligencie 19 5.1 AdmiralAI ...... 20 5.2 DictatorAI ...... 21 5.3 SimpleAI ...... 21

6 EmotionAI 22 6.1 Základné vlastnosti EmotionAI ...... 22 6.2 Návrh a implementácia EmotionAI ...... 23 6.3 Implementačné detaily ...... 25

7 Porovnanie 29 7.1 Výsledky testov celkovej úspešnosti EmotionAI ...... 29 7.2 Výsledky testov samostatných AI ...... 32 7.3 EmotionAI vs AdmiralAI ...... 35

8 Sumarizácia 37 8.1 Možné vylepšenia do budúcna ...... 37 8.2 Záver ...... 38

v Zoznam tabuliek

5.1 Zostávajúce AI po aplikácií uvedených parametrov 20 7.1 Tabuľka hodnôt spoločnosti AdmiralAI (v tisícoch £) pri zablokovaniu ciest 33 7.2 Tabuľka hodnôt spoločnosti EmotionlAI (v tisícoch £) pri zablokovaniu ciest 34

vi Zoznam obrázkov

2.1 Stavebné menu pre cestnú dopravu 5 2.2 Stavebné menu pre železničnú dopravu 5 4.1 Jednoduché zablokovanie cesty 13 4.2 Príklad obchádzky pre jednoduchú aj pokročilú blokádu cesty 14 4.3 Zablokovanie príjazdovej cesty do mesta 14 4.4 Vozidlo je stratené 15 4.5 Príklad dvoch staníc pri jednom priemysle 16 4.6 Príklad zrazeného auta na priecestí a následná správa 17 4.7 Príklad zablokovania lode v prístave 18 6.1 Ukážka závislostí medzi triedami v EmotionAI 23 6.2 Príklad pre použitie funkcie IsLevelCrossingTile() 25 6.3 Špirálovitá analýza políčok od daného stredu 27 7.1 Výsledky testov pre mapu 256x256, príjem spoločností 30 7.2 Výsledky testov pre mapu 256x256, hodnota spoločností 30 7.3 Výsledky testov pre mapu 1024x1024, príjem spoločností 31 7.4 Výsledky testov pre mapu 1024x1024, hodnota spoločností 32 7.5 Výsledky kontrolných testov 35 7.6 Výsledky testov cestných blokád 36

vii 1 Úvod

Význam umelej inteligencie (ďalej iba AI) sa v poslednej dobe dostáva do popredia, ako možné riešenie problému, nie pomocou striktných počítačových pravidiel, ale vlastným úsudkom. Všetky tieto riešenia majú spoločné to, že nikto nenapísal programu, ako presne má postu- povať, ale on si to zistil sám. AI má potenciál pre mnoho využití, od samo jazdiacich áut až po odhady v ekonómii či prístrojoch v zdravot- níctve [GP95]. Táto bakalárska práca sa zameriava na tvorbu AI pre hru Open Transport Tycoon Deluxe (ďalej iba OpenTTD). AI sú v dnešnom her- nom svete veľmi rozšírené a obľúbené. Príkladom umelej inteligencie v hrách môžu byť takzvaní počítačom ovládaní protivníci, generovanie hráčskej plochy alebo aj simulácie. AI v hrách sa prevažne chápe ako sada algoritmov, ktoré zahŕňajú okrem iného, aj techniky kontroly riadenia. Herné AI teda nepredstavujú „reálne“ umelé inteligencie v tom zmysle, že by sa učili z veľkého množstva dát a rozhodujú na ich základe o výsledku, ale fungujú nad vopred určenou množinou vstupov a produkujú obmedzený počet odpovedí [Mil06]. Cieľom tejto práce je rozšírenie niektorej existujúcej umelej inteli- gencie pre hru OpenTTD o emocionálnu stránku. Hlavným rozdielom od ostatných iných AI pre OpenTTD je, že bude reagovať na rôzne ak- cie z pohľadu hernej stratégie druhého hráča. Pod pojmom „emotívne správanie“ v umelej inteligencii si teda môžeme predstaviť bližšie na- podobnenie správanie ľudského hráča. Takáto AI má teda za úlohu, čo najlepšie replikovať správanie reálneho hráča. Hra dovoľuje naprí- klad zablokovanie cesty tak, aby nebol možný prejazd vozidiel. Po zistení tejto skutočnosti bude vytvorená AI, podľa dostupných pros- triedkov, na túto skutočnosť adekvátne reagovať. Následne sa bude snažiť majiteľovi tejto zátarasy oplatiť jeho zlomyseľné správanie. Kapitola 2 predstavuje základné charakteristiky hry OpenTTD, po- pisuje možnosti hry a jej hlavný cieľ. Na programovanie AI do hry OpenTTD je nutné sa zoznámiť s princípmi jazyka Squirrel a kostrou umelej inteligencie, ktorá je popísaná v kapitole 3. V kapitole 4 sú popísané možné útoky hráčov, ktoré sú v hre realizovateľné. V tejto kapitole sú taktiež možné spôsoby obrany proti daným útokom. Práca zahrňuje výber najlepšieho kandidáta zo zoznamu umelých inteligen-

1 1. Úvod

cií 1 a vylepšenie jej emocionálneho správania. Tento proces, ako aj bližší popis iných AI zo zoznamu, je popísaný v kapitole 5. Kapitola 6 obsahuje konkrétnu implementáciu a rozširovanie vybranej AI. Ka- pitola taktiež popisuje komplikácie ktoré nastali pri implementácií rôznych útokov popísaných v kapitole 4. Kapitola 7 obsahuje porovna- nie AI v rámci celkového zárobku. V poslednej kapitole sa nachádza sumarizácia práce a možné vylepšenia AI do budúcna.

1. https://bananas.openttd.org/en/ai/

2 2 Open Transport Tycoon Deluxe

Hra OpenTTD je pokračovanie pôvodnej budovateľskej hry Transport Tycoon Deluxe od firmy MicroProse z roku 1994, ktorá bola podporo- vaná iba na operačných systémoch DOS. Dnes je OpenTTD oficiálne preložená a spustená na rôznych platformách, ako napríklad Micro- soft Windows či . Neoficiálne podporované platformy sú okrem iného, aj mobilné zariadenia. OpenTTD preberá všetky vlastnosti pô- vodnej hry a rozširuje ju o možnosť nastavenia veľkosti mapy, hru pre viac hráčov, jazykovú lokalizáciu, zvuky a podporu pre AI. Hra je do- stupná pod licenciou GNU General Public Licence verzia 2.0 (GPLv2). To znamená, že je každému umožnené pridávať vyššie spomenutú funkcionalitu bez striktných legálnych obmedzení. OpenTTD už podľa svojho názvu vzbudzuje dojem, že v hre nie je núdza o rôzne formy doplnkov, či už z oblasti grafiky alebo hrateľ- nosti hry. Tieto doplnky môžu byť vytvorené aj komunitou hry. Takto vytvorené doplnky sú voľne dostupné a ďalej modifikovateľné podľa vlastnej potreby.

2.1 Cieľ hry

Cieľom hry je dosiahnuť čo najväčšiu hodnotu spoločnosti v ustano- venom konečnom čase (typicky do roku 2050). Hodnota spoločnosti zahrňuje celkový príjem, počet staníc, dopravných prostriedkov, doru- čeného tovaru a podobne. Na dosiahnutie tohto cieľa sú k dispozícii tieto druhy prepravy:

• cestná – najlacnejšia, výhodná aj v neskorších štádiách hry, pri rozvíjaní mesta,

• železničná – možnosť prevozu iba jednej vlakovej súpravy na určitom úseku železnice v daný čas,

• letecká – najrýchlejšia, drahá, potreba širokého priestoru pre letiská,

• lodná – najpomalšia, výhodná v neskorších štádiách hry.

3 2. Open Transport Tycoon Deluxe

Hra začína v roku 1950 s vygenerovanými mestami a priemys- lami, podľa daných špecifikácií hry (nastavenie sa dá zmeniť pred začatím hry). Kdekoľvek na mape je možná stavba staníc a následná preprava tovaru alebo ľudí z jednej stanice do druhej. Kúpa doprav- ného prostriedku je možná v depe. Pre každý typ dopravy je iné depo. Následne, podľa nastavenia jednotlivého dopravného prostriedku, je možné určiť spôsob plnenia nákladu (percentuálne, vždy doplna). Vý- sledná cena za prepravu daného materiálu alebo ľudí je potom určená jeho množstvom, vzdialenosťou staníc a rýchlosťou prepravy. V hre je zavedené takzvané starnutie dopravných prostriedkov, čiže je po- trebná neustála kontrola spoľahlivosti liniek a obmieňanie chybných dopravných prostriedkov.

2.2 Popis hry

Po vygenerovaní mapy sa hráč ocitne vo svete plnom osamelých prie- myselných zón a miest. Hráč sa môže cítiť bezradne, lebo na prvý pohľad nemusí byť vôbec jasné, ako v hre postupovať. Napriek tomu je veľmi jednoduché pochopiť, ako a kde hľadať potrebné veci. Všetko v OpenTTD sa dá ovládať z hlavného horného panela hry. Hráč tam nájde všetko potrebné, od grafického nastavenia hry až po signalizačné semafory pre vlaky. Pred začatím stavby si najprv hráč musí rozmyslieť a zrátať, ktorá možnosť je pre neho podľa dostupných údajov na mape najvýhodnejšia. Keď sa hráč rozhodne pre cestnú dopravu, stačí kliknúť na ikonku cesty a tam nájde všetko potrebné pre jej realizáciu. Rovnaký postup sa aplikuje aj pre ostatné typy dopravy.

2.2.1 Cestná doprava Na začiatku novej hry si hráč prevažne vyberie cestnú dopravu ako prvú. Je to preto, že je rádovo nenáročné ju zaviesť a taktiež je to najlacnejší druh na stavanie infraštruktúry. Avšak potrebujeme rozlišovať dva typy cestnej dopravy, a to auto- busovú a nákladnú. I keď sa oba typy vozidiel dajú zakúpiť v jednom depe, líšia sa ich stanice, z ktorých dokážu odviezť alebo priviezť tovar. Autobusy dokážu nabrať alebo vyložiť cestujúcich iba pri au-

4 2. Open Transport Tycoon Deluxe

tobusových zastávkach. Vozidlo nákladnej dopravy dokáže podľa svojej špecifikácie prepraviť daný tovar, avšak iba medzi nákladnými zastávkami. Jednou z nevýhod cestnej dopravy je tá, že sa ľahko môže stať terčom útokov ostatných hráčov. Môžu napríklad postaviť železničné priecestie cez cestu autobusu a nechať tam stáť vlak. Autobus premá- vajúci po tejto ceste si s tým nevie poradiť a ostane čakať na uvoľne- nie. Môžu taktiež postaviť rýchly vlak cez cestu a predpokladať, že sa mu podarí autobus zničiť [Wikg]. Keď vlak prechádza cez železničné priecestie, nečaká na uvoľnenie autobusu, ale pokračuje v ceste. Týmto spôsobom nastane dopravná nehoda. Tieto skutočnosti zužitkujeme pri vypracovaní zadania.

Obr. 2.1: Stavebné menu pre cestnú dopravu

2.2.2 Železničná doprava Železničná doprava je skvelým typom prepravy na stredne dlhé vzdia- lenosti. Výhodou oproti cestnej doprave je napríklad tá, že koľaj je možné postaviť aj diagonálne, čo je veľmi prínosné pri jej stavbe a návrhu. Existujú štyri typy železničnej dopravy, ktoré sa odomy- kajú podľa daného roku hry, a to parná, elektrická, monorail a mag- lev. Každý z nich má svoje výhody , ale prevažne platí, čím novší tým spoľahlivejší a rýchlejší.

Obr. 2.2: Stavebné menu pre železničnú dopravu

5 2. Open Transport Tycoon Deluxe

2.2.3 Letecká doprava Letecká doprava je v hre tou najrýchlejšou možnosťou prepravy, či už tovaru alebo pasažierov. Najvýhodnejšia je medzi mestami, ktoré sú od seba diagonálne vzdialené. Keďže lietadlá využívajú vzdušný priestor na prepravu, nie je nutné stavať ďalšiu infraštruktúru. Ďalšou výhodou je, že každé letisko má zabudované depo pre lietadlo a nie je potrebné ho postaviť externe, ako pri cestnej alebo železničnej doprave. Lietadlá môžu byť taktiež prerobené na prepravu materiálov. Nedokážu tým však konkurovať preprave materiálov za použitia vlakovej dopravy. Najväčší výnos prináša preprava pasažierov z veľkých miest ďaleko od seba [Wikc]. Pri preprave lietadlom na toto lietadlo nevplývajú žiadne okolité faktory, ako napríklad pri cestnej alebo železničnej doprave. Preto je aj najodolnejšia voči útokom od iných spoločností.

2.2.4 Lodná doprava Lodná doprava dokáže prepraviť najväčšie množstvo tovaru zo všet- kých štyroch možností prepravy. Je ale najpomalšia. Môže sa teda stať, že pri začiatku hry trvá dlhý čas, kým začne loď zarábať, pretože mestá ani priemysly nie sú dostatočne rozvinuté. Veľkou výhodou, ako aj u leteckej dopravy je to, že nemusíme stavať žiadnu infraštruktúru navyše. Loď sa dostane všade, kde je voda (samozrejme treba myslieť na rozmery lode). Taktiež pri nakladaní a vykladaní nemusia lode na seba čakať. V jednom prístave môže vykladať a nakladať viacero lodí súčasne [Wikh]. Tak isto ako autobusová doprava je lodná doprava ľahkým terčom pre ostatné spoločnosti. Keďže voda nepatrí nikomu, môže na nej stavať ktokoľvek a obstavať alebo zatarasiť loď. Týmto hráč zamedzí pohyb lode a loď nemá inú možnosť, ako len čakať na odstránenie obmedzenia.

6 3 Programové prostredie

OpenTTD nám poskytuje jednoduché programové prostredie, na kto- rého obsluhu nie je potreba externých služieb. Stačí iba samotná hra a ľubovolný textový editor. Na implementáciu AI sa používa skripto- vací jazyk Squirrel1. Komunikácia medzi AI a hrou spočíva výhradne cez API (application programming interface). API funkcie používa framework s vtipným názvom NoAI framework2, ktorého funkcie sa využívajú pri tvorbe AI.

3.1 Squirrel

Samotné OpenTTD je naprogramované v jazyku ++, no na vývoj vlastného AI je podpora iba pre jazyk Squirrel. Tento jazyk bol zvolený predovšetkým vďaka jeho malým nárokom na pamäť a podobnosťou k materskému jazyku OpenTTD [Wika]. Má taktiež multiplatformovú podporu a výhodou jeho použitia je aj rýchlosť. Ďalším plusom pri použití Squirrelu na programovanie AI je, že prípadná chyba v kóde AI nespôsobí pád celého programu, ale iba pád virtuálneho stroja, ktorý hra využíva pri jej behu. Tak ako uvádza hlavná stránka jazyka [Dem16], Squirrel je im- peratívny, vysoko úrovňový, objektovo orientovaný programovací jazyk navrhnutý na jednoduché skriptovanie. Squirrel sa prevažne používa vo video hrách. Jeho syntax pripomína C/C++ no povahovo sa podobná na Lua alebo Python. Na rozpoznanie súboru Squirrel sa používa koncovka „.nut“ (orech). Medzi jeho prvky patria:

• dynamická typová kontrola, • spolupracujúce vlákna, • triedy a dedičnosť, • chvostová rekurzia, • delegácia, • spracovanie výnimiek, • vysoko prioritné funkcie, • automatická správa pamäti, • generátory, • slabé referencie.

1. www.squirrel-lang.org/ 2. http://noai.openttd.org/docs/1.8.0/

7 3. Programové prostredie

Napriek tomu, že vývoj jazyka Squirrel stále pokračuje, OpenTTD naďalej používa verziu jazyka 2.2.5. Dôvodom je modifikácia niekto- rých funkcií od vývojárov hry. Preto je pri tvorbe AI potreba čítať dokumentáciu API a Squirrelu (verzia 2.2.53) pre verzie, ktoré hra používa. Môže totiž nastať situácia, že daná funkcia sa v predošlej verzií nenachádza. Doplnenie knižnice, ktorá nie je explicitne v hre, je samozrejme možné, no znamenalo by to nutnosť znovu preloženia hry.

3.2 NoAI framework

Od verzie hry 0.7.0 je záujemcom sprístupnené API pre tvorbu vlast- nej, alebo vylepšovanie už zverejnenej, AI [Tea]. Pri druhej možnosti si treba dávať pozor na prípadnú licenciu používania, ktorá je pridaná v zložkách AI. Licenciu je nutné si dobre preštudovať a porozumieť jej jednotlivým bodom. Pri tvorbe AI je doporučené používať tú najnovšiu verziu API, aktuálne 1.8.0 (Marec 2018). Súčasťou NoAI framework sú aj rôzne knižnice na zjednoduše- nie implementácie, napríklad hľadanie cesty medzi dvoma bodmi na mape. Týmto príkladom sú knižnice pathfinder.road alebo pathfin- der.rail, ktoré využívajú algoritmus A*, bližšie popísaný aj Danielom Dellingom [Del+09], na hľadanie najlepšej cesty podľa zadaných para- metrov.

3. http://www.squirrel-lang.org/doc/squirrel2.html

8 3. Programové prostredie

3.3 Štruktúra AI

Na to, aby hra OpenTTD rozpoznala AI a zaradila ju do svojho zo- znamu, musí splniť pár jednoduchých podmienok. AI musí obsahovať minimálne 2 súbory, a to info.nut a main.nut. Celá AI musí byť ulo- žená v jednej zložke pomenovanej podľa názvu danej AI. Táto zložka sa musí nachádzať v adresári /ai, ktorá je umiestnená v koreňovom adresári hry. Základná štruktúra by mala teda vyzerať nasledovne:

OpenTTD | - ai | - TestAI | - info.nut | - main.nut | - SimpleAI | - ...

Súbor info.nut je potrebný na odovzdanie informácie, že AI existuje a chce prevziať kontrolu nad spoločnosťou. Musí implementovať jed- notlivé funkcie (ako na obrázku 3.1), ako napríklad názov AI, či meno autora. Ďalej medzi voliteľnými funkciami môže udávať svoje nasta- venia, ako napríklad obtiažnosť či jednotlivé obmedzenia dopravy. Poslednou podmienkou je registrácia AI pomocou funkcie Registe- rAI().

1 c l a s s TestAI extends AIInfo { 2 function GetAuthor() { return"Michal Zopp";} 3 function GetName ( ) { return"TestAI";} 4 function GetDescription() { return"This is just for presentation.";} 5 function GetVersion() { return 1; } 6 function GetDate() { return"2007 −03−17";} 7 function CreateInstance() { return"TestAI";} 8 function GetShortName() { return"TSAI";} 9 function GetAPIVersion() { return"1.0";} 10 } 11 12 RegisterAI(TestAI() ) ; Listing 3.1: Príklad info.nut súbora

9 3. Programové prostredie

V súbore main.nut sa nachádza hlavná implementácia danej AI (samozrejme môže používať aj ďalšie vytvorené .nut súbory, musí však zdeliť ich použitie cez funkciu require()). Je nutné, aby tento súbor obsahoval funkciu Start(), ktorá je volaná pri spustení AI. Ak prog- ram opustí túto funkciu, AI „ukončí svoju činnosť“, preto je častým riešením mať vo funkcii Start() nekonečný cyklus.

1 c l a s s TestAI extends AIController 2 { 3 function Start(); 4 } 5 6 function TestAI:: Start() 7 { 8 while(true){ 9 } 10 } Listing 3.2: Príklad jednoduchého main.nut súbora

3.4 Práca s AI

Ladenie skriptov môže byť všeobecne celkom náročné. OpenTTD ale poskytuje jednoduché nástroje na prácu s hláškami programu. Na práci s AI v hre je možné využívať dve veci:

• konzolu – zadávanie príkazov pre hru,

• Game Script Debug – zisťovanie stavu a výpis AI.

Konzolu zobrazíme a skryjeme buď cez Help → Toggle Con- sole, alebo stlačením klávesy ~ (tilda). Zadaním príkazu list_cmds sa na výstup vypíše zoznam príkazov, ktoré hra podporuje. Okrem prí- kazov pre ovládanie servera sú dostupné aj príkazy, ktoré sú vhodné pri testovaní AI. Sú to napríklad príkazy:

10 3. Programové prostredie

• startai – spustí AI s daným názvom,

• stoptai – ruší AI s daným ID spoločnosti,

• reloadai – reštartuje AI s daným ID spoločnosti,

• rescanai – znovu načíta všetky AI v hre,

• restart – reštartuje celú hru na nastavený začiatok.

Game Script Debug sa spúšťa cez Help → AI/Game Script Debug. Ná- sledne sa zobrazí okno, kde má každé AI vlastnú kolónku (rozdelené podla farby spoločnosti) a svoj konzolový výstup. V tomto výstupe sa zobrazujú všetky hlášky, ktoré AI vypisuje. Zobrazujú sa tu nielen syntaktické chyby pri načítavaní jednotlivých súborov, ale aj chyby za behu. Vývojár tu uvidí aj svoje hlášky informačného charakteru danej AI, ktoré sa zapisujú cez triedu AILog z NoAI framework. Body prerušenia sa taktiež realizujú cez Game Script Debug okno. Je ale po- treba v konzole zadať príkaz set gui.ai_developer_tools 1 a ďalej uviesť na ktorom konkrétnom informačnom výpise sa má AI zastaviť.

11 4 Typy útokov a obrana

Hra nás nenavádza k žiadnym útokom proti ostatným hráčom, ale nechcene nám poskytuje spôsoby, ako môže hráč potenciálne zaútočiť na iného hráča. Hráč sa snaží útokom docieliť zmenšenie zisku protiv- níka. Najúčinnejšie je však keď z dôvodu útoku daný hráč prerába na svojej pôvodnej investícií. Keď chce byť hráč úspešný, musí si útoky na seba všímať, a aby nestratil priveľa peňazí naň včas zareagovať. Útok nemusí byť mierený len na jedného hráča. Viac hráčov môže využívať pri cestnej doprave jednu a tú istú cestu, hráči môžu operovať v jednom meste, a podobne. V takom prípade je teda úspech útoku väčší, lebo sa priamo dotkol viacerých spoločností. Útoky sa dajú rozdeliť podľa typu dopravy, na ktorú sa snažia zamerať:

• cestné,

• železničné,

• letecké,

• lodné.

Ďalej podľa miesta, kde sa daný útok odohráva:

• mesto – útok realizovaný v meste alebo v blízkosti priemyselnej zóny,

• mimo mesta – útok realizovaný prevažne medzi dvomi zastáv- kami dopravy.

4.1 Cestná doprava

Z dôvodu ľahkej dostupnosti cestnej dopravy po finančnej stránke, sú útoky na ňu, v porovnaní s útokmi na iné typy dopravy, najlacnej- šie. K tomu, aby mohla cestná doprava fungovať a vynášať je potrebné zaobstarať päť vecí: začiatočnú stanicu, koncovú stanicu, cestu medzi stanicami, depo a dopravný prostriedok. Pri útoku sa zameriavame na tieto veci a snažíme sa ich ovplyv- niť. Kolízia dopravných prostriedkov v OpenTTD medzi sebou na

12 4. Typy útokov a obrana

cestách nie je možná, preto útok takýmto spôsobom nebude úspešný. Keďže hráč nemá prístup k staniciam, k depu a ani dopravným pros- triedkom, a celkovo majetku iného hráča, ostáva nám iba ovplyvnenie cesty medzi dvoma stanicami. Útoky na ceste môžeme realizovať dvomi spôsobmi: • zablokovanie cesty vlakom – zastavenie vlaku na železničnom priecestí, • odstránenie cesty – výmena políčka cesty za železničné koľaje.

4.1.1 Zablokovanie cesty Najefektívnejšie zablokovanie cesty vlakom (obrázok 4.1) docielime tak, že na cestu postavíme jednu železničnú koľaj a hneď za ňu po- stavíme depo pre vlaky tak, aby smerovalo k danej ceste. Kúpime v danom depe vlak a necháme ho zastavený na priecestí. Pri tomto spôsobe budú autá čakať na uvoľnenie priecestia, kým nepošleme vlak do depa. Takéto zablokovanie cesty nie je finančne náročné. Túto metódu môžeme využiť aj viackrát bez nutnosti stavania novej zátarasy. Ak sa daný hráč polepšil, vlak pošleme do depa, ak sa pohoršil, vlak znovu zastavíme na ceste.

Obr. 4.1: Jednoduché zablokovanie cesty

Proti takémuto zablokovaniu cesty môžeme vybudovať jednodu- chú obchádzku okolo železničného priecestia, tak ako na obrázku 4.2 vľavo. Avšak ak si chceme byť na sto percent istý, že nám hráč neza- blokuje novo vytvorenú obchádzku postavíme cez železničné koľaje

13 4. Typy útokov a obrana

most, ako napríklad na obrázku 4.2 vpravo. Keďže my tento most vlastníme, daný hráč nám už nemôže urobiť novú zátarasu na tom istom mieste.

Obr. 4.2: Príklad obchádzky pre jednoduchú aj pokročilú blokádu cesty

4.1.2 Odstránenie cesty

Odstránenie cesty môžeme urobiť iba v prípade, že danú cestu vlast- níme, alebo cesta patrí mestu a my máme v tom meste pozitívnu reputáciu. V tomto prípade môžeme odstrániť cestu a na políčko po- staviť železničnú trať, ako napríklad na obrázku 4.3. Takto zamedzíme cestnej doprave prejazd po ceste. Auto ktoré tadiaľ bude chcieť prejsť nebude vedieť nájsť cestu do svojej cieľovej stanice (keďže sme ju zru- šili) a „stratí sa“.

Obr. 4.3: Zablokovanie príjazdovej cesty do mesta

14 4. Typy útokov a obrana

Tento fakt sa ale majiteľovi vozidla hneď oznámi (obrázok 4.4) a preto je tento útok ľahko odhalitelný. Nevýhodou takéhoto útoku je aj znížene reputácie hráča, ktorý zrušil cestu v danom meste. Na obranu proti zničenému políčku v meste môžeme jednoducho nájsť cestu okolo, poprípade vybudovať inú cestu von z mesta.

Obr. 4.4: Vozidlo je stratené

4.1.3 Boj o náklad V OpenTTD sa zarába výhradne prepravou tovaru alebo surovín z jed- nej stanice do druhej. Zber tovaru alebo surovín v stanici docielime tým, že stanicu postavíme v blízkosti priemyslu alebo mesta. Podľa typu dopravného prostriedku, na ktorý je stanica určená, môžeme usúdiť rozlohu, z ktorej stanica zbiera materiál [Wikd]. Pri stanici určenej na cestnú prepravu to sú tri políčka okolo stanice v každom smere, pri železničnej stanici štyri. Keď sa postavia okolo jedného priemyslu alebo mesta dve stanice od odlišných hráčov na zber nákladu, nastáva súperenie o náklad (ob- rázok 4.5). Množstvo prideleného materiálu staniciam je závislé od ich Station Rating. Ten je ovplyvnený mnohými faktormi, ako napríklad: • rýchlosť vozidiel, • rok výroby vozidiel, • množstvo materiálu v stanici čakajúceho na prevoz, • zrážky vozidiel v okolí stanice. Množstvo prideleného materiálu sa vypočíta ako: Station Rating × (kvantum + 1) 1 (4.1) Station Rating1 + Station Rating2

15 4. Typy útokov a obrana

Kde Station Rating1 je ohodnotenie prvej stanice v bodoch a Station Rating2 je ohodnotenie druhej stanice v bodoch. Kvantum znamená množstvo vyprodukovaného materiálu. Vzorec (4.1) pre výpočet je popísaný v herných postupoch hry [Wiki]. Pri postavení dvoch a viacerých staníc blízko seba môžeme teda usúdiť , že sa jedná o útok a hráč si ho nemusí ani všimnúť. Obrana proti takémuto útoku nie je jednoduchá. Ak sa jedná o cestnú do- pravu, môžeme súperovi zablokovať prístupovú cestu k stanici naprí- klad železničným priecestím, ako je popísane v sekcií 4.1.1. Lepší prínos ale je, keď si hráč začne zlepšovať vozidlá a zvýši aj ich počet. Týmto sa zvýši na stanici jej Station Rating a tým pádom (podľa (4.1)) pôjde na danú stanicu viac materiálov. To spôsobí, že oponent nebude dostávať kargo na svoju stanicu a investícií začne prerábať.

Obr. 4.5: Príklad dvoch staníc pri jednom priemysle

4.2 Ostatné typy dopravy

Oproti cestnej doprave, ďalšie typy prepravy nemajú vo všeobecnosti také účinne útoky na prepravu materiálu alebo pasažierov. Napriek tomu, všetky zdieľajú jednu spoločnú vec. Keďže každý typ dopravy musí mať na linke začiatočnú a konečnú stanicu, ide teda o súperenie medzi stanicami (bližšie popísané v sekcií 4.1.3).

16 4. Typy útokov a obrana

4.2.1 Železničná doprava Železničná doprava je špecifická tým, že pri postavení každej položky zo železničného menu (obrázok 2.2), má k danému políčku exkluzívne práva iba hráč, ktorý ho postavil. Nemôžeme teda postaviť krížiacu železničnú trať cez trať niekoho iného, pretože nemáme právo stavať na jeho políčku. Môžeme však postaviť cestu cez železničnú trať iného hráča a tým vytvoriť železničné priecestie. Keď potom tou cestou pošleme naše nákladné autá tak je malá šanca, že auto príde na železničné prieces- tie skôr ako vlak. Pri východzích nastaveniach hry vlak auto prejde a auto sa zničí, zatiaľ čo vlak ostane nepoškodený [Wikg]. Keďže vlak sa nepoškodí vôbec, tento spôsob útoku je neefektívny, priam viac uškodí nám za stratu vozidla. Taktiež šanca zrazenia auta na želez- ničnom priecestí vlakom je príliš nízka na to, aby bol vlak použitý na odstraňovanie súperových vozidiel z ciest.

Obr. 4.6: Príklad zrazeného auta na priecestí a následná správa

17 4. Typy útokov a obrana

4.2.2 Letecká doprava Letecká doprava je špeciálna tým, že nepotrebuje žiadne médium medzi začiatočnou a cieľovou stanicou, preto nemôžeme predpokladať priamu trasu letu. Hra je nastavená tak, že vo vzduchu nemôže nastať kolízia dvoch lietadiel. Autorita v meste obmedzuje celkový počet letísk a heliportov vo svojom okolí. Typicky je možná stavba maximálne dvoch, nastavenie sa ale dá zmeniť. Možným útokom je teda zistiť, v ktorom meste má protihráč dobrú reputáciu a postaviť v ňom heliport alebo letisko. Au- torita mesta potom nedovolí protihráčovi v meste postaviť letisko a hráč je nútený si zvoliť iný spôsob prepravy.

4.2.3 Lodná doprava Lodná doprava sa v OpenTTD vyznačuje tým, že má najdlhší čas pre- pravy tovaru. V hre nie je možná kúpa políčka, na ktorom je voda. Je- diným spôsob, ako sa k zakúpeniu políčka na vode môžeme priblížiť je postaviť na ňom depo pre lode. Okrem možnosti boja o náklad je lodná doprava ľahkým terčom pre zablokovanie samotnej lode. Toto sa dá docieliť ohraničením lode (obrázok 4.7) lodnými depami. Depo pre lode je lacnou investíciou a zároveň zaberá dve políčka na mape. Treba brať ohľad na to, že depo je prejazdné obojstranne (oproti vchodu do depa je východ). Preto je nutné stavať zátarasu bočnou stranou k danému objektu. Okrem ohraničenia samotnej lode je možné aj obklopiť lodnej stanice depami a tým zamedzenie prístupu lode do stanice.

Obr. 4.7: Príklad zablokovania lode v prístave

18 5 Výber vhodnej umelej inteligencie

AI dostupné pre hru OpenTTD môžeme nájsť na hlavných stránkach hry v zozname AI1. Jej vlastnosti a charakteristiku môžeme dohľadať v príslušnom fóre (napríklad AI Convoy2). Fóra vytvárajú a spravujú samotní autori danej AI. Pri výbere vhodného kandidáta na rozšírenie jeho emočného sprá- vania bude treba predovšetkým dávať dôraz na možné útoky (popí- sane v kapitole 4). Zvolená AI by mala:

• implementovať prevažne cestnú a železničnú dopravu,

• podporovať ukladanie a načítavanie hry,

• podporovať prenos ľudí a tovaru/materiálu,

• uchovávať informácie o vozidlách ktoré AI vlastní,

• uchovávať informácie o začiatočnej a koncovej stanici trasy.

Celý Zoznam obsahuje 38 AI (jar 2018) určených pre chod spoloč- nosti. Stanoveným požiadavkám vyhovuje iba šesť z nich (tabuľka 5.1). Na účel podrobnej analýzy možného zakomponovania emocionál- neho správania sú ďalej bližšie analyzované už iba tri: AdmiralAI, DictatorAI a SimpleAI.

1. https://bananas.openttd.org/en/ai/ 2. https://www.tt-forums.net/viewtopic.php?f=65&t=37946

19 5. Výber vhodnej umelej inteligencie

AI stiahnutia doprava poznámky (jar 2018) AdmiralAI 727792 všetky ok- zložité stavanie ciest rem lodnej NoCAB 267914 všetky skončená podpora, pokra- čovanie v NoNoCAB DictatorAI 62578 všetky časté chyby za behu AIAI 59577 všetky ok- zlá stavba vlakov, chyby za rem lodnej behu SimpleAI 33185 všetky ok- jednoduché cesty, stabilita rem lodnej NoNoCAB 8943 všetky chyby pri stavaní zastávok, chyby za behu

Tabuľka 5.1: Zostávajúce AI po aplikácií uvedených parametrov

5.1 AdmiralAI

AdmiralAI3 je jednou z najstarších vytvorených AI vôbec. Je taktiež najsťahovaňejšou z celého zoznamu. Bola vytvorená samotným vývo- járom hry pod prezývkou Yexo (vlastným menom Thijs Marinussen) a jeho posledná stabilná verzia (v. 26) je z roku 2011. Cieľom tejto AI je implementovať všetky druhy dopravy (okrem lodnej), za účelom čo najväčšej zábavy pre súperov. AdmiralAI sa často používa na porovnávanie výkonu iných AI, predovšetkým kvôli stabilite a dobrej výkonnosti. Jeho dobre členený zdrojový kód, roz- delený do jednotlivých modulov podľa dopravy, slúži k inšpirácií aj iných AI. Práve jeho diverzita pri výbere prepravy a celková zložitosť pri stavaní ciest nevylučuje aj niekoľko zastávok na jednej trase. Kvôli ná- ročnejšej štruktúre stavby ciest, by monitorovanie už postavených trás bolo obzvlášť zložité. V neskorších štádiách hry taktiež AdmiralAI vy- tvára cestnú dopravu iba výnimočne. Kvôli týmto charakteristikám nie je vhodným kandidátom na implementovanie emočného správania.

3. https://www.tt-forums.net/viewtopic.php?t=38057

20 5. Výber vhodnej umelej inteligencie 5.2 DictatorAI

Podľa počtu stiahnutí je DictatorAI4 v spodnej polovici zoznamu. Bola vytvorená autorom pod prezývkou Krinn začiatkom roku 2011, jeho posledná verzia (v. 183) bola vydaná v roku 2015. Hlavným cieľom DictatorAI je používať všetky formy dopravy a zároveň znovu použitie už vytvorených ciest a staníc. Vďaka tomu, že sa snaží už postavené cesty rozširovať nedosahuje také zisky ako iné AI (ako napríklad AdmiralAI, ktorý buduje podľa potenciálneho zisku). Čiastočnou inšpiráciou DictatorAI je práve AdmiralAI. Vďaka jeho snahe o znovupoužitie ciest a staníc sa ale dostáva často do problému, keď si zničí vlastnú cestu a tým zabráni priechodu vozi- diel (podobná obdoba, ako pri 4.3). V jeho verziách kódu sa tiež často krát objavujú chyby, ktoré sa prejavia až za behu programu. Pre tieto nedostatky DictatorAI nie je vhodný pre implementáciu emotívneho správania.

5.3 SimpleAI

SimpleAI5 sa snaží replikovať AI, ktoré bolo v originálnej hre TTD. Jeho tvorcom je Brumi a do dnes je stále udržiavané. Posledná verzia (v. 12) je z Mája 2017. SimpleAI využíva jednoduché linky, ktoré majú dve stanice (za- čiatočná a koncová) presne tak, ako to robila pôvodná AI v TTD. Na prepravu využíva cestnú, železničnú a leteckú dopravu. SimpleAI si vedie dobrú štruktúru pri každej postavenej trase (začiatok, ko- niec, typ prepravy, zoznam vozidiel a podobne). Výber prepravy je pri SimpleAI skorej náhodný. Do jeho výberu sa zaráta iba vzdialenosť jednotlivých staníc. Pri menších vzdialenostiach si AI vyberá cestnú dopravu, pri stredných železničnú a pri veľkých leteckú. Úroveň sú- perenia SimpleAI sa dá pred začatím hry nastavovať, takže vie byť aj konkurencie schopná. Vďaka spomenutým hlavným charakteristikám (prevažne dobrej správe cestných liniek) je SimpleAI vhodnou AI pre implementáciu emotívneho správania.

4. https://www.tt-forums.net/viewtopic.php?t=52982 5. https://www.tt-forums.net/viewtopic.php?f=65&t=44809

21 6 EmotionAI

Hlavným cieľom práce je implementácia emotívneho správania do už existujúcej AI v OpenTTD. Na základe analýzy existujúcich AI, popí- sanej v predošlej kapitole, bola ako vhodný kandidát vybraná Sim- pleAI, ktorá bude ďalej rozšírená o emočné správanie. Výsledná AI bola pomenovaná EmotionAI. Cieľom EmotionAI je simulovať správanie reálneho hráča, ktorý dokáže reagovať na útoky zo strany konkurencie. Následne, podľa vy- hodnotenia útočnosti, opláca EmotionAI útoky aj naspäť, čím simuluje hnev reálneho hráča.

6.1 Základné vlastnosti EmotionAI

Ešte pred začatím vývoja EmotionAI bolo treba stanoviť, aké útoky bude AI rozpoznávať, a ako bude na dané situácie reagovať (bližšie popísane v kapitole 4). AI teda implementuje detekčné a obranné vlastnosti: • detekciu cestnej blokády na trasách svojich vozidiel, • vytvorenie obchádzky pri cestnej blokáde, • uchovávanie informácií o cestnej blokáde (miesto, autor), • detekcia kradnutia tovaru pri svojich staniciach, • uchovávanie informácií o krádeži tovaru (miesto, autor), • detekcia odstránenia cesty v meste iným hráčom, • vytvorenie obchádzky pri odstránení cesty iným hráčom, • detekcia odstránenia cesty pred cestným depom, • vytvorenie nového depa v prípade odstránenia pôvodného.

22 6. EmotionAI

Ďalšia implementačná sekcia je nazvaná útočná. AI v nej imple- mentuje nasledovné útočné vlastnosti: • vytvorenie cestnej blokády medzi stanicami, • zničenie cestného políčka medzi stanicami, • zakúpenie reklamných kampaní v meste, • zaplatenie cestnej rekonštrukcie v meste, • postavenie heliportu v meste, • obstavenie mesta železničnými koľajami na zamedzenie rastu1. Na to, aby bolo zaručené ukladanie a načítanie dátového modelu EmotionAI je potrebné implementovať funkcie Save a Load. Toto zaručí lepší zážitok pri hraní proti EmotionAI, pretože pri použití funkcií sa zachováva celkový kontext hry.

6.2 Návrh a implementácia EmotionAI

Hlavnou myšlienkou pri implementácií EmotionAI bola práca so zo- znamom hráčov. Tento zoznam je implementovaný triede v Player Manager, ktorý je súčasťou EmotionAI. Player Manager si udržuje jed- notlivé informácie o hráčoch v hre, a ďalej komunikuje s vytvorenými triedami (obrázok 6.1).

EmotionAI

Banker Manager Builder

Player Manager Rail Builder Aircraft Builder

Player

Towns Road Blockade Pathfinder

Obr. 6.1: Ukážka závislostí medzi triedami v EmotionAI

1. https://wiki.openttd.org/Towns#Town_Growth

23 6. EmotionAI

6.2.1 Player Manager a Player

Player Manager udržiava pole Playerov pevnej dĺžky 15. Pole musí byť pevnej dĺžky, pretože novej spoločnosti sa prideľuje číslo pri vstúpení do hry. Toto číslo ostáva počas života spoločnosti, až do jej opustenia hry, nemenné. Celkový počet možných hráčov je 255, no v hre môže byť maximálne 15 spoločností. Môže byť teda viac hráčov pripoje- ných, musia ale potom spoločne ovládať jednu spoločnosť [Wikf]. Trieda Player reprezentuje jednotlivé spoločnosti. Tento názov je z toho dôvodu, že sa nepredpokladá spoločné ovládanie jednej spo- ločnosti (nie je to časté). Trieda je ale plne kompatibilná aj pri ovládaní viacerými hráčmi. Trieda si udržuje karma body daného hráča a pou- žíva inštanciu triedy Towns (popísané v 6.2.2). Karma body slúžia k zis- teniu, ako sa hráč v minulosti správal voči EmotionAI. Hodnota karma bodov je [0–200], pričom východzia hodnota je 100 bodov. Vždy, keď bude AI evidovať (popísané v 6.1) zlé správanie hráča, zníži hráčovi karma body. EmotionAI karma body aj pripočítava, ak zistí, že hráč svoj zlý čin napravil (odstránil zablokovanú cestu, zrušil stanicu blízko stanice AI, ...). Pripočítava samozrejme menšiu hodnotu, ako odpočítava. Keď zistí, že sa hráč polepšil (má veľkú hodnotu karma bodov), odstráni svoje vytvorené zátarasy voči danému hráčovi.

6.2.2 Towns

Trieda Towns slúži na udržiavanie pola miest, kde má daný hráč dobrú reputáciu. NoAI framework nám umožňuje zisťovať hodnotu reputácie spoločnosti v danom meste. Hodnota reputácie je v rozmedzí [1–8], kde jedna je najhoršia a osem najlepšia hodnota. Hodnota tri a vyššie indikuje, že daný hráč sa zaujíma o rozvoj mesta, a je veľká pravdepodobnosť, že v ňom má postavené stanice [Wike]. V prípade, že sa EmotionAI rozhodne pre útok na daného hráča, zavolá funkciu DecideAndPunish() (alebo DecideAndPunishMore()). AI si potom usporiada zoznam miest podľa reputácie a snaží sa zaútočiť na mestá, kde je hodnota najväčšia (ak sa útok nepodarí, pokračuje na nasledujúce mesto v zozname). Závažnosť útoku závisí na počte karma bodov hráča (čím menší počet, tým viac účinný útok).

24 6. EmotionAI 6.3 Implementačné detaily

EmotionAI používa na detekciu, obranu a útoky (kapitola 4) rôzne algoritmy. Všetky algoritmy a postupy boli nevrhnuté autorom práce. V nasledujúcich častiach sú vybrané tie najzaujímavejšie a po- písane detaily alebo problémy ich implementácií.

6.3.1 Nájdenie obchádzky cez priecestie Jednou s hlavných úloh EmotionAI bola detekcia a postavenie ob- chádzky pri zablokovanej ceste (tak, ako popisuje kapitola 4.1.1). NoAI framework poskytuje triedu pathfinder.road2, ktorú EmotionAI pou- žíva na detekciu zablokovanej cesty. Keď sa nastavia dané parametre tak, aby iba cestu hľadal a nestaval, vráti zoznam políčok, kadiaľ vedie cesta. Cestu potom môžeme prechádzať a zistiť, či je na danom políčku železničné priecestie (pomocou funkcie IsLevelCrossingTile()3). API ne- dovoľuje zisťovať, či sa na danom políčku nachádza protihráčov vlak. Dovoľuje získavať informácie iba o dopravných prostriedkoch, ktoré vlastní EmotionAI. Nevieme teda s istotou určiť či sa jedná o cestnú blokádu. V dôsledku tohto obmedzenia môže nastať situácia, kde AI vyhodnotí, že na políčku je zátarasa, pričom v skutočnosti nie je.

Obr. 6.2: Príklad pre použitie funkcie IsLevelCrossingTile()

2. https://wiki.openttd.org/AI:RoadPathfinder#Initialization 3. http://noai.openttd.org/docs/1.8.0/classAIRail.html# 51cf344269103ee3b00b79a2c1962f1a

25 6. EmotionAI

Keďže hore popísaný spôsob má nedostatky, EmotionAI implemen- tuje spôsob detekcie spravovaním svojich dopravných prostriedkov na trati, a ďalej zisťuje ich aktuálnu polohu (pomocou funkcie GetLo- cation()4). Pri tomto spôsobe nevzniká falošná detekcia zátarasy. Keď EmotionAI zistí, že vozidlo sa dlhšiu dobu nachádza na rovnakom políčku (prípady, keď vozidlo nakladá/vykladá tovar sú ošetrené) a zároveň má pred sebou železničné priecestie, s istotou predpokladá zátarasu. Zapamätá si preto dané políčko a zníži autorovi zátarasy karma body. Ďalej EmotionAI začne s obrannou fázou. Pri obrannej fáze otočí všetky vozidlá na danej trati, aby nepreká- žali pri stavaní obchádzky, a snaží sa vyhľadať najlepšiu cestu pomo- cou pathfinder.road. Ten však štandardne nachádza najlacnejšiu cestu a nie je prispôsobený na hľadanie železničných obchádzok. Preto je nutná modifikácia danej knižnice. Modifikácia spočíva v priradení najväčšej možnej ceny na políčko s priecestím. Tým docielime nájdenie novej cesty, ktorá neobsahuje políčka so železničným priecestím.

6.3.2 Identifikácia a reakcia na odstránenie cesty v meste

Keď už poznáme, ako nastaviť pathfinder.road pre nájdenie existujúcej cesty bez stavania (popísané v predošlej sekcii), vieme zistiť či bolo vymazané políčko v meste. Keď nám totiž pathfinder.road vráti prázdnu cestu, znamená to, že niektoré políčko v meste bolo zničené (tak, ako bolo spomenuté v sekcií 4.1.2). Po zistení odstránenia políčka EmotionAI prechádza každé mesto, ktoré je spojené danou cestou. EmotionAI prechádza políčka patriace pod správu mesta (tak, ako je načrtnuté na obrázku 6.3), a zisťuje či niektoré obsahuje iba železničné koľaje. Ak zistí, že obsahuje, skontro- luje ešte či práve dané koľaje blokujú cestu. Ak teda EmotionAI takto odhalí odstránenie cesty, políčko si zapamätá a zníži tvorcovi koľají karma body. Ďalej sa snaží vytvoriť novú cestu s pomocu pathfinder.road a jeho východzieho nastavenia.

4. http://noai.openttd.org/docs/1.8.0/classAIVehicle.html# c764fe3cedf20d871df6d92c34805cee

26 6. EmotionAI

Obr. 6.3: Špirálovitá analýza políčok od daného stredu

6.3.3 Identifikácia kradnutia tovaru Tak, ako bolo popísané v sekcii 4.1.3, je potrebné pri každej stanici zisťovať, či niekto v blízkosti postavil stanicu. Ak áno, tak to EmotionAI vyhodnotí ako kradnutie tovaru. API dovoľuje zisťovať údaje iba pri staniciach ktoré vlastní EmotionAI. Preto môžeme iba usudzovať, že sa jedná o kradnutie tovaru. Môže sa stať, že stanica druhého hráča zbiera iný tovar, no AI ho aj tak označí ako zlodeja tovaru. EmotionAI rozdeľuje stanice podľa typu nákladu, s ktorým pracujú na: • stanice s pasažiermi a poštou, • stanice s materiálmi a produktami. AI ich rozlišuje kvôli spôsobom získavania tovaru popísaných na stránkach hry [Wikd]. Pri pasažieroch a pošte sa počítajú políčka okolo stanice. Čím viac políčok v meste, tým viac pasažierov je na stanici. Pri priemyselných staniciach sa počíta, či stanica zasahuje do plochy priemyslu. Pri stanici, ktorá obsluhuje pasažierov postupuje EmotionAI rov- nakým spôsobom, ako je popísané na obrázku 6.3. Keď nájde cudziu stanicu, ktorá zdieľa políčka v dosahu našej stanice, cudziu stanicu si zapamätá a zníži majiteľovi stanice karma body za počet zdieľa- ných políčok. Počet zdieľaných políčok je dôležitý, pretože práve pri

27 6. EmotionAI

nich zdieľajú stanice spoločných pasažierov a nastáva na nich boj o ná- klad. Keďže API nepodporuje zisťovanie nákladu uloženého v cudzích staniciach, EmotionAI môže iba predpokladať kradnutie tovaru. Keď sa jedná o stanicu s materiálmi a produktami, EmotionAI najprv zistí typy tovaru, ktorý stanica skladuje. Podľa týchto typov potom hľadá najbližšie priemysly, ktoré daný typ produkujú. Následne postupuje rovnakým spôsobom, ako na obrázku 6.3 a hľadá cudzie stanice. Ak takú stanicu nájde vyhodnotí jej vlastníka ako zlodeja tovaru a zníži jeho karma body.

6.3.4 Operácie Save a Load Pre zlepšenie hrateľnosti EmotionAI bolo potrebné implementovať funkcie Save() a Load(). Keďže SimpleAI (vybratá AI z kapitoly 5) dané funkcie implementuje bolo taktiež treba zaradiť Save() a Load() do chodu SimpleAI. Podľa herných stránok OpenTTD [Wikb] umožňuje uložiť iba:

• integer, • string, • boolean, • null, • string, • array (maximálne 25 úrovní hlboko), • table (maximálne 25 úrovní hlboko).

Hra teda neumožňuje uloženie priamo inštancie tried, ani len AI- List zo svojho frameworku. Na uloženie nekompatibilného typu je preto najprv nutná konverzia do kompatibilného typu. Ukladať je potreba iba veci, ktoré sa nedajú jednoducho zistiť. Emo- tionAI si preto ukladá informácie o hráčoch, ktoré si zaznamenala v priebehu hry. Ukladá karma body jednotlivých hráčov, políčka ktoré blokujú a taktiež stanice ktoré kradnú tovar. EmotionAI si ukladá, ok- rem iného aj informácie o svojich vytvorených zátarasách a staniciach.

28 7 Porovnanie

V tejto kapitole sú podrobne zanalyzované výsledky porovnávania spomenutých umelých inteligencií. Porovnávanie bolo realizované pomocou zbierania informácií o AI počas jednotlivých hier. Zbierané informácie pozostávali z ročného príjmu , rozdelených do jednotlivých typov prepravy a celkovej hodnoty spoločnosti. Testovanie bolo rozdelené do dvoch kategórií, celkové porovna- nie spomenutých AI, spustených súčasne na rôznych veľkostiach mapy, a odolnosť jednotlivých AI proti útokom. Prvá kategória testova- nia sa odohráva v rokoch 1950 až 2050. Druhá kategória testovania sa odohráva v rokoch 1950 až 1980. Druhé rozmedzie bolo zvolené, pre- tože v týchto rokoch sa využíva prevažne cestná doprava (pri nej sa najlepšie monitorujú jednotlivé útoky).

7.1 Výsledky testov celkovej úspešnosti EmotionAI

Celkové testovanie prebiehalo na dvoch mapách o veľkosti 256x256 a 1024x1024. Veľkosť 256x256 bola zvolaná z dôvodu väčšieho súpere- nia AI v hre. Keďže na menšej mape je aj menej miest a priemyslov, AI sú nútené o ne súperiť. Zbieranie výsledkov na malej veľkosti mapy (256x256) bolo iba jedno. Testovanie na mape 1024x1024 prebehlo cel- kovo 3 krát, a to z dôvodu chýb v programoch AdmiralAI a DictatorAI buď počas hry, alebo pri jej načítavaní (funkcia Load()). Do celkových výsledkov sa z dôvodu neúspechu dvoch testovaní zarátalo iba jedno, ktoré prebehlo bez problémov až do stanoveného konca (2050). Na obrázkoch grafov 7.1 a 7.2 sú znázornené výsledky testovania na malej mape, rozdelené podľa rokov. Aj keď sa spočiatku hodnota spoločnosti EmotionAI vyrovnávala hodnote AdmiralAI, na konci bola jasným víťazom AdmiralAI. EmotionAI a SimpleAI mali v testo- vaniach podobné hodnoty, pričom EmotionAI v priemere vyhrávala o 12%.

29 7. Porovnanie

Obr. 7.1: Výsledky testov pre mapu 256x256, príjem spoločností

Obr. 7.2: Výsledky testov pre mapu 256x256, hodnota spoločností

30 7. Porovnanie

Testovanie na veľkej mape sa malo čo najviac priblížiť reálnej hre proti trom hráčom. Mapa 1024x1024 má v sebe veľa miest a priemyslo- vých parkov. Nejde pri nej o veľkú konkurenciu medzi spoločnos- ťami. Na grafoch 7.3 a 7.4 môžeme vidieť výsledky testovania na mape, rozdelené podľa rokov. V hre bola jasným víťazom opäť Admi- ralAI, kde v roku 2050 dosiahla hodnotu spoločnosti skoro dva krát väčšiu ako EmotionAI. Tá skončila na treťom mieste. Jeden z dôvodov nižšej výkonnosti je ten, že pri veľkých mapách EmotionAI uprednost- ňuje kontrolu svojich ciest pred vytváraním liniek, zatiaľ čo ostatné AI uprednostňujú vytváranie nových.

Obr. 7.3: Výsledky testov pre mapu 1024x1024, príjem spoločností

31 7. Porovnanie

Obr. 7.4: Výsledky testov pre mapu 1024x1024, hodnota spoločností

7.2 Výsledky testov samostatných AI

Táto sekcia bližšie popisuje testovanie AI pri zamedzení cestnej do- pravy. Testovanie bolo realizované pre každú AI na rovnakej mape o rozmeroch 256x256, v rokoch 1950 až 1980, s východzími nastave- niami. Testovanie prebehlo pre každú umelú inteligenciu v dvoch štá- diách. Najprv prebiehalo kontrolné testovanie bez akéhokoľvek zásahu do chodu jednotlivých AI. Potom nasledovalo testovanie blokád. To pre- biehalo tak, že vždy keď AI postavila trať pre cestnú prepravu, bola na nej postavená cestná blokáda (spomenuté v sekcií 4.1.1). Spomenuté testovania prebiehali každé oddelene a výsledky boli zbierané iba raz. Pri kontrolnom testovaní jasne vyhrával AdmiralAI s hodnotou spo- ločnosti 62 753 000 £. Bolo to skoro dva krát viac ako EmotionAI, ktorej hodnota spoločnosti bola v kontrolnej skupine 35 449 000 £. V teste blokád mala EmotionAI (28 097 000 £) hodnotu spoločnosti desať krát väčšiu ako AdmiralAI (2 571 000 £). Toto bolo zapríčinené prevažne veľkými výdavkami AdmiralAI na cestnej doprave.

32 7. Porovnanie

7.2.1 DictatorAI

DictatorAI v testovaní blokád dosiahla najhoršie výsledky zo všetkých. Dokonca v roku 1954 opustila hru z dôvodu nedostatku peňazí (všetky pôžičky už vyčerpala). Zapríčinené to bolo tým, že DictatorAI sa pri začiatku hry (1950) snaží vytvárať prevažne cestnú prepravu. Každá jeho vytvorená cesta bola ale zatarasená cestnou bloká- dou, tým pádom na svojich investíciach neustále prerábala. Celkovo za štyri roky svojej životnosti vystavala osem cestných liniek, ktoré boli testom zatarasené.

7.2.2 AdmiralAI

AdmiralAI skončila v testovaní blokád na druhom mieste. Celkovo AI postavila 20 cestných liniek, no z dôvodu cestnej blokády jej nevynášala ani jedna. Oproti tomu AdmiralAI bojovala tým, že neskôr začala vytvárať prevažne železničné linky. Cestné linky jej teda nevynášali, ale v roku 1970 mala najväčší výnos železničnej (117 838 £) a leteckej (81 612 £) dopravy zo všetkých testovaných AI. V kontrolnom testovaní mala AdmiralAI výnos cestnej prepravy až 1 220 001 £. Keď AdmiralAI zistila, že jeho cestná linka nevynáša žiadne pe- niaze, poslala svoje vozy do depa a predala ich. Taktiež zničila aj svoje stanice na danej linke. Týmto včas odhalila prerábanie peňazí na linke a zrušením získala aspoň trocha peňazí naspäť.

1950 1960 1970 1980 cestná doprava 0 0 0 0 železničná doprava 68.6 186.9 117.8 196.7 letecká doprava 0 0 81.6 258.1 celkový príjem 16.5 47.7 131.4 201.6 hodnota spoločnosti 15.6 261.9 844 2571

Tabuľka 7.1: Tabuľka hodnôt spoločnosti AdmiralAI (v tisícoch £) pri zablokovaniu ciest

33 7. Porovnanie

7.2.3 EmotionAI Ako bolo predpokladané EmotionAI si viedla v testovaní blokád zo všet- kých AI najlepšie. Celkovo za 30 rokov skúmania EmotionAI postavila 32 cestných liniek, na ktorých sa úspešne obraňovala proti útokom, aby linky mohli naďalej vynášať. Celkový príjem za posledný rok (1980) z cestnej dopravy bol 380 077 £. Pri kontrolnom testovaní bol celkový príjem z cestnej do- pravy 459 738 £. Nebol teda taký badateľný rozdiel medzi danými testami v hodnote zárobku, ako pri ostatných AI. Cestná doprava má nízky podiel na celkovej hodnote spoločnosti, no pri začiatkoch hry je to dobrý spôsob na rýchly zárobok peňazí. Taktiež ponúka možnosť ďaľšieho stavania infraštruktúry a rastu mesta.

1950 1960 1970 1980 cestná doprava 39.5 70.1 238.5 380 železničná doprava 73.5 481.3 1152.9 1482.9 letecká doprava 0 271.2 642.1 1145.9 celkový príjem 26.2 185.7 490.7 864.6 hodnota spoločnosti 21.6 2218 10789 28097

Tabuľka 7.2: Tabuľka hodnôt spoločnosti EmotionlAI (v tisícoch £) pri zablokovaniu ciest

34 7. Porovnanie 7.3 EmotionAI vs AdmiralAI

V tejto sekcií sú porovnané výsledky dvoch najlepších AI pri teste s cestnými blokádami. Pri tomto teste sme si mohli všimnúť výborné výsledky EmotionAI, popísaných v predošlej sekcii. Grafy 7.5 a 7.6 znázorňujú hodnotu majetku spoločností pri jednotlivých testoch, roz- delených podľa rokov. Z grafu 7.5 je zrejmé, že EmotionAI nemala proti AdmiralAI šancu. Predsa len AdmiralAI bola postavená za účelom najvyššieho zisku a EmotionAI uprednostňuje kontrolu svojich liniek pred stavaním nových.

Obr. 7.5: Výsledky kontrolných testov

35 7. Porovnanie

V grafe 7.6 môžeme vidieť jasnú prevahu EmotionAI nad Admira- lAI. Toto bolo zapríčinené tým, že EmotionAI dokázala obrániť svoje cestné linky a na základe ich nepretržitého výnosu rozširovať svoju infraštruktúru ďalej. AdmiralAI nedokázal odvrátiť dané útoky a na svojich cestných linkách teda peniaze prerábal. Na základe tohoto bola nútená si po- žičiavať peniaze a nebola schopná financovať stavanie nových ciest tak často ako EmotionAI. Vďaka tomu mala EmotionAI na konci roku 1980 takmer desať násobnú hodnotu svojej spoločnosti oproti hodnote spoločnosti AdmiralAI.

Obr. 7.6: Výsledky testov cestných blokád

36 8 Sumarizácia

Posledná kapitola popisuje možné vylepšenia, či už v oblasti optimali- zácie vytvorených algoritmov, alebo analýzy efektivity pre vytvorenú AI a celkové zhrnutie práce.

8.1 Možné vylepšenia do budúcna

Vylepšovanie AI sa v komunite OpenTTD berie ako samozrejmosť. Vďaka otvorenej licencií môže vylepšiť EmotionAI ktokoľvek. Niektoré časti kódu EmotionAI by sa dali napísať efektívnejšie. Ďalšie možnosti vývoja môžu zahŕňať napríklad: 1. Načítavanie miest v EmotionAI je neefektívne, čo vedie k tomu, že OpenTTD pri veľkých mapách (1024x1024 a viac) preruší pro- ces načítavania miest z dôvodu dlhého trvania operácie. Kvôli tomu, aby EmotionAI funkgovala rovnako na každej veľkosti mapy, je počet miest pre hráča obmedzený na dĺžku 255 (toto číslo bolo zistené pri testovaní na konkrétnom počítači). Optima- lizáciou algoritmu načítavania by sa dalo dosiahnuť väčší počet miest, čo je potrebné pri hrách s veľkými mapami. 2. Zanalyzovať účinnosť útokov smerovaných na protihráča. Efekti- vita zatiaľ nebola testovaná. Môže sa stať, že útok stojí EmotionAI viac peňazí, ako spôsobí protihráčovi škodu. V takom prípade nie je útok efektívny a je potreba zmeniť jeho stratégiu. 3. Keď má EmotionAI vytvorených veľa cestných liniek, čas strá- vený analýzou cestných blokád je veľký. V hre je malá pravde- podobnosť, že protihráč zaútočí cestnou blokádou dva krát na rovnakú cestnú linku. EmotionAI analyzuje cestné linky bez ohľadu na to, či na nej už bola postavená blokáda alebo nie. Toto vedie k zbytočnému vyťaženiu AI. Efektívnejšie riešenie by bolo rozdeliť cestné linky na dve skupiny podľa toho, či je na nej cestná blokáda. Skupina na ktorej blokáda je, by sa analyzovala menej často. 4. Vylepšenie útoku zablokovania mesta. Zablokovanie mesta ko- ľajnicami slúži na zastavenie jeho rastu. EmotionAI zablokuje

37 8. Sumarizácia

mesto tak, že si vyberie 4 body vzdialené rovnako od seba, tak aby medzi nimi boli všetky časti mesta. Medzi týmito bodmi postaví koľajnice, čím zabráni rozrastaniu mesta za tento štvo- rec. Keďže v hre majú mestá prevažne náhodné rozpoloženie, tak voľba opísaného štvorca pre tieto 4 body je neoptimálna. Najlep- šie ohraničenie mesta koľajnicami vznikne vtedy, keď medzi ko- ľajnicami a mestom nieje žiadna voľná plocha na potencionálny rast mesta.

8.2 Záver

Cieľom tejto bakalárskej práce bolo vytvorenie takej AI, ktorá reaguje na podnety od ostatných hráčov. Nieje známe, že by niektorá verejná AI mala túto vlastnosť. Výsledná AI reaguje na útoky protihráčov podobnou stratégiou. Toto bolo nazvané emočným správaním. Súčasťou práce bolo porovnanie existujúcich AI z pohľadu rôznych kritérií. Implementácia bola zavedená do SimpleAI, ktoré bolo vybrané za najvhodnejšie. Výsledná AI bola pomenovaná EmotionAI. Keďže nebola známa ani jedna implementácia s podobným správaním, všetky útoky, riešenia, správanie a stratégie AI sú originálne vytvorené auto- rom práce. Na docielenie takéhoto správania bolo potrebné dôkladne naštu- dovať jazyk Squirrel a NoAI framework, v ktorom sú vytvorené funkcie na komunikáciu s hrou. Toto bolo potrebné pre zistenie všetkých mož- ností, ktoré hra poskytuje. Práca popisuje problémy, ktoré nastali pri implementácií emotívneho správania aj spôsob ich riešenia. V práci bola implementovaná identifikácia prerušenia cestnej do- pravy vlakom, ako aj následné vystavanie obchádzky. Do EmotionAI bola zavedená identifikácia prerušenia cestnej dopravy zničením cesty v mestách, ako aj zisťovanie kradnutia tovaru pri staniciach ľubovolnej dopravy. Spôsob útoku bol implementovaný cez karma body, podľa ktorých EmotionAI usudzuje, či mal hráč v minulosti zlé správanie. Pri útoku najprv AI vyhodnotila správanie hráča a následne zvolila (podľa počtu bodov) adekvátny útok. Útoky zahŕňali: vytvorenie cest- nej blokády, odstránenie cesty v mestách, postavenie heliporu v mes- tách, ohraničenie mesta železničnými koľajami, financovanie cestnej

38 8. Sumarizácia

rekonštrukcie, kúpa exkluzívnych práv a podplatenie mesta. Emoti- onAI podporuje identifikáciu odstránenia zlého činu hráča. EmotionAI bolo testované proti spomenutým AI. Nebolo zistené výrazné spomalenie oproti výkonnosti svojej materskej AI. EmotionAI sa svojou výkonnosťou nevyrovnala AdmiralAI, ktorá vyhrala pri teste o celkový majetok spoločnosti. Ten bol na konci testovania takmer dva krát väčší, ako majetok spoločnosti EmotionAI. AI však dominovala pri teste zablokovania cestnej linky, kde hodnota jej majetku dosiahla až desať násobnu hodnotu majetku AdmiralAI. EmotionAI bude dostupná pre verejnosť na stránkach hry a bude možné doplnenie ďalšej implementácie od komunity. Do doby, kým bude úspešne zavedená na hlavný server bude EmotionAI dostupná výhradne na stránkach Masarykovej univerzity.

39 Bibliografia

[Del+09] DELLING, D.; SANDERS, P.; SCHULTES, D.; WAGNER, D. Engineering Route Planning Algorithms. In: Berlin, Heidel- berg: Springer Berlin Heidelberg, 2009, s. 117–139. ISBN 978-3-642-02094-0. Dostupné z DOI: 10.1007/978-3-642- 02094-0_7. [Dem16] DEMICHELIS, A. Squirrel – The Programming Language [on- line]. Copyright 2004-2016 [cit. 2018-03-15]. Dostupné z: http://www.squirrel-lang.org/#documentation. [GP95] GREEN, H. G.; PEARSON, M. A. Artificial intelligence in financial markets. In: Neural Networks, 1995. Proceedings., IEEE International Conference on. 1995-11, zv. 2, s. 839–844. Dostupné z DOI: 10.1109/ICNN.1995.487527. [Mil06] MILLINGTON, I. Artificial intelligence for games. Morgan Kaufmann: Elsevier, c2006. ISBN 0124977820. [Tea] TEAM, OpenTTD. BaNaNaS AI list [online] [cit. 2017-11-25]. Dostupné z: https://bananas.openttd.org/en/ai/. [Wika] WIKI, OpenTTD. AI:Introduction [online] [cit. 2018-03-15]. Dostupné z: https://wiki.openttd.org/AI:Introduction naposledy modifikované 30. Septembra 2013, o 00:06. [Wikb] WIKI, OpenTTD. AI:Save/Load [online] [cit. 2018-03-15]. Do- stupné z: https://wiki.openttd.org/AI:Save/Load# Save naposledy modifikované 4. Januára 2015, o 14:16. [Wikc] WIKI, OpenTTD. Aircraft [online] [cit. 2018-03-15]. Do- stupné z: https://wiki.openttd.org/Aircraft napo- sledy modifikované 1. Októbra 2017, o 21:20. [Wikd] WIKI, OpenTTD. Catchment area [online] [cit. 2018-03-15]. Dostupné z: https://wiki.openttd.org/Catchment_area naposledy modifikované 21. Mája 2014, o 08:47. [Wike] WIKI, OpenTTD. Local Authority [online] [cit. 2018-03-15]. Dostupné z: https : / / wiki . openttd . org / Game _ mechanics#Local_authority_rating naposledy modifi- kované 10. Apríla 2018, o 01:32. [Wikf] WIKI, OpenTTD. Multiplayer [online] [cit. 2018-03-15]. Do- stupné z: https://wiki.openttd.org/Multiplayer napo- sledy modifikované 14. Októbra 2016, o 19:21.

40 BIBLIOGRAFIA

[Wikg] WIKI, OpenTTD. Road vehicles [online] [cit. 2018-03-15]. Do- stupné z: https://wiki.openttd.org/Road_vehicles# Accidents naposledy modifikované 26. Decembera 2015, o 17:05. [Wikh] WIKI, OpenTTD. Ships [online] [cit. 2018-03-15]. Dostupné z: https://wiki.openttd.org/Ships naposledy modifiko- vané 15. Augusta 2014, o 05:12. [Wiki] WIKI, OpenTTD. Station Rating [online] [cit. 2018-03-15]. Dostupné z: https : / / wiki . openttd . org / Game _ mechanics#Station_rating naposledy modifikované 10. Apríla 2018, o 01:32.

41