added mutation and crossover function