package jcgp.backend.modules.es; import jcgp.backend.modules.mutator.Mutator; import jcgp.backend.population.Population; import jcgp.backend.resources.Resources; import jcgp.backend.resources.parameters.BooleanParameter; import jcgp.backend.resources.parameters.IntegerParameter; import jcgp.backend.resources.parameters.Parameter; import jcgp.backend.resources.parameters.ParameterStatus; /** * (μ + λ) EA. * * * @author Eduardo Pedroni * */ public class MuPlusLambda implements EvolutionaryStrategy { private IntegerParameter parents, offspring; private BooleanParameter report; public MuPlusLambda(final Resources resources) { parents = new IntegerParameter(1, "Parents") { @Override public void validate(Number newValue) { if (newValue.intValue() + offspring.get() != resources.populationSize()) { status = ParameterStatus.INVALID; status.setDetails("Parents + offspring must equal population size."); } else if (newValue.intValue() <= 0) { status = ParameterStatus.INVALID; status.setDetails("EA needs at least 1 parent."); } else { status = ParameterStatus.VALID; } } }; offspring = new IntegerParameter(4, "Offspring") { @Override public void validate(Number newValue) { if (newValue.intValue() + parents.get() != resources.populationSize()) { status = ParameterStatus.INVALID; status.setDetails("Parents + offspring must equal population size."); } else if (newValue.intValue() <= 0) { status = ParameterStatus.INVALID; status.setDetails("EA needs at least 1 offspring."); } else { status = ParameterStatus.VALID; } } }; report = new BooleanParameter(false, "Report") { @Override public void validate(Boolean newValue) { // nothing } }; } @Override public void evolve(Population population, Mutator mutator, Resources resources) { // select fittest chromosomes if (report.get()) resources.reportln("[ES] Selected chromosome: " + population.getFittestIndex()); // create copies of fittest chromosome, mutate them for (int i = 0; i < resources.populationSize(); i++) { if (i != population.getFittestIndex()) { if (report.get()) resources.reportln("[ES] Copying fittest chromosome to population position " + i); population.copyChromosome(population.getFittestIndex(), i); if (report.get()) resources.reportln("[ES] Mutating copied chromosome"); mutator.mutate(population.getChromosome(i), resources); } } if (report.get()) resources.reportln("[ES] Generation is complete."); } @Override public Parameter[] getLocalParameters() { return new Parameter[] {parents, offspring, report}; } @Override public String toString() { return "(μ + λ)"; } }