/* Copyright 2006 by Sean Luke Licensed under the Academic Free License version 3.0 See the file "LICENSE" for more information */ package ec.es; import ec.*; import ec.util.*; /* * ESSelection.java * * Created: Thu Sep 7 19:08:19 2000 * By: Sean Luke */ /** * ESSelection is a special SelectionMethod designed to be used with * evolutionary strategies-type breeders. * *

To do evolution strategies evolution, the * breeding pipelines should contain at least one ESSelection selection method. * While a child is being generated by the pipeline, the ESSelection object will return a parent * from the pool of mu parents. The particular parent is chosen round-robin, so all the parents * will have an equal number of children. It's perfectly fine to have more than one ESSelection * object in the tree, or to call the same one repeatedly during the course of generating a child; * all such objects will consistently return the same parent. They only increment to the nex * parent in the pool of mu parents after the child has been created from the pipeline. You can * also mix ESSelection operators with other operators (like Tournament Selection). But you ought * to have at least one ESSelection operator in the pipeline -- else it wouldn't be Evolution * Strategies, would it?

Default Base
es.select * @author Sean Luke * @version 1.0 */ public class ESSelection extends SelectionMethod { public static final String P_ESSELECT = "select"; public Parameter defaultBase() { return ESDefaults.base().push(P_ESSELECT); } // MuCommaLambdaBreeder expects us to set the count to nonzero to indicate our existence public void prepareToProduce(final EvolutionState state, final int subpopulation, final int thread) { super.prepareToProduce(state, subpopulation, thread); if (!(state.breeder instanceof MuCommaLambdaBreeder)) state.output.fatal("ESSelection was handed a Breeder that's not either MuCommaLambdaBreeder or MuCommaPlusLambdaBreeder."); MuCommaLambdaBreeder breeder = (MuCommaLambdaBreeder)(state.breeder); breeder.count[thread] = 1; } public int produce(final int subpopulation, final EvolutionState state, final int thread) { if (!(state.breeder instanceof MuCommaLambdaBreeder)) state.output.fatal("ESSelection was handed a Breeder that's not either MuCommaLambdaBreeder or MuCommaPlusLambdaBreeder."); MuCommaLambdaBreeder breeder = (MuCommaLambdaBreeder)(state.breeder); // determine my position in the array int pos = (breeder.lambda[subpopulation] % state.breedthreads == 0 ? breeder.lambda[subpopulation]/state.breedthreads : breeder.lambda[subpopulation]/state.breedthreads + 1) * thread + breeder.count[thread]; // note integer division // determine the parent int parent = pos / breeder.mu[subpopulation]; // note integer division // increment our count //breeder.count[thread]++; return parent; } public int produce(final int min, final int max, final int start, final int subpopulation, final Individual[] inds, final EvolutionState state, final int thread) { if (min>1) // uh oh state.output.fatal("ESSelection used, but it's being asked to produce more than one individual."); if (!(state.breeder instanceof MuCommaLambdaBreeder)) state.output.fatal("ESSelection was handed a Breeder that's not either MuCommaLambdaBreeder or MuCommaPlusLambdaBreeder."); MuCommaLambdaBreeder breeder = (MuCommaLambdaBreeder)(state.breeder); // determine my position in the array int pos = (breeder.lambda[subpopulation] % state.breedthreads == 0 ? breeder.lambda[subpopulation]/state.breedthreads : breeder.lambda[subpopulation]/state.breedthreads + 1) * thread + breeder.count[thread]; // note integer division // determine the parent int parent = pos / (breeder.lambda[subpopulation] / breeder.mu[subpopulation]); // note outer integer division // increment our count //breeder.count[thread]++; // and so we return the parent inds[start] = state.population.subpops[subpopulation].individuals[parent]; // and so we return the parent return 1; } }