MultiProgramGenerator.java
package net.bmahe.genetics4j.gp.program;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.random.RandomGenerator;
import org.apache.commons.lang3.Validate;
import net.bmahe.genetics4j.core.chromosomes.TreeNode;
import net.bmahe.genetics4j.gp.Operation;
public class MultiProgramGenerator implements ProgramGenerator {
private final List<ProgramGenerator> programGenerators = new ArrayList<>();
private final RandomGenerator randomGenerator;
public MultiProgramGenerator(final RandomGenerator _randomGenerator,
final Collection<ProgramGenerator> _programGenerators) {
Objects.requireNonNull(_randomGenerator);
Objects.requireNonNull(_programGenerators);
Validate.isTrue(_programGenerators.isEmpty() == false, "At least one program generator must be provided");
this.randomGenerator = _randomGenerator;
this.programGenerators.addAll(_programGenerators);
}
private ProgramGenerator pickProgramGenerator() {
final int programGeneratorIndex = randomGenerator.nextInt(programGenerators.size());
return programGenerators.get(programGeneratorIndex);
}
@Override
public TreeNode<Operation<?>> generate(final Program program) {
Objects.requireNonNull(program);
final ProgramGenerator programGenerator = pickProgramGenerator();
return programGenerator.generate(program);
}
@Override
public <T> TreeNode<Operation<T>> generate(final Program program, final int maxDepth) {
Objects.requireNonNull(program);
Validate.isTrue(maxDepth > 0);
final ProgramGenerator programGenerator = pickProgramGenerator();
return programGenerator.generate(program, maxDepth);
}
@Override
public <T, U> TreeNode<Operation<T>> generate(final Program program, final int maxDepth, final Class<U> rootType) {
Objects.requireNonNull(program);
Validate.isTrue(maxDepth > 0);
Objects.requireNonNull(program);
final ProgramGenerator programGenerator = pickProgramGenerator();
return programGenerator.generate(program, maxDepth, rootType);
}
}