def test_chromosome(): for _ in range(10): p1 = Chromosome(gen_prob=0.1, mutation_prob=0) p2 = Chromosome(gen_prob=0.1, mutation_prob=0) print("{} {}".format(p1.root, p1.eval())) print("{} {}".format(p2.root, p2.eval())) p1.crossover(p2) print("{} {}".format(p1.root, p1.eval())) print("{} {}".format(p2.root, p2.eval())) print() print()
def iteration(self, i): parents = range(self.nrInd) nrChildren = len(parents) // 2 offspring = Population(nrChildren) for i in range(nrChildren): offspring.individuals[i] = Chromosome.crossover(self.population.individuals[i << 1], self.population.individuals[(i << 1) | 1], self.probability_crossover) offspring.individuals[i].mutate(self.probability_mutate) offspring.evaluate(self.inputTrain, self.outputTrain) self.population.reunion(offspring) self.population.selection(self.nrInd)
def iteration(self): parents = range(self.nrInd) nrChildren = len(parents) // 2 offspring = Population(nrChildren, self.inputTrain, self.outputTrain) # __str__ of population return the chromosomes fitness for i in range(nrChildren): offspring.individuals[i] = Chromosome.crossover( choice(self.population.individuals), choice(self.population.individuals), self.inputTrain, self.outputTrain) offspring.individuals[i].mutate(self.probability_mutate) offspring.evaluate(self.inputTrain, self.outputTrain) self.population.reunion(offspring) self.population.selection(self.nrInd)
def evolve(self): new_population = [] elites = self.get_fittest(self.population, self.elites) new_population.extend(elites) for _ in range((len(self.population) - self.elites) // 2): tournament = random.sample(self.population, random.randint(2, 2)) winners = self.get_fittest(tournament, 2) p1 = winners[0] p2 = winners[1] c1, c2 = Chromosome.crossover(p1, p2, self.crossover_probability) c1.intra_depot_mutation(self.intra_depot_probability) c2.intra_depot_mutation(self.intra_depot_probability) c1.inter_depot_mutation(self.inter_depot_probability) c2.inter_depot_mutation(self.inter_depot_probability) new_population.extend([c1, c2]) self.population = new_population
def iteration(self, i): offspring = Population(self.nrOfIndividuals) for i in range(self.nrOfIndividuals): # select two parents for crossover first_pick = random.randint(0, self.nrOfIndividuals) second_pick = random.randint(0, self.nrOfIndividuals) while second_pick == first_pick: second_pick = random.randint(0, self.nrOfIndividuals) offspring.individuals[i] = Chromosome.crossover( self.population.individuals[first_pick], self.population.individuals[second_pick], self.crossoverProbability) offspring.individuals[i].mutate(self.mutationProbability) offspring.evaluate(self.inputTraining, self.outputTraining) self.population.join(offspring) self.population.selection(self.nrOfIndividuals)
def __run(self): self.__population = self.__generate_initial_population( self.__initial_population_size) generation = 0 while generation <= self.__num_generations: c1, i1 = self.__select() c2, i2 = self.__select(i1) print("Best fitness: ", self.__best_fitness) c3, c4 = Chromosome.crossover(c1, c2) c5, c6 = c1.mutate(), c2.mutate() cands = [c3, c4, c5, c6] if c1.get_fitness() > c2.get_fitness(): max_fitness, second_fitness = c1.get_fitness(), c2.get_fitness( ) best_cand, second_cand = c1, c2 else: max_fitness, second_fitness = c2.get_fitness(), c1.get_fitness( ) best_cand, second_cand = c2, c1 for cand in cands: fitness = cand.get_fitness() if fitness > max_fitness: second_fitness = max_fitness max_fitness = fitness second_cand = best_cand best_cand = cand elif fitness > second_fitness: second_fitness = fitness second_cand = cand self.__population[i1] = best_cand self.__population[i2] = second_cand if not (best_cand == c1 and second_cand == c2 or best_cand == c2 and second_cand == c1): self.__cached_total_fitness = -1 generation += 1
def crossover(c1: Chromosome, c2: Chromosome) -> typing.List[Chromosome]: child = Chromosome.crossover(c1, c2) return child