예제 #1
0
    public void NewGeneration(int numNewDNA = 0, bool crossoverNewDNA = false)
    {
        int finalCount = Population.Count + numNewDNA;

        if (finalCount <= 0)
        {
            return;
        }

        if (Population.Count > 0)
        {
            CalculateFitness();
            Population.Sort(CompareDNA);
        }
        newPopulation.Clear();

        for (int i = 0; i < Population.Count; i++)
        {
            if (i < Elitism && i < Population.Count)
            {
                newPopulation.Add(Population[i]);
            }
            else if (i < Population.Count || crossoverNewDNA)
            {
                DNA <T> parent1 = Select_Parent();
                DNA <T> parent2 = Select_Parent();

                DNA <T> child = parent1.Crossing_Over(parent2);

                child.Mutation_Function(MutationRate);

                newPopulation.Add(child);
            }
            else
            {
                newPopulation.Add(new DNA <T>(sizeofDNA, random, getRandomGene, fitnessFunction, shouldInitGenes: true));
            }
        }

        List <DNA <T> > tmpList = Population;

        Population    = newPopulation;
        newPopulation = tmpList;

        Generation++;
    }