The idea to keep the 'old' code, adding details at each new version is very usefull to understand the improvement done compared to the previous version.
The name of the variable are self-explanatory so the code is easy to read.
Detail code
The use of the 'blacklist' is a good approach to avoid too many call to the fitness.
The only detail that can be improved is the Hardcoded values like 0.2 and 0.9 in the mutation and xover, that can be converted into variable (possible self-adaptive)
Overall
The idea to keep the 'old' code, adding details at each new version is very usefull to understand the improvement done compared to the previous version. The name of the variable are self-explanatory so the code is easy to read.
Detail code