/*
Copyright 2009 by Marcin Szubert
Licensed under the Academic Free License version 3.0
*/
package cecj.archive;
import java.util.ArrayList;
import java.util.List;
import ec.EvolutionState;
import ec.Individual;
/**
* Incremental Pareto-Coevolution Archive.
*
* For each of the submitted candidates it is checked if any useful test exists in the archive or
* currently submitted population, that proves the candidate is non-dominated. If such test is
* found, the considered individual is added to the archive while all individuals that it dominates
* are removed.
*
* The implementation relies heavily on the methods provided by the superclass Ð
* PareroCoevolutionArchive
.
*
* @author Marcin Szubert
*
*/
public class IPCArchive extends ParetoCoevolutionArchive {
@Override
protected void submit(EvolutionState state, List candidates,
List cArchive, List tests, List tArchive) {
List testsCopy = new ArrayList(tests);
List usefulTests;
/*
* Is is a right sequence of operations? Dominated candidates are eliminated before new
* tests are added to the test archive. New tests can make yet another candidate dominated..
*/
for (Individual candidate : candidates) {
if (isUseful(state, candidate, cArchive, tArchive, testsCopy)) {
usefulTests = findUsefulTests(state, candidate, cArchive, tArchive, testsCopy);
eliminateDominatedCandidates(state, candidate, cArchive, tArchive);
cArchive.add(candidate);
tArchive.addAll(usefulTests);
testsCopy.removeAll(usefulTests);
}
}
}
private void eliminateDominatedCandidates(EvolutionState state, Individual candidate,
List candidateArchive, List testArchive) {
for (int c = candidateArchive.size() - 1; c >= 0; c--) {
if (dominates(state, candidate, candidateArchive.get(c), testArchive)) {
candidateArchive.remove(c);
}
}
}
}