diff options
Diffstat (limited to 'src/jcgp/backend/modules/es')
-rw-r--r-- | src/jcgp/backend/modules/es/EvolutionaryStrategy.java | 14 | ||||
-rw-r--r-- | src/jcgp/backend/modules/es/MuPlusLambda.java | 103 | ||||
-rw-r--r-- | src/jcgp/backend/modules/es/TournamentSelection.java | 53 |
3 files changed, 170 insertions, 0 deletions
diff --git a/src/jcgp/backend/modules/es/EvolutionaryStrategy.java b/src/jcgp/backend/modules/es/EvolutionaryStrategy.java new file mode 100644 index 0000000..1117e99 --- /dev/null +++ b/src/jcgp/backend/modules/es/EvolutionaryStrategy.java @@ -0,0 +1,14 @@ +package jcgp.backend.modules.es; + +import jcgp.backend.modules.Module; +import jcgp.backend.modules.mutator.Mutator; +import jcgp.backend.population.Population; +import jcgp.backend.resources.Resources; + +public interface EvolutionaryStrategy extends Module { + + public abstract void evolve(Population population, Mutator mutator, Resources resources); + + public abstract int getFittestChromosome(); + +} diff --git a/src/jcgp/backend/modules/es/MuPlusLambda.java b/src/jcgp/backend/modules/es/MuPlusLambda.java new file mode 100644 index 0000000..53fb932 --- /dev/null +++ b/src/jcgp/backend/modules/es/MuPlusLambda.java @@ -0,0 +1,103 @@ +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 int fittestChromosome; + + private IntegerParameter parents, offspring; + private BooleanParameter report; + + public MuPlusLambda(final Resources resources) { + parents = new IntegerParameter(1, "Parents") { + @Override + public void validate(int newValue) { + if (newValue + offspring.get() != resources.getInt("popSize")) { + status = ParameterStatus.INVALID; + status.setDetails("Parents + offspring must equal population size."); + } else if (newValue <= 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(int newValue) { + if (newValue + parents.get() != resources.getInt("popSize")) { + status = ParameterStatus.INVALID; + status.setDetails("Parents + offspring must equal population size."); + } else if (newValue <= 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 + fittestChromosome = 0; + + if (report.get()) resources.reportln("[ES] Selecting fittest chromosome..."); + for (int i = 0; i < resources.getInt("popSize"); i++) { + if (report.get()) resources.reportln("[ES] Chromosome " + i + ", fitness: " + population.getChromosome(i).getFitness()); + if (population.getChromosome(i).getFitness() >= population.getChromosome(fittestChromosome).getFitness()) { + fittestChromosome = i; + } + } + if (report.get()) resources.reportln("[ES] Selected chromosome: " + fittestChromosome); + + // create copies of fittest chromosome, mutate them + for (int i = 0; i < resources.getInt("popSize"); i++) { + if (i != fittestChromosome) { + if (report.get()) resources.reportln("[ES] Copying fittest chromosome to population position " + i); + population.copyChromosome(fittestChromosome, i); + if (report.get()) resources.reportln("[ES] Mutating copied chromosome"); + mutator.mutate(population.getChromosome(i), resources); + } + } + + } + + @Override + public int getFittestChromosome() { + return fittestChromosome; + } + + @Override + public Parameter[] getLocalParameters() { + return new Parameter[] {parents, offspring, report}; + } + + @Override + public String toString() { + return "(μ + λ)"; + } + +} diff --git a/src/jcgp/backend/modules/es/TournamentSelection.java b/src/jcgp/backend/modules/es/TournamentSelection.java new file mode 100644 index 0000000..3954de8 --- /dev/null +++ b/src/jcgp/backend/modules/es/TournamentSelection.java @@ -0,0 +1,53 @@ +package jcgp.backend.modules.es; + +import java.util.HashMap; + +import jcgp.backend.modules.mutator.Mutator; +import jcgp.backend.population.Population; +import jcgp.backend.resources.Resources; +import jcgp.backend.resources.parameters.IntegerParameter; +import jcgp.backend.resources.parameters.Parameter; + +public class TournamentSelection implements EvolutionaryStrategy { + + private int fittestChromosome; + + private IntegerParameter tournament; + private HashMap<String, Parameter> localParameters; + + public TournamentSelection() { + tournament = new IntegerParameter(1, "Tournament size") { + @Override + public void validate(int newValue) { + // TODO this + } + }; + + localParameters = new HashMap<String, Parameter>(); + localParameters.put("tournament", tournament); + } + + @Override + public Parameter[] getLocalParameters() { + return new Parameter[] {tournament}; + } + + @Override + public void evolve(Population population, Mutator mutator, + Resources parameters) { + tournament.set(tournament.get() + 1); + fittestChromosome = 0; + // TODO implement this + + } + + @Override + public int getFittestChromosome() { + return fittestChromosome; + } + + @Override + public String toString() { + return "Tournament"; + } +} |