Tématem pro moji maturitní práci je neuronová síť. Nenaprogramoval jsem však vlastní, pouze jsem využil modul zvaný NEAT, konkrétně NEAT-Python. Ten byl speciálně vyvinutý pro programovací jazyk python, jako prostředí pro vývoj umělé inteligence. Nemá požadavky na nic než základní iknihovnu pythonu. NEAT jsem implementoval do mnou napsané hry a kód upravil, aby vše odpovídalo průběhu. Protože flappy bird je asi nejjednoduší možná hra (má pouze jeden digitální output), často se stane, že při větším množství jedinců v generaci program najde správnou odpověď při spuštění hned první generace. Grafické prostředí je vyvinuté v prostředí knihovny pygame, která vytváří prostředí vhodné pro jednodušší hry. Výsledek je následně uložen do souboru pomocí knihovny pickle. Při spuštění druhé programu se výsledek načte a spustí. Zde uvidíme pouze jediného jedince,jak už bez problémů prolétá překážkami. Program je zdaleka neoriginální, neboť flappy je bird je velice jednoduchá hra a je proto cílem mnoha začítečníků. Stejně tak užití knihovny NEAT nebude v začátečnických kruzích nijak malé. Na YouTube je několik návodů jak na podobné věci. Cíle naprogamovat základy učení umělé inteligence jsem dosáhl. Nepoužil jsem však vlastní neuronovou síť, na kterou jsem zatím nestačil. Proto je použita knihovna python. Největší problém jistě představovalo znovu načtení naučeného programu, k této věci jsem nenašel dokumentaci ani na oficiálních NEAT stránách, ty poskytují pouze dočasný checkpoint v rámci rozbhlého programu. Problém však byl nakonec vyřešen. Algoritmus není nijak složitý díky užití NEAT knihovny. Ta sama o sobě provádí výpočty. Určíme si zde pouze dva inputy. V základní myšlence bychom se dostali až na čtyři : y souřadnice flappy birda, x souřadnice nejbližší překážky, y souřadnice spodní a y souřadnice horní překážky. Na základě pomocných videí jsem to zredukoval na dva inputy: výšková vzdálenost od nejbližší spodní překážky a to samé pro horní překážku. X souřadnice nejbližší překážky není třeba, neboť prostor mezi překážkami je dost velký, aby se nemusel provádět speciální skok. Síť si vezme tyto dva inputy a vrátí output, na základě, kterého se jedinec rozhodne zda skočí. To se provede pro každého jedince v populaci. Nemáme zde nějaký tréninkový output, na kterém bychom určili jak blízko je output jedince a na základě toho, upravili váhy v jeho rozhodování. Používá se zde proto fitness jedince, čím vyšší tím lepší. Jedinec s nejvyšší fitness je reprodukován do další genrace. Ta se založí na něm, ale provedou se na ní další náhodné úpravy. Postupem času se tak dostáváme k jedincům, kteří se dostávají stále blíže k výsledku. Pokud překročí určitou hranice fitness, trenink ukončen s tím, že tento jedinec už je dostatečně dobrý. I takový jedinec ale nemusí mít perfektní kód a může při dalším spušzění zemřít dříve. V terminálu nám síť zatím vypisuje, která generace právě běží, kolik je tam druhů (může dojít k mutaci), kolik je jedinců, nejlepší dosažené fitness této generace a jestli stagnovala, případně jak dlouho už generace stagnuje. Možná zlepšení jsou vždycky, například v programu kde se ukazuje pouze samotná hra. Ten je zde pouze jako ukázka, jak hra funguje. Veliká zlepšení ale v rámci tohoto programu nepřijdou. Neat je jedna z nejlepších dostupných metod. Jistá zlepšení by mohla jistě přijít ve zbytkovém kódu, ale nebyla by moc velká. Co se určitě dá udělat, je naprogramovat těžší hru a umělou inteligenci zkusit na ní.