@Test public void crossover() { final ISeq<CharacterGene> g1 = CharacterChromosome.of("1234567890").toSeq(); final ISeq<CharacterGene> g2 = CharacterChromosome.of("abcdefghij").toSeq(); final int rv1 = 12; using(new Random(10), r -> { final UniformCrossover<CharacterGene, Double> crossover = new UniformCrossover<>(0.5, 0.5); MSeq<CharacterGene> g1c = g1.copy(); MSeq<CharacterGene> g2c = g2.copy(); final int changed = crossover.crossover(g1c, g2c); Assert.assertEquals(changed, IntStream.range(0, g2c.length()) .filter(i -> Character.isDigit(g2c.get(i).charValue())) .count() ); }); }
@Test public void crossoverAll1() { final CharSeq chars = CharSeq.of("a-zA-Z"); final ISeq<CharacterGene> g1 = CharacterChromosome.of(chars, 20).toSeq(); final ISeq<CharacterGene> g2 = CharacterChromosome.of(chars, 20).toSeq(); final MultiPointCrossover<CharacterGene, Double> crossover = new MultiPointCrossover<>(2000); final int[] points = new int[g1.length()]; for (int i = 0; i < points.length; ++i) { points[i] = i; } final MSeq<CharacterGene> ms1 = g1.copy(); final MSeq<CharacterGene> ms2 = g2.copy(); crossover.crossover(ms1, ms2); }
@Test(dataProvider = "numberOfCrossoverPoints") public void reverseCrossover(final Integer npoints) { for (int i = 1; i < 500; ++i) { final CharSeq chars = CharSeq.of("a-zA-Z"); final ISeq<Character> a = CharacterChromosome.of(chars, i).toSeq() .map(CharacterGene::getAllele); final ISeq<Character> b = CharacterChromosome.of(chars, i).toSeq() .map(CharacterGene::getAllele); final MSeq<Character> ma1 = a.copy(); final MSeq<Character> mb1 = b.copy(); final int[] points = comb.subset( a.length() + 1, min(npoints, a.length() + 1), new Random(1234) ); MultiPointCrossover.crossover(ma1, mb1, points); MultiPointCrossover.crossover(ma1, mb1, points); Assert.assertEquals(ma1, a); Assert.assertEquals(mb1, b); } }
@Test public void crossoverChanges() { final ISeq<CharacterGene> g1 = CharacterChromosome.of("1234567890").toSeq(); final ISeq<CharacterGene> g2 = CharacterChromosome.of("abcdefghij").toSeq(); final int rv1 = 12; using(new Random(10), r -> { final UniformCrossover<CharacterGene, Double> crossover = new UniformCrossover<>(0.5, 0.5); final DoubleMomentStatistics statistics = new DoubleMomentStatistics(); for (int j = 0; j < 1000; ++j) { MSeq<CharacterGene> g1c = g1.copy(); MSeq<CharacterGene> g2c = g2.copy(); final int changed = crossover.crossover(g1c, g2c); Assert.assertEquals(changed, IntStream.range(0, g2c.length()) .filter(i -> Character.isDigit(g2c.get(i).charValue())) .count() ); statistics.accept(changed); } Assert.assertEquals(statistics.getMean(), 5.0, 0.0001); }); }