The readme is appreciated and clear, however at a first glance it looks like you don't have crossover since you only explained the mutation part;
Have you tried doing tournament with a bigger size than 2? It could be interesting to try out considering there would be more competition;
Good commenting coverage;
It's good that you tried several mutation values. Have you considered reducing the mutation rate once you start having a general good solution? (Exploration vs Exploitation);
I tried running your code with google colab but for some reason, it gives me an error in this line "count.update(sum((e for e in gen), start=()))" in function evaluate. I have tried installing missing dependencies but couldn't manage to fix the issue, I don't know what's wrong;
You have good results, congrats! Is there any reason why you didn't test your solution with N=1000?
Here is my review: