huge refactoring
mutation rewritten
crossover rewritten