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

            if (finalCount <= 0)
            {
                return;
            }

            if (Population.Count > 0)
            {
                // Give fitness value to each chromosome of the population
                CalculateFitnessForAllChromosomeInThePopulation();
                // Sort the population according to its fitness value. The most fittest
                // population will come on top
                Population.Sort(CompareChromosome);
            }

            // Clear all previously added new population
            for (int i = 0; i < newPopulation.Count; i++)
            {
                newPopulation[i].DestroyAllGenes();;
            }
            newPopulation.Clear();

            // Determine new population set
            for (int i = 0; i < Population.Count; i++)
            {
                if (i < Elitism && i < Population.Count)
                {
                    newPopulation.Add(Population[i]);
                }
                if (i < Population.Count || crossoverNewchromosome)
                {
                    // Fittest parents will be chosen for crossover
                    Chromosome <T> parent1 = ChooseTheFittestParent();
                    Chromosome <T> parent2 = ChooseTheFittestParent();
                    Chromosome <T> child   = parent1.Crossover(parent2);

                    child.Mutate(MutationRate);

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

            // Randomize the rotation and position of each gene in the chromosome
            for (int i = 0; i < newPopulation.Count; i++)
            {
                if (newPopulation[i].Genes is Furniture[])
                {
                    var furnitures = newPopulation[i].Genes as Furniture[];

                    for (int j = 0; j < furnitures.Length; j++)
                    {
                        if (furnitures[j].FurnitiGameObject == null)
                        {
                            continue;
                        }
                        furnitures[j].FurnitiGameObject.transform.position = Furniture.GetRandomPossition(RoomController.Instance.MaxXPos, RoomController.Instance.MaxZPos);
                        furnitures[j].FurnitiGameObject.transform.rotation = Furniture.GetRandomRotation();
                    }
                }
            }


            List <Chromosome <T> > tmpList = Population;

            Population    = newPopulation;
            newPopulation = tmpList;

            Generation++;
        }