View Javadoc
1   package net.bmahe.genetics4j.samples;
2   
3   import java.util.Comparator;
4   import java.util.random.RandomGenerator;
5   
6   import org.apache.logging.log4j.LogManager;
7   import org.apache.logging.log4j.Logger;
8   
9   import net.bmahe.genetics4j.core.EASystem;
10  import net.bmahe.genetics4j.core.EASystemFactory;
11  import net.bmahe.genetics4j.core.chromosomes.IntChromosome;
12  import net.bmahe.genetics4j.core.evolutionlisteners.EvolutionListeners;
13  import net.bmahe.genetics4j.core.spec.EAConfiguration;
14  import net.bmahe.genetics4j.core.spec.EAConfiguration.Builder;
15  import net.bmahe.genetics4j.core.spec.EAExecutionContext;
16  import net.bmahe.genetics4j.core.spec.EAExecutionContexts;
17  import net.bmahe.genetics4j.core.spec.EvolutionResult;
18  import net.bmahe.genetics4j.core.spec.Optimization;
19  import net.bmahe.genetics4j.core.spec.chromosome.IntChromosomeSpec;
20  import net.bmahe.genetics4j.core.spec.combination.MultiPointCrossover;
21  import net.bmahe.genetics4j.core.spec.mutation.PartialMutation;
22  import net.bmahe.genetics4j.core.spec.mutation.RandomMutation;
23  import net.bmahe.genetics4j.core.spec.selection.RouletteWheel;
24  
25  public class SimpleTest {
26  	public static final Logger logger = LogManager.getLogger(SimpleTest.class);
27  
28  	public static void main(String[] args) {
29  
30  		final RandomGenerator randomGenerator = RandomGenerator.getDefault();
31  
32  		final Builder<Double> eaConfigurationBuilder = new EAConfiguration.Builder<>();
33  		eaConfigurationBuilder.chromosomeSpecs(IntChromosomeSpec.of(10, 0, 10))
34  				.parentSelectionPolicy(RouletteWheel.build())
35  				.combinationPolicy(MultiPointCrossover.of(2))
36  				.mutationPolicies(RandomMutation.of(0.15), PartialMutation.of(0, RandomMutation.of(0.05)))
37  				.optimization(Optimization.MINIMIZE)
38  				.fitness(genoType -> {
39  					final IntChromosome intChromosome = genoType.getChromosome(0, IntChromosome.class);
40  					double denominator = 0.0;
41  					for (int i = 0; i < intChromosome.getNumAlleles(); i++) {
42  						denominator += Math.abs(i - intChromosome.getAllele(i));
43  					}
44  
45  					return denominator;
46  				})
47  				.termination(
48  						(eaConfiguration, generation, population,
49  								fitness) -> fitness.stream().min(Comparator.naturalOrder()).orElseThrow() < 0.0001);
50  		final EAConfiguration<Double> eaConfiguration = eaConfigurationBuilder.build();
51  
52  		final EAExecutionContext<Double> eaExecutionContext = EAExecutionContexts.<Double>forScalarFitness()
53  				.populationSize(100)
54  				.randomGenerator(randomGenerator)
55  				.addEvolutionListeners(EvolutionListeners.ofLogTopN(logger, 3, Comparator.<Double>reverseOrder()))
56  				.build();
57  
58  		final EASystem<Double> eaSystem = EASystemFactory.from(eaConfiguration, eaExecutionContext);
59  
60  		final EvolutionResult<Double> evolutionResult = eaSystem.evolve();
61  		logger.info("Best genotype: {}", evolutionResult.bestGenotype());
62  
63  		System.exit(0);
64  	}
65  }