遗传算法生成的结果与适合度目标相差太远

时间:2019-03-05 13:01:35

标签: python algorithm genetic

我试图用这样的代码创建遗传算法

import random
from random import randint

POPULATION_SIZE = 10
NUMB_OF_ELITE_CHROMOSOMES = 4
TARGET_CHROMOSOME = [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3]
TOURNAMENT_SELECTION_SIZE = 0.00001
MUTATION_RATE = 0.3

创建类染色体

class Chromosome:
    def __init__(self):
        self._genes = []
        self._fitness = 0
        i = 0
        while i < TARGET_CHROMOSOME.__len__():
            a = randint(1, 4)
            self._genes.append(a)
            i += 1

    def get_genes(self):
        return self._genes

    def get_fitness(self):
        self._fitness = 0
        for i in range(self._genes.__len__()):
            if self._genes[i] == TARGET_CHROMOSOME[i]:
                self._fitness +=1
        return self._fitness

创建班级人口

class Population:
    def __init__(self, size):
        self._chromosomes = []
        i = 0
        while i < size:
            self._chromosomes.append(Chromosome())
            i += 1

    def get_chromosomes(self): return self._chromosomes

Class GeneticAlgorithm

class GeneticAlgorithm:
    @staticmethod
    def envolve(pop):
        return GeneticAlgorithm._mutate_population(GeneticAlgorithm._crossover_population(pop))

    @staticmethod
    def _crossover_population(pop):
        crossover_pop = Population(0)
        for i in range(NUMB_OF_ELITE_CHROMOSOMES):
            crossover_pop.get_chromosomes().append(pop.get_chromosomes()[i])

        i = NUMB_OF_ELITE_CHROMOSOMES
        while i < POPULATION_SIZE:
            chromosome1 = GeneticAlgorithm._select_tournament_population(pop).get_chromosomes()[0]
            chromosome2 = GeneticAlgorithm._select_tournament_population(pop).get_chromosomes()[0]
            crossover_pop.get_chromosomes().append(GeneticAlgorithm._crossover_chromosomes(chromosome1,chromosome2))
            i += 1
        return crossover_pop

    @staticmethod
    def _mutate_population(pop):
        return pop

    @staticmethod
    def _crossover_chromosomes(chromosome1, chromosome2):
        crossover_chrom = Chromosome()
        return crossover_chrom

    @staticmethod
    def _mutate_chromosome(chromosome):
        for i in range(TARGET_CHROMOSOME.__len__()):
            if random.random() < 0.02:
                a = randint(1, 4)
                chromosome.get_genes()[i] = a



    @staticmethod
    def _select_tournament_population(pop):
        tournament_pop = Population(0)
        i = 0
        while i < TOURNAMENT_SELECTION_SIZE:
            tournament_pop.get_chromosomes().append(pop.get_chromosomes()[random.randrange(0, POPULATION_SIZE)])
            i += 1
        tournament_pop.get_chromosomes().sort(key=lambda x: x.get_fitness(), reverse=True)
        return tournament_pop

打印生成

def _print_population(pop, gen_number):
    print("\n---------------------")
    print("Generation #", gen_number, "| Fittest chromosome fitness:", pop.get_chromosomes()[0].get_fitness())
    i = 0

    for x in pop.get_chromosomes():
        print("Chromosome #", i, " :", x.get_genes(), "| Fitness: ", x.get_fitness())
        i += 1
population = Population(POPULATION_SIZE)
population.get_chromosomes().sort(key=lambda x: x.get_fitness(), reverse = True)
_print_population(population,0)
generation_number = 1

while population.get_chromosomes()[0].get_fitness() < TARGET_CHROMOSOME.__len__():
    population = GeneticAlgorithm.envolve(population)
    population.get_chromosomes().sort(key=lambda x: x.get_fitness(), reverse = True)
    _print_population(population, generation_number)
    generation_number += 1

如果在控制台上运行,我会像

Generation # 18274 | Fittest chromosome fitness: 19
Chromosome # 0  : [3, 2, 3, 3, 2, 3, 2, 4, 3, 4, 3, 4, 4, 1, 3, 2, 1, 2, 1, 4, 3, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3] | Fitness:  19
Chromosome # 1  : [1, 2, 3, 4, 1, 4, 2, 2, 1, 1, 3, 1, 1, 1, 3, 4, 1, 2, 1, 4, 4, 1, 3, 3, 1, 4, 3, 3, 1, 2, 4] | Fitness:  18
Chromosome # 2  : [1, 3, 1, 4, 1, 4, 3, 4, 1, 2, 2, 4, 2, 2, 3, 4, 1, 1, 3, 3, 4, 1, 1, 3, 1, 2, 4, 2, 1, 2, 3] | Fitness:  18
Chromosome # 3  : [3, 2, 3, 4, 4, 3, 2, 4, 1, 1, 1, 3, 1, 2, 3, 4, 1, 3, 3, 4, 3, 2, 4, 3, 1, 2, 3, 1, 1, 2, 4] | Fitness:  18
Chromosome # 4  : [3, 1, 3, 4, 1, 3, 2, 1, 3, 1, 3, 4, 4, 3, 2, 4, 2, 2, 2, 2, 4, 1, 3, 2, 1, 1, 1, 4, 1, 2, 1] | Fitness:  12
Chromosome # 5  : [2, 2, 4, 4, 1, 4, 3, 1, 4, 2, 2, 3, 2, 2, 2, 1, 3, 4, 1, 1, 4, 2, 2, 4, 4, 2, 4, 3, 3, 4, 3] | Fitness:  10
Chromosome # 6  : [2, 4, 2, 3, 4, 4, 4, 2, 1, 2, 3, 1, 4, 3, 1, 2, 1, 2, 4, 4, 4, 2, 4, 2, 3, 3, 3, 2, 3, 4, 1] | Fitness:  8
Chromosome # 7  : [1, 2, 4, 2, 1, 2, 3, 1, 2, 4, 2, 2, 3, 4, 4, 3, 1, 4, 2, 1, 3, 4, 4, 1, 3, 1, 4, 1, 1, 1, 2] | Fitness:  7
Chromosome # 8  : [2, 3, 1, 2, 4, 2, 4, 2, 2, 2, 1, 1, 4, 4, 2, 3, 3, 2, 1, 1, 2, 1, 4, 1, 4, 1, 2, 4, 3, 1, 1] | Fitness:  4
Chromosome # 9  : [2, 1, 4, 2, 1, 1, 4, 2, 1, 3, 4, 4, 1, 3, 1, 2, 3, 3, 2, 2, 3, 1, 1, 3, 4, 1, 2, 1, 2, 3, 1] | Fitness:  4

如何自定义突变或创建随机数组以获取结果

Fittest chromosome fitness: 31

这时我获得了超过100000世代,但是最大染色体最适合21岁。

感谢您的回答

0 个答案:

没有答案