1 package net.bmahe.genetics4j.gp.program;
2
3 import java.util.List;
4 import java.util.Objects;
5 import java.util.random.RandomGenerator;
6
7 import org.apache.commons.lang3.Validate;
8
9 import net.bmahe.genetics4j.core.chromosomes.TreeNode;
10 import net.bmahe.genetics4j.gp.Operation;
11
12 public class RampedHalfAndHalfProgramGenerator implements ProgramGenerator {
13
14 private final RandomGenerator randomGenerator;
15 private final ProgramHelper programHelper;
16
17 private final ProgramGenerator programGenerator;
18
19 public RampedHalfAndHalfProgramGenerator(final RandomGenerator _randomGenerator,
20 final ProgramHelper _programHelper) {
21 Objects.requireNonNull(_randomGenerator);
22 Objects.requireNonNull(_programHelper);
23
24 this.randomGenerator = _randomGenerator;
25 this.programHelper = _programHelper;
26
27 final GrowProgramGenerator growProgramGenerator = new GrowProgramGenerator(programHelper);
28 final FullProgramGenerator fullProgramGenerator = new FullProgramGenerator(programHelper);
29
30 this.programGenerator = new MultiProgramGenerator(randomGenerator,
31 List.of(fullProgramGenerator, growProgramGenerator));
32 }
33
34 @Override
35 public TreeNode<Operation<?>> generate(final Program program) {
36 Objects.requireNonNull(program);
37
38 return programGenerator.generate(program);
39 }
40
41 @Override
42 public <T> TreeNode<Operation<T>> generate(final Program program, final int maxDepth) {
43 Objects.requireNonNull(program);
44 Validate.isTrue(maxDepth > 0);
45
46 final int newMaxDepth = 1 + randomGenerator.nextInt(maxDepth);
47 return programGenerator.generate(program, newMaxDepth);
48 }
49
50 @Override
51 public <T, U> TreeNode<Operation<T>> generate(final Program program, final int maxDepth, final Class<U> rootType) {
52 Objects.requireNonNull(program);
53 Objects.requireNonNull(rootType);
54 Validate.isTrue(maxDepth > 0);
55
56 final int newMaxDepth = 1 + randomGenerator.nextInt(maxDepth);
57 return programGenerator.generate(program, newMaxDepth, rootType);
58 }
59
60 }