@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) ); }
@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()) ); }
filter(pop.result.getPopulation(), start.getGeneration()), _clock );
@Test(invocationCount = 10) public void prune() { final MathTreePruneAlterer<ProgramGene<Double>, Double> alterer = new MathTreePruneAlterer<>(1); final Genotype<ProgramGene<Double>> gt = Genotype.of( ProgramChromosome.of(10, OPERATIONS, TERMINALS) ); final Phenotype<ProgramGene<Double>, Double> pt = Phenotype.of(gt, 1, a -> 1.0); final AltererResult<ProgramGene<Double>, Double> result = alterer.alter(Seq.of(pt), 1); final ProgramGene<Double> program = result .getPopulation().get(0) .getGenotype() .getGene(); final MathExpr exp1 = new MathExpr(gt.getGene()).simplify(); final MathExpr exp2 = new MathExpr(program); Assert.assertEquals(exp2, exp1); }
@Test public void populationRecombine() { RandomRegistry.using(new Random(123), r -> { ISeq<Phenotype<DoubleGene, Double>> pop = newDoubleGenePopulation(5, 1, 2); final MSeq<Phenotype<DoubleGene, Double>> copy = pop.copy(); final IntermediateCrossover<DoubleGene, Double> recombinator = new IntermediateCrossover<>(1); pop = recombinator.alter(pop, 10).getPopulation(); for (int i = 0; i < pop.size(); ++i) { final Seq<DoubleGene> genes = pop.get(i) .getGenotype() .getChromosome() .toSeq(); final Seq<DoubleGene> genesCopy = copy.get(i) .getGenotype() .getChromosome() .toSeq(); for (int j = 0; j < genes.length(); ++j) { Assert.assertNotEquals(genes.get(j), genesCopy.get(i)); } } }); }
@Test public void populationRecombine() { RandomRegistry.using(new Random(123), r -> { ISeq<Phenotype<DoubleGene, Double>> pop = newDoubleGenePopulation(5, 1, 2); final MSeq<Phenotype<DoubleGene, Double>> copy = pop.copy(); final LineCrossover<DoubleGene, Double> recombinator = new LineCrossover<>(1); pop = recombinator.alter(pop, 10).getPopulation(); for (int i = 0; i < pop.size(); ++i) { final Seq<DoubleGene> genes = pop.get(i) .getGenotype() .getChromosome() .toSeq(); final Seq<DoubleGene> genesCopy = copy.get(i) .getGenotype() .getChromosome() .toSeq(); for (int j = 0; j < genes.length(); ++j) { Assert.assertNotEquals(genes.get(j), genesCopy.get(i)); } } }); }