def reproduce(self): proportional_fitness = [None] * self.nsets for i in xrange(self.nsets): proportional_fitness[i] = \ float(self.fitness[i]) / sum(self.fitness) number_of_copies = [0] * self.nsets number_of_copies[0] = 1 for i in xrange(self.nsets): number_of_copies[i] = \ int(math.ceil(proportional_fitness[i] * (self.nsets - 1))) if sum(number_of_copies) >= self.nsets: number_of_copies[i] -= (sum(number_of_copies) - self.nsets) break new_params = [] set_copy_list = \ [(proportional_fitness[i], number_of_copies[i], i) \ for i in xrange(self.nsets)] set_copy_list.sort() set_copy_list.reverse() for set in set_copy_list: new_params += [copy.deepcopy(self.params[set[2]]) for n in xrange(set[1])] self.params = new_params