示例#1
0
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()
示例#2
0
 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)
示例#3
0
    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