Beispiel #1
0
        protected override void NextIteration()
        {
            int populationSize = Population.Count;
            int n   = (int)Math.Sqrt(populationSize);
            int m   = populationSize / n;
            int rem = populationSize - n * m;

            var newGeneration = new List <Individual>(populationSize);

            int    indexOfBest  = 0;
            double maxProba     = 0;
            double currentProba = 0;

            for (int i = 0; i < populationSize - rem; i++)
            {
                var neighbours = FindNeighbours(i, n, m);

                indexOfBest = 0;
                maxProba    = 0;
                for (int j = 0; j < 4; j++)
                {
                    currentProba = neighbours[j].Fitness * (RandomGenerator.NextDouble() * 0.5 + 0.5);
                    if (currentProba > maxProba)
                    {
                        indexOfBest = j;
                        maxProba    = currentProba;
                    }
                }

                var children = neighbours[indexOfBest].Crossover(Population[i], RandomGenerator);
                newGeneration.Add(children.Max());
            }

            for (int i = populationSize - rem; i < populationSize; i++)
            {
                newGeneration.Add(Population[i]);
            }
            if (newGeneration.Count < populationSize)
            {
                newGeneration.Add(Population[RandomGenerator.Next(populationSize)].Mutate(RandomGenerator));
            }

            for (int i = 0; i < newGeneration.Count; i++)
            {
                if (RandomGenerator.NextDouble() < MutationProbability)
                {
                    newGeneration[i] = newGeneration[i].Mutate(RandomGenerator);
                }
            }

            Population = newGeneration;

            foreach (Individual individual in Population)
            {
                if (BestIndividual == null || BestIndividual.CompareTo(individual) < 0)
                {
                    BestIndividual = individual;
                }
            }
        }
Beispiel #2
0
        public void ToNextGeneration()
        {
            m_currentGeneration++;
            // (1,1) , always use children
            if (!Configuration.s_isParentCandidate)
            {
                for (int index = 0; index < m_populationSize; index++)
                {
                    double originalFitness = m_population[index].GetFitness();

                    m_population[index].Mutate();

                    double mutatedFitness = m_population[index].GetFitness();
                }
            }
            else // (1+1)
            {
                for (int index = 0; index < m_populationSize; index++)
                {
                    Chromesome parent = m_population[index];
                    Chromesome child  = new Chromesome(parent);
                    // mutate the child
                    child.Mutate();
                    // in this case, parent wins
                    if (parent.GetFitness() < child.GetFitness())
                    {
                        m_population[index] = parent;
                    }
                    else // in this case, child (after mutation) wins
                    {
                        m_population[index] = child;
                    }
                }
            }

            // set up for successful mutation
            double originalBestFitness = BestIndividual.GetFitness();

            // Update world status
            UpdateBestIndividual();

            double mutatedBestFitness = BestIndividual.GetFitness();

            if (mutatedBestFitness < originalBestFitness)
            {
                m_successfulMutationCount++;
            }
        }
        protected override void NextIteration()
        {
            int populationSize = Population.Count;

            var newGeneration = new List <Individual>(populationSize);
            int eliteSize     = (int)(ElitePart * GenerationSize);

            // add elite individuals to new generation
            newGeneration.AddRange(Population.Take(eliteSize));

            for (int i = 0; i < (populationSize - eliteSize) / 2; i++)
            {
                Individual a1, a2;
                a1 = Population[RandomGenerator.Next(populationSize)];
                a2 = Population[RandomGenerator.Next(populationSize)];

                var children = a1.Crossover(a2, RandomGenerator);
                newGeneration.AddRange(children);
            }

            if (newGeneration.Count < populationSize)
            {
                newGeneration.Add(Population[RandomGenerator.Next(populationSize)].Mutate(RandomGenerator));
            }

            for (int i = 0; i < newGeneration.Count; i++)
            {
                if (RandomGenerator.NextDouble() < MutationProbability)
                {
                    newGeneration[i] = newGeneration[i].Mutate(RandomGenerator);
                }
            }

            newGeneration.Sort();
            newGeneration.Reverse();
            Population = newGeneration;

            if (BestIndividual == null || BestIndividual.CompareTo(Population[0]) < 0)
            {
                BestIndividual = Population[0];
            }
        }