Dokumentácia – Sokoban Evolučným spôsobom – Matej Pavla (418138)

Spustenie projektu:

Projekt bol vyvíjaný v prostredí NetBeans 7.2. Použitá bola štandardná Java, JDK verzia 1.7.
V Netbeans je spustenie projektu jednoduché:

1. Stačí si projekt („source/SokobanEvo“) načítať do Netbeans

2. A načítať potrebné knižnice, ktoré sú uvedené v priečinku „source/libs“.
V podstate je potrebné načítať: source/libs/slick.jar, source/libs/lwjgl-2.8.5/jar/lwjgl.jar, source/libs/lwjgl-2.8.5/jar/lwjgl_util.jar, source/libs/lwjgl-2.8.5/jar/jinput.jar
(Celý návod je dostupný na http://www.slick2d.org/wiki/index.php/Setting_up_Slick2D_with_NetBeansIDE)

Project overview:

Najdôležitejšie:

1.V sokobanevo.levels.LevelDraw:26:
final static String mapFilePath = "assets/sasquatch_s1.txt";
mapFilePath cesta k súboru k mapkami
K dispozícii sú zatiaľ dva, je jednoduché pridať ďalšie, stačí sa pozrieť na štruktúru už existujúcich súborov, nie je problém ju reprodukovať.

2.V sokobanevo.SokobanEvo:58:
baseMap = levelDraw.readMapFromFileById(ID);
ID – id mapky ktorou chceme pracovať



Základná classa je sokobanevo.SokobanEvo:

Classa implementuje metódy pre Slick2D, v nich sa vykonáva príprava, kalkulovanie, rendering..
Metóda init: Načítanie mapky, pomocou classy LevelDraw, vytvorenie prvej generácie, pomocou statickej metódy classy EvolutionSokoSolver.
Metóda update: Volá sa prvýkrát po init() a vždy potom pred render(). Po nej sa volá render() a takto sa to opakuje, tzn. fps závisí na rýchlosti vykonania update(). Vypočítame v nej fitness súčasnej generácie. (EvolutionSokoSolver.computeFitnessOfGeneration v skutočnosti vracia penalty, na fitness to prevedieme prevrátením hodnôt). Plus sa tu spočítajú nejaké štatistické premenné ako priemerné fitness. Na konci funkcie ešte vytvoríme novú generáciu na základe fitness. (EvolutionSokoSolver.createNextGeneration)
Metóda render: prebieha v nej rendering napočítaných údajov

Classa sokobanevo.levels.LevelDraw:

Classa má funkcie pre parsovanie levelu z TXT súboru (readMapFromFileById()) a vykreslenie levlu pomocou Slick2D (drawLvlAt(), musí byť volaná v SokobanEvo.render()). V konštruktore sa inicializujú textúry.


Classa sokobanevo.evolution.EvolutionSokoSolver:

Všetky funkcie sa týkajú samotného evolučného riešenia a sú statické. Všetky dôležité informácie sú popísané v JavaDocu.

Classa sokobanevo.evolution.IndividumFitness:

Funkcia EvolutionSokoSolver.computeFitnessOfGeneration() počíta fitness na viacero jadrách. Toto je vlastne implementácia threadu ktorý počíta fitness pre istú (pridelenú) časť populácie. K tomu zase využíva statické funkcie classy EvolutionSokoSolver.

Balík sokobanevo.pathfinding:

Classy v tomto balíčku obsahujú implementáciu A* algoritmu ktorý využívame v riešení. Bližšie info priamo v JavaDocu.



Testovanie:

Súbor mapiek assets/sasquatch_s1.txt:

Zložitejšie mapky, podarilo sa mi vyriešiť len prvé dve, v ostatných vo vyriešení bránia netriviálne detekovateľné deadlocky. (Poznámka: hviezdičky objavujúce sa v TXT týchto mapiek sú pre účely pravdepodobne nejakých hier a slúžia ako bonusové body, ja ich v projekte ignorujem.)

Súbor mapiek assets/schaul.txt:

Mapky z diplomovej práce Toma Schaula (http://www.whatisthought.com/schaulthesis.pdf). Podarilo sa mi vyriešiť 6/7.

Viac mapiek dostupných na: http://users.bentonrea.com/~sasquatch/sokoban/