/*
Copyright 2009 by Marcin Szubert
Licensed under the Academic Free License version 3.0
*/
package cecj.archive;
import java.util.List;
import ec.EvolutionState;
import ec.Individual;
import ec.util.Parameter;
/**
* Represents the simplest archive type which just finds the best individual from the submitted
* population and appends it to the list of individuals found in previous generations. Note that, by
* default, the archive size is unbounded and grows steadily over time because no archival
* individuals are removed. By setting the archive-size
parameter value to x,
* only the best competitors from last x generations are maintained.
*
* @author Marcin Szubert
*
*/
public class BestOfGenerationArchive extends CoevolutionaryArchive {
private static final int UNBOUNDED_ARCHIVE_SIZE = -1;
private static final String P_ARCHIVE_SIZE = "size";
private static final String P_SUBPOP = "subpop";
private int[] archiveSize;
private int[] currentArchivePosition;
@Override
public void setup(EvolutionState state, Parameter base) {
super.setup(state, base);
currentArchivePosition = new int[numSubpopulations];
archiveSize = new int[numSubpopulations];
for (int subpop = 0; subpop < numSubpopulations; subpop++) {
Parameter archiveSizeParameter = base.push(P_SUBPOP).push("" + subpop).push(
P_ARCHIVE_SIZE);
archiveSize[subpop] = state.parameters.getIntWithDefault(archiveSizeParameter, null,
UNBOUNDED_ARCHIVE_SIZE);
if (archiveSize[subpop] <= 0 && archiveSize[subpop] != UNBOUNDED_ARCHIVE_SIZE) {
state.output.fatal("Archive size must be > 0.\n", archiveSizeParameter);
}
}
}
@Override
public void submit(EvolutionState state) {
for (int subpop = 0; subpop < numSubpopulations; subpop++) {
Individual bestOfGeneration = findBestIndividual(getIndividuals(state, subpop));
List archive = getArchive(state, subpop);
if ((archiveSize[subpop] == UNBOUNDED_ARCHIVE_SIZE)
|| (archive.size() < archiveSize[subpop])) {
archive.add(bestOfGeneration);
} else {
archive.set(currentArchivePosition[subpop], bestOfGeneration);
currentArchivePosition[subpop]++;
currentArchivePosition[subpop] %= archiveSize[subpop];
}
}
}
private Individual findBestIndividual(List inds) {
Individual result = inds.get(0);
for (Individual ind : inds) {
if (ind.fitness.betterThan(result.fitness)) {
result = ind;
}
}
return result;
}
}