/* Copyright 2006 by Sean Luke Licensed under the Academic Free License version 3.0 See the file "LICENSE" for more information */ package ec.breed; import ec.*; import ec.util.*; /* * BufferedBreedingPipeline.java * * Created: December 28, 1999 * By: Sean Luke */ /** * If empty, a * BufferedBreedingPipeline makes a request of exactly num-inds * individuals from a single child source; it then uses these * individuals to fill requests (returning min each time), * until the buffer is emptied, at * which time it grabs exactly num-inds more individuals, and so on. * *

What is this useful for? Well, let's say for example that * you want to cross over two individuals, then cross * them over again. You'd like to hook up two CrossoverPipelines * in series. Unfortunately, CrossoverPipeline takes * two sources; even if you set them to the same source, it requests * one individual from the first source and then one * from the second, where what you really want is for it to request * two individuals from a single source (the other CrossoverPipeline). * *

The solution to this is to hook a CrossoverPipeline as the * source to a BufferedBreedingPipeline of buffer-size 2 (or some * multiple of 2 actually). Then the BufferedBreedingPipeline is * set as both sources to another CrossoverPipeline.

Typical Number of Individuals Produced Per produce(...) call
1

Number of Sources
1

Parameters
base.num-inds
int >= 1
(the buffer size)

Default Base
breed.buffered * * @author Sean Luke * @version 1.0 */ public class BufferedBreedingPipeline extends BreedingPipeline { public static final String P_BUFSIZE = "num-inds"; public static final String P_BUFFERED = "buffered"; public static final int INDS_PRODUCED = 1; public static final int NUM_SOURCES = 1; public Individual[] buffer; public int currentSize; public Parameter defaultBase() { return BreedDefaults.base().push(P_BUFFERED); } public int numSources() { return NUM_SOURCES; } public int typicalIndsProduced() { return INDS_PRODUCED;} public void setup(final EvolutionState state, final Parameter base) { super.setup(state,base); Parameter def = defaultBase(); int bufsize = state.parameters.getInt(base.push(P_BUFSIZE), def.push(P_BUFSIZE),1); if (bufsize == 0) state.output.fatal("BufferedBreedingPipeline's number of individuals must be >= 1.",base.push(P_BUFSIZE),def.push(P_BUFSIZE)); buffer = new Individual[bufsize]; currentSize=0; // just in case // declare that likelihood isn't used if (likelihood < 1.0f) state.output.warning("BufferedBreedingPipeline does not respond to the 'likelihood' parameter.", base.push(P_LIKELIHOOD), def.push(P_LIKELIHOOD)); } public void prepareToProduce(final EvolutionState state, final int subpopulation, final int thread) { super.prepareToProduce(state,subpopulation,thread); // reset my number of individuals to 0 currentSize=0; } public int produce(final int min, final int max, final int start, final int subpopulation, final Individual[] inds, final EvolutionState state, final int thread) { for(int q=start;q