Exemplo n.º 1
0
        public void SelectAdults(Population offspring, Population population, int n, EAMode mode)
        {
            var roulette = new Roulette <IPhenotype>(_rng, offspring.Size + population.Size);

            if (mode == EAMode.MaximizeFitness)
            {
                roulette.AddAll(offspring, e => e.Fitness);
                roulette.AddAll(population, e => e.Fitness);

                population.Clear();
                for (int i = 0; i < n; i++)
                {
                    population.Add(roulette.SpinAndRemove());
                }
            }
            else if (mode == EAMode.MinimizeFitness)
            {
                double p_max = Double.MinValue;
                double p_min = Double.MaxValue;

                foreach (var e in offspring)
                {
                    p_max = Math.Max(e.Fitness, p_max);
                    p_min = Math.Min(e.Fitness, p_min);
                }
                foreach (var e in population)
                {
                    p_max = Math.Max(e.Fitness, p_max);
                    p_min = Math.Min(e.Fitness, p_min);
                }

                foreach (var e in offspring)
                {
                    roulette.Add(e, (p_max + p_min) - e.Fitness);
                }
                foreach (var e in population)
                {
                    roulette.Add(e, (p_max + p_min) - e.Fitness);
                }

                population.Clear();
                for (int i = 0; i < n; i++)
                {
                    population.Add(roulette.SpinAndRemove());
                }
            }
            else
            {
                throw new NotImplementedException(mode.ToString());
            }
        }
Exemplo n.º 2
0
        public void TestRouletteShouldThrowExceptionOnEmpty()
        {
            var roulette = new Roulette <RouletteEntry>(new DefaultRandomNumberGenerator());

            roulette.Add(new RouletteEntry(0), 1);

            roulette.Invoking(r => r.SpinAndRemove()).Should().NotThrow();
            roulette.Invoking(r => r.SpinAndRemove()).Should().Throw <InvalidOperationException>();
        }
Exemplo n.º 3
0
    int Selection()
    {
        roulette.Clear();

        int best = 0, score = ObjectiveFunction(population[0]);

        for (int i = 0; i < population.Count; i++)
        {
            int f = ObjectiveFunction(population[i]);
            if (f < score)
            {
                best  = i;
                score = f;
            }
            roulette.Add(Math.Pow(1d / f, SelectionWeight));
        }

        if (population[best] == localBest)
        {
            age++;
        }
        else
        {
            age = 0;
        }

        localScore = score;
        localBest  = population[best];
        if (localScore < BestScore || BestScore == 0)
        {
            BestSolution.Copy(localBest);
            BestScore = localScore;
        }

        if (age < AgeLimit)
        {
            for (int i = 0; i < SelectionLimit; i++)
            {
                int r = roulette.Get();
                population.Persist(r);
            }
            population.Persist(best);
            population.NextGeneration();
        }
        else
        {
            age = 0;
            RandomizePopulation(population.Count);
            return(Selection());
        }
        return(population.Count);
    }
Exemplo n.º 4
0
        public void TestRouletteProbabilitiesWithRemoval()
        {
            var count  = new int[3];
            var count2 = new int[3];

            for (int i = 0; i < 1000000; i++)
            {
                var roulette = new Roulette <RouletteEntry>(new DefaultRandomNumberGenerator());

                roulette.Add(new RouletteEntry(0), 0.99990);
                roulette.Add(new RouletteEntry(1), 0.00009);
                roulette.Add(new RouletteEntry(2), 0.00001);


                var e1 = roulette.SpinAndRemove();
                count[e1.N]++;
                var e2 = roulette.SpinAndRemove();
                count2[e2.N]++;
            }

            double entry0 = count[0] / 10000.0;
            double entry1 = count[1] / 10000.0;
            double entry2 = count[2] / 10000.0;

            double entry20 = count2[0] / 10000.0;
            double entry21 = count2[1] / 10000.0;
            double entry22 = count2[2] / 10000.0;

            entry0.Should().BeApproximately(100, 1);
            entry1.Should().BeApproximately(0, 1);
            entry2.Should().BeApproximately(0, 1);

            entry20.Should().BeApproximately(0, 2);
            entry21.Should().BeApproximately(90, 2);
            entry22.Should().BeApproximately(10, 2);
        }
Exemplo n.º 5
0
        public void TestRouletteProbabilitiesWithoutRemoval()
        {
            var roulette = new Roulette <RouletteEntry>(new DefaultRandomNumberGenerator());

            roulette.Add(new RouletteEntry(0), 0.5);
            roulette.Add(new RouletteEntry(1), 0.25);
            roulette.Add(new RouletteEntry(2), 0.25);

            var count = new int[3];

            for (int i = 0; i < 1000000; i++)
            {
                var e = roulette.Spin();
                count[e.N]++;
            }

            double entry0 = count[0] / 10000.0;
            double entry1 = count[1] / 10000.0;
            double entry2 = count[2] / 10000.0;

            entry0.Should().BeApproximately(50, 1);
            entry1.Should().BeApproximately(25, 1);
            entry2.Should().BeApproximately(25, 1);
        }