/*
Copyright 2010 by Sean Luke and George Mason University
Licensed under the Academic Free License version 3.0
See the file "LICENSE" for more information
*/
package ec.gp.ge.breed;
import ec.gp.ge.*;
import ec.*;
import ec.util.*;
/*
* GEProblem.java
*
* Created: Sat Oct 16 23:21:01 EDT 2010
* By: Sean Luke, Joseph Zelibor III, and Eric Kangas
*/
/**
* GETruncationPipeline removes the unused genes from the end of the vector.
* The number of used chromosomes are tracked by GESpecies' comsumed(...) function.
*
* Note: truncaton only occurs if the number of comsumed genes is greater than 1.
*
* Default Base
* ge.truncation
*
* @author Sean Luke, Joseph Zelibor III, and Eric Kangas
* @version 1.0
*/
public class GETruncationPipeline extends BreedingPipeline
{
public static final String P_TRUNCATION = "truncation";
public static final int NUM_SOURCES = 1;
public int numSources()
{
return NUM_SOURCES;
}
public Parameter defaultBase()
{
return GEDefaults.base().push(P_TRUNCATION);
}
public int produce(final int min,
final int max,
final int start,
final int subpopulation,
final Individual[] inds,
final EvolutionState state,
final int thread)
{
// grab individuals from our source and stick 'em right into inds.
// we'll modify them from there
int n = sources[0].produce(min,max,start,subpopulation,inds,state,thread);
// should we bother?
if (!state.random[thread].nextBoolean(likelihood))
return reproduce(n, start, subpopulation, inds, state, thread, false); // DON'T produce children from source -- we already did
// now let's mutate 'em
for(int q=start; q < n+start; q++)
{
if (sources[0] instanceof SelectionMethod)
inds[q] = (Individual)(inds[q].clone());
GEIndividual ind = (GEIndividual)(inds[q]);
GESpecies species = (GESpecies) (ind.species);
int consumed = species.consumed(state, ind, thread);
if (consumed > 1)
{
Object[] pieces = new Object[2];
//System.err.println(consumed);
ind.split(new int[] { consumed }, pieces);
ind.join(new Object[] {pieces[0]});
}
}
return n;
}
}
Ads help maintain this website.