View Javadoc
1   package net.bmahe.genetics4j.gp.spec;
2   
3   import java.util.Objects;
4   import java.util.random.RandomGenerator;
5   
6   import net.bmahe.genetics4j.core.chromosomes.factory.ImmutableChromosomeFactoryProvider;
7   import net.bmahe.genetics4j.core.spec.ImmutableEAExecutionContext;
8   import net.bmahe.genetics4j.core.spec.ImmutableEAExecutionContext.Builder;
9   import net.bmahe.genetics4j.gp.chromosomes.factory.ProgramTreeChromosomeFactory;
10  import net.bmahe.genetics4j.gp.combination.ProgramRandomCombineHandler;
11  import net.bmahe.genetics4j.gp.mutation.NodeReplacementPolicyHandler;
12  import net.bmahe.genetics4j.gp.mutation.ProgramRandomMutatePolicyHandler;
13  import net.bmahe.genetics4j.gp.mutation.ProgramRandomPrunePolicyHandler;
14  import net.bmahe.genetics4j.gp.mutation.ProgramRulesApplicatorPolicyHandler;
15  import net.bmahe.genetics4j.gp.mutation.TrimTreePolicyHandler;
16  import net.bmahe.genetics4j.gp.program.ProgramGenerator;
17  import net.bmahe.genetics4j.gp.program.ProgramHelper;
18  import net.bmahe.genetics4j.gp.program.RampedHalfAndHalfProgramGenerator;
19  
20  /**
21   * Defines multiple factory and helper methods to create and manage EAExecutionContexts appropriate for Genetic
22   * Programming
23   */
24  public class GPEAExecutionContexts {
25  
26  	private GPEAExecutionContexts() {
27  	}
28  
29  	/**
30  	 * Create a new EAExecutionContext pre-configured to support Genetic Programming.
31  	 * <p>It adds support for some operators to select, mutate and combine programs.
32  	 * 
33  	 * @param <T>              Type of the fitness measurement
34  	 * @param randomGenerator  Random Generator
35  	 * @param programHelper    Instance of ProgramHelper
36  	 * @param programGenerator Instance of a program generator which will be used to generate individuals
37  	 * @return A new instance of a EAExecutionContext
38  	 */
39  	public static <T extends Comparable<T>> Builder<T> forGP(final RandomGenerator randomGenerator,
40  			final ProgramHelper programHelper, final ProgramGenerator programGenerator) {
41  		Objects.requireNonNull(randomGenerator);
42  		Objects.requireNonNull(programHelper);
43  		Objects.requireNonNull(programGenerator);
44  
45  		final var builder = ImmutableEAExecutionContext.<T>builder();
46  		builder.randomGenerator(randomGenerator);
47  
48  		builder.addMutationPolicyHandlerFactories(
49  				gsd -> new ProgramRandomPrunePolicyHandler<>(gsd.randomGenerator(), programHelper),
50  				gsd -> new ProgramRandomMutatePolicyHandler<>(gsd.randomGenerator(), programGenerator),
51  				gsd -> new NodeReplacementPolicyHandler<>(randomGenerator, programHelper),
52  				gsd -> new ProgramRulesApplicatorPolicyHandler<>(),
53  				gsd -> new TrimTreePolicyHandler<>(randomGenerator, programGenerator));
54  
55  		builder.addChromosomeCombinatorHandlerFactories(gsd -> new ProgramRandomCombineHandler<T>(gsd.randomGenerator()));
56  
57  		final var chromosomeFactoryProviderBuilder = ImmutableChromosomeFactoryProvider.builder();
58  		chromosomeFactoryProviderBuilder.randomGenerator(randomGenerator);
59  		chromosomeFactoryProviderBuilder
60  				.addChromosomeFactoriesGenerator(cdp -> new ProgramTreeChromosomeFactory(programGenerator));
61  		builder.chromosomeFactoryProvider(chromosomeFactoryProviderBuilder.build());
62  
63  		return builder;
64  	}
65  
66  	/**
67  	 * Create a new EAExecutionContext pre-configured to support Genetic Programming.
68  	 * <p>It adds support for some operators to select, mutate and combine programs. It also configure a default program
69  	 * generation based on ramped hald and half.
70  	 * 
71  	 * @param <T>             Type of the fitness measurement
72  	 * @param randomGenerator Random Generator
73  	 * @return A new instance of a EAExecutionContext
74  	 */
75  	public static <T extends Comparable<T>> Builder<T> forGP(final RandomGenerator randomGenerator) {
76  		Objects.requireNonNull(randomGenerator);
77  
78  		final var programHelper = new ProgramHelper(randomGenerator);
79  		final var programGenerator = new RampedHalfAndHalfProgramGenerator(randomGenerator, programHelper);
80  
81  		return forGP(randomGenerator, programHelper, programGenerator);
82  	}
83  }