View Javadoc
1   package net.bmahe.genetics4j.samples;
2   
3   import static net.bmahe.genetics4j.core.termination.Terminations.or;
4   
5   import org.apache.logging.log4j.LogManager;
6   import org.apache.logging.log4j.Logger;
7   
8   import net.bmahe.genetics4j.core.EASystem;
9   import net.bmahe.genetics4j.core.EASystemFactory;
10  import net.bmahe.genetics4j.core.chromosomes.IntChromosome;
11  import net.bmahe.genetics4j.core.evolutionlisteners.EvolutionListeners;
12  import net.bmahe.genetics4j.core.spec.EAConfiguration;
13  import net.bmahe.genetics4j.core.spec.EAConfiguration.Builder;
14  import net.bmahe.genetics4j.core.spec.EAExecutionContext;
15  import net.bmahe.genetics4j.core.spec.EAExecutionContexts;
16  import net.bmahe.genetics4j.core.spec.EvolutionResult;
17  import net.bmahe.genetics4j.core.spec.chromosome.IntChromosomeSpec;
18  import net.bmahe.genetics4j.core.spec.combination.MultiPointCrossover;
19  import net.bmahe.genetics4j.core.spec.mutation.RandomMutation;
20  import net.bmahe.genetics4j.core.spec.selection.Tournament;
21  import net.bmahe.genetics4j.core.termination.Terminations;
22  
23  public class QuickStart {
24  
25  	public static final Logger logger = LogManager.getLogger(QuickStart.class);
26  
27  	public static void main(String[] args) {
28  
29  		// tag::quickstart_variables[]
30  		final int numEntries = 10; // <1>
31  		final int minValue = 0; // <2>
32  		final int maxValue = 20; // <3>
33  		// end::quickstart_variables[]
34  
35  		// tag::quickstart_genotype_spec[]
36  		final Builder<Integer> eaConfigurationBuilder = new EAConfiguration.Builder<>();
37  		eaConfigurationBuilder.chromosomeSpecs(IntChromosomeSpec.of(numEntries, minValue, maxValue))
38  				.parentSelectionPolicy(Tournament.of(5))
39  				.combinationPolicy(MultiPointCrossover.of(2))
40  				.mutationPolicies(RandomMutation.of(0.15))
41  				.fitness(genoType -> {
42  					final IntChromosome intChromosome = genoType.getChromosome(0, IntChromosome.class);
43  					int correctCount = 0;
44  					for (int i = 0; i < intChromosome.getNumAlleles(); i++) {
45  						if (i == intChromosome.getAllele(i)) {
46  							correctCount++;
47  						}
48  					}
49  
50  					return correctCount;
51  				})
52  				.termination(or(Terminations.ofFitnessAtLeast(numEntries), Terminations.ofMaxGeneration(50)));
53  		final EAConfiguration<Integer> eaConfiguration = eaConfigurationBuilder.build();
54  		// end::quickstart_genotype_spec[]
55  
56  		// tag::quickstart_genetic_system_descriptor[]
57  		final EAExecutionContext<Integer> eaExecutionContext = EAExecutionContexts.<Integer>forScalarFitness()
58  				.populationSize(100)
59  				.addEvolutionListeners(EvolutionListeners.ofLogTopN(logger, 3))
60  				.build();
61  		// end::quickstart_genetic_system_descriptor[]
62  
63  		// tag::quickstart_genetic_system[]
64  		final EASystem<Integer> eaSystem = EASystemFactory.from(eaConfiguration, eaExecutionContext);
65  		// end::quickstart_genetic_system[]
66  
67  		// tag::quickstart_evolve[]
68  		final EvolutionResult<Integer> evolutionResult = eaSystem.evolve();
69  		logger.info("Best genotype: {}", evolutionResult.bestGenotype());
70  		logger.info("  with fitness: {}", evolutionResult.bestFitness());
71  		logger.info("  at generation: {}", evolutionResult.generation());
72  		// end::quickstart_evolve[]
73  
74  		System.exit(0);
75  	}
76  }