Esempio n. 1
0
    public void NewGeneration(int numNewDNA = 0, bool crossoverNewDNA = false)
    {
        int finalCount = popsize + numNewDNA;

        if (finalCount <= 0)
        {
            return;
        }

        if (popsize > 0)
        {
            CalculateFitness();
            Population.Sort(CompareDNA);
        }
        newPopulation.Clear();
        for (int i = 0; i < popsize; i++)
        {
            if (i < Elitism && i < popsize)
            {
                newPopulation.Add(Population[i]);
            }
            else if (crossoverNewDNA)
            {
                GenerateQP <T> parent1 = ChooseParent();
                GenerateQP <T> parent2 = ChooseParent();
                //if (parent1 == null)
                //{
                //  return;
                //}
                GenerateQP <T> child = parent1.Crossover(parent2);
                //  if (child == null)
                //{
                //  return;
                //}

                //child.Mutate(MutationRate);
                newPopulation.Add(child);
            }
            else
            {
                GenerateQP <T> generateclone = new GenerateQP <T>(dnaSize, random, getRandomGene, fitnessFunction, shouldInitGenes: true);
                newPopulation.Add((GenerateQP <T>)generateclone.Clone());
            }
        }

        List <GenerateQP <T> > tmpList = new List <GenerateQP <T> >(Population);

        Population    = new List <GenerateQP <T> >(newPopulation);
        newPopulation = new List <GenerateQP <T> >(tmpList);
        Generation++;
    }
Esempio n. 2
0
    public GeneticAlgorithm(int populationSize, int dnaSize, Random random, Func <int, T> getRandomGene, Func <GenerateQP <T>, float> fitnessFunction,
                            int elitism, float mutationRate = 0.01f)
    {
        popsize              = populationSize;
        Generation           = 1;
        Elitism              = elitism;
        MutationRate         = mutationRate;
        Population           = new List <GenerateQP <T> >();
        newPopulation        = new List <GenerateQP <T> >();
        this.random          = random;
        this.dnaSize         = dnaSize;
        this.getRandomGene   = getRandomGene;
        this.fitnessFunction = fitnessFunction;

        BestGenes = new T[dnaSize];
        for (int i = 0; i < popsize; i++)
        {
            GenerateQP <T> generateclone = new GenerateQP <T>(dnaSize, random, getRandomGene, fitnessFunction, shouldInitGenes: true);
            Population.Add((GenerateQP <T>)generateclone.Clone());
        }
        CalculateFitness();
    }