This code uses the (μ+λ) and the (μ, λ) strategies in the adaptive form and it's well organized in classes and divided in many functions.
The variables reflects what they store and this makes the code readable. In addition it is well explained also in the README.
The fitness function is based on the percentage of victories against the pure_random strategy, so it's evaluation will influence the decision about the new strategy to use in the next generation.
I found the fitness and mutation functions not well optimized because the functions contain repetitive code when choosing the action, maybe an array that contains the strategies and to index would have made the code more compact.
Apart from that I think it's an implementation of an evolutionary strategy that solves in a nice way the Nim game.
This code uses the (μ+λ) and the (μ, λ) strategies in the adaptive form and it's well organized in classes and divided in many functions. The variables reflects what they store and this makes the code readable. In addition it is well explained also in the README. The fitness function is based on the percentage of victories against the pure_random strategy, so it's evaluation will influence the decision about the new strategy to use in the next generation. I found the fitness and mutation functions not well optimized because the functions contain repetitive code when choosing the action, maybe an array that contains the strategies and to index would have made the code more compact. Apart from that I think it's an implementation of an evolutionary strategy that solves in a nice way the Nim game.