View Javadoc
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  }