There are several approaches to machine learning, whose most actively researched field is neural network (NN). NNs have numerous applications, including image classification, recommendation algorithms, text processing and self-driving cars. Teaching a NN is done in general through a process called „deep learning”. A slightly less-known approach to finding the optimal NN is done with genetic algorithms (GA). This process is called neuroevolution (NE). The advantage of GAs in general lies in solving discrete optimization problems, which means that GAs are applicable to finding an optimal network architecture for the NN.
The NE has multiple known algorithms to this day. The algorithm I chose to implement is called NEAT, which looked the most promising out of the total 3 solutions I have examined in my research.
In this thesis I present an implementation to the NEAT algorithm in Kotlin, whose purpose was to show that GA is indeed applicable to finding an optimal NN. The implementation was created in an object-oriented mindset, taking advantage of Kotlin's syntactic sugars and concise language features. Additionally, the implementation presented here provides an option to configure any parameters needed for the algorithm to run, using an architecture that is for the most part generated by the Java annotation processor.
The verification of the Kotlin program was done using an external test program written in TypeScript. The test program was needed due to the algorithm's non-deterministic nature. It presents the logs created by the Kotlin program in various charts.
Finally, a simple game written inside the Unity game engine in C# shows a use-case for the algorithm.