def children(self): """Return a list of children from this population.""" children = [] while len(children) < self.cut_off_count: children.extend(crossover_inds(*self._get_parents_for_crossover())) return evaluate_fitness(mutation(children), current_generation=self.current_generation)
def steady_state(individuals): """ Runs a single generation of the evolutionary algorithm process, using steady state replacement: Selection Variation Evaluation Replacement Steady state replacement uses the Genitor model (Whitley, 1989) whereby new individuals directly replace the worst individuals in the population regardless of whether or not the new individuals are fitter than those they replace. Note that traditional GP crossover generates only 1 child, whereas linear GE crossover (and thus all crossover functions used in PonyGE) generates cython_backup children from cython_backup parents. Thus, we use a deletion strategy of cython_backup. :param individuals: The current generation, upon which a single evolutionary generation will be imposed. :return: The next generation of the population. """ # Initialise counter for new individuals. ind_counter = 0 while ind_counter < params['POPULATION_SIZE']: # Select parents from the original population. parents = selection(individuals) # Perform crossover on selected parents. cross_pop = crossover_inds(parents[0], parents[1]) if cross_pop is None: # Crossover failed. pass else: # Mutate the new population. new_pop = mutation(cross_pop) # Evaluate the fitness of the new population. new_pop = evaluate_fitness(new_pop) # Sort the original population individuals.sort(reverse=True) # Combine both populations total_pop = individuals[:-len(new_pop)] + new_pop # Increment the ind counter ind_counter += params['GENERATION_SIZE'] # Return the combined population. return total_pop
def steady_state(individuals): """ Runs a single generation of the evolutionary algorithm process, using steady state replacement: Selection Variation Evaluation Replacement Steady state replacement uses the Genitor model (Whitley, 1989) whereby new individuals directly replace the worst individuals in the population regardless of whether or not the new individuals are fitter than those they replace. Note that traditional GP crossover generates only 1 child, whereas linear GE crossover (and thus all crossover functions used in PonyGE) generates 2 children from 2 parents. Thus, we use a deletion strategy of 2. :param individuals: The current generation, upon which a single evolutionary generation will be imposed. :return: The next generation of the population. """ # Initialise counter for new individuals. ind_counter = 0 while ind_counter < params['POPULATION_SIZE']: # Select parents from the original population. parents = selection(individuals) # Perform crossover on selected parents. cross_pop = crossover_inds(parents[0], parents[1]) if cross_pop is None: # Crossover failed. pass else: # Mutate the new population. new_pop = mutation(cross_pop) # Evaluate the fitness of the new population. new_pop = evaluate_fitness(new_pop) # Sort the original population individuals.sort(reverse=True) # Combine both populations total_pop = individuals[:-len(new_pop)] + new_pop # Increment the ind counter ind_counter += params['GENERATION_SIZE'] # Return the combined population. return total_pop