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()); } }
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>(); }
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); }
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); }
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); }