@Override public AltererResult<G, C> alter( final Seq<Phenotype<G, C>> population, final long generation ) { AltererResult<G, C> result = AltererResult.of(population.asISeq()); for (Alterer<G, C> alterer : _alterers) { final AltererResult<G, C> as = alterer.alter( result.getPopulation(), generation ); result = AltererResult.of( as.getPopulation(), as.getAlterations() + result.getAlterations() ); } return result; }
@Test(dataProvider = "alterCountParameters") public void alterCount( final Integer ngenes, final Integer nchromosomes, final Integer npopulation ) { final ISeq<Phenotype<DoubleGene, Double>> p1 = newDoubleGenePopulation(ngenes, nchromosomes, npopulation); final Alterer<DoubleGene, Double> mutator = newAlterer(0.01); final AltererResult<DoubleGene, Double> result = mutator.alter(p1, 1); int mutations = result.getAlterations(); int difference = diff(p1, result.getPopulation()); Assert.assertEquals( mutations, difference, String.format("diff=%s, mutations=%s", difference, mutations) ); }
@Override @Test(dataProvider = "alterCountParameters") public void alterCount( final Integer ngenes, final Integer nchromosomes, final Integer npopulation ) { final ISeq<Phenotype<DoubleGene, Double>> p1 = newDoubleGenePopulation(ngenes, nchromosomes, npopulation); final MSeq<Phenotype<DoubleGene, Double>> p2 = p1.copy(); Assert.assertEquals(p2, p1); final Alterer<DoubleGene, Double> mutator = newAlterer(0.01); final int alterations = mutator.alter(p2, 1).getAlterations(); //final int diff = diff(p1, p2); if (ngenes == 1) { Assert.assertEquals(alterations, 0); } else { //Assert.assertTrue(alterations >= diff/2, String.format("%d >= %d", alterations, diff/2)); //Assert.assertTrue(alterations <= 2*diff, String.format("%d < %d", alterations, 2*diff)); } }
@Test(dataProvider = "alterCountParameters") public void alterCount( final Integer ngenes, final Integer nchromosomes, final Integer npopulation ) { final ISeq<Phenotype<DoubleGene, Double>> p1 = population(ngenes, nchromosomes, npopulation); final Alterer<DoubleGene, Double> mutator = newAlterer(0.01); final AltererResult<DoubleGene, Double> result = mutator.alter(p1, 1); Assert.assertEquals( result.getAlterations(), diff(p1, result.getPopulation()) ); }
killCount, invalidCount, alteredOffspring.join().result.getAlterations()
final long alterations = crossover .alter(population, 1) .getAlterations(); histogram.accept(alterations); variance.accept(alterations);
final long alterations = crossover .alter(population, 1) .getAlterations(); histogram.accept(alterations); variance.accept(alterations);
@Test(dataProvider = "alterProbabilityParameters", groups = {"statistics"}) public void alterProbability( final Integer ngenes, final Integer nchromosomes, final Integer npopulation, final Double p ) { final ISeq<Phenotype<EnumGene<Double>, Double>> population = newPermutationDoubleGenePopulation(ngenes, nchromosomes, npopulation); // The mutator to test. final PartiallyMatchedCrossover<Double, Double> crossover = new PartiallyMatchedCrossover<>(p); final long nallgenes = ngenes*nchromosomes*npopulation; final long N = 100; final double mean = crossover.getOrder()*npopulation*p; final long min = 0; final long max = nallgenes; final Range<Long> domain = new Range<>(min, max); final Histogram<Long> histogram = Histogram.ofLong(min, max, 10); final LongMomentStatistics variance = new LongMomentStatistics(); for (int i = 0; i < N; ++i) { final long alterations = crossover .alter(population, 1) .getAlterations(); histogram.accept(alterations); variance.accept(alterations); } // Normal distribution as approximation for binomial distribution. // TODO: Implement test //assertDistribution(histogram, new NormalDistribution<>(domain, mean, variance.getVariance())); }
final long alterations = mutator .alter(population.copy(), 1) .getAlterations();
@Override public AltererResult<G, C> alter( final Seq<Phenotype<G, C>> population, final long generation ) { final AltererResult<G, C> result = _adoptee.alter(population, generation); final MSeq<Phenotype<G, C>> pop = MSeq.of(population); for (int i = 0, n = pop.size(); i < n; ++i) { if (!pop.get(i).isValid()) { pop.set(i, repair(pop.get(i))); } } return AltererResult.of(pop.toISeq(), result.getAlterations()); }