package org.jenetix;
import static org.jenetics.engine.EvolutionResult.toBestPhenotype;
import static org.jenetics.engine.limit.byFitnessThreshold;
import java.util.stream.IntStream;
import org.jenetics.CharacterChromosome;
import org.jenetics.CharacterGene;
import org.jenetics.Genotype;
import org.jenetics.Phenotype;
import org.jenetics.engine.Engine;
import org.jenetics.util.CharSeq;
import org.jenetics.util.Factory;
/**
* @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
* @since 3.5
* @version 3.5
*/
public class WeaselProgram {
private static final String TARGET = "METHINKS IT IS LIKE A WEASEL";
private static int score(final Genotype<CharacterGene> gt) {
final CharSequence source = (CharSequence)gt.getChromosome();
return IntStream.range(0, TARGET.length())
.map(i -> source.charAt(i) == TARGET.charAt(i) ? 1 : 0)
.sum();
}
public static void main(String[] args) throws Exception {
final CharSeq chars = CharSeq.of("A-Z ");
final Factory<Genotype<CharacterGene>> gtf = Genotype.of(
new CharacterChromosome(chars, TARGET.length())
);
final Engine<CharacterGene, Integer> engine = Engine
.builder(WeaselProgram::score, gtf)
.populationSize(150)
.selector(new WeaselSelector<>())
.offspringFraction(1)
.alterers(new WeaselMutator<>(0.05))
.build();
final Phenotype<CharacterGene, Integer> result = engine.stream()
.limit(byFitnessThreshold(TARGET.length() - 1))
.peek(r -> System.out.println(
r.getTotalGenerations() + ": " + r.getBestPhenotype()))
.collect(toBestPhenotype());
System.out.println(result);
}
}