/* Copyright 2009 by Marcin Szubert Licensed under the Academic Free License version 3.0 */ package cecj.archive; import java.util.List; import cecj.eval.ArchivingCoevolutionaryEvaluator; import cecj.interaction.LearnerTeacherInteractionScheme; import cecj.interaction.LearnerTeacherInteractionScheme.Role; import cecj.problems.TestBasedProblem; import ec.EvolutionState; import ec.Individual; import ec.util.Parameter; /** * Represents archive dedicated for learner-teacher coevolution, where two distinct roles can be * distinguished. The first one (leaner) represents candidate solution to the problem and it is * rewarded for performing well on tests which are representatives of the second role (teacher). * * It requires LearnerTeacherInteractionScheme and TestBasedProblem * definition. * * @author Marcin Szubert * */ public abstract class CandidateTestArchive extends CoevolutionaryArchive { /** * The interaction scheme between coevolving populations. */ protected LearnerTeacherInteractionScheme interactionScheme; /** * Problem which determines the interaction form between candidates and tests. */ protected TestBasedProblem problem; @Override public void setup(EvolutionState state, Parameter base) { super.setup(state, base); ArchivingCoevolutionaryEvaluator e = (ArchivingCoevolutionaryEvaluator) state.evaluator; if (!(e.getInteractionScheme() instanceof LearnerTeacherInteractionScheme)) { state.output .fatal("This archive can be used only with learner-teacher interaction scheme.\n"); } interactionScheme = (LearnerTeacherInteractionScheme) e.getInteractionScheme(); problem = e.getProblem(); } @Override public void submit(EvolutionState state) { List candidatePops = interactionScheme.getSubpopulationIndices(Role.LEARNER); List testPops = interactionScheme.getSubpopulationIndices(Role.TEACHER); for (int candidatePop : candidatePops) { List cArchive = getArchive(state, candidatePop); List candidates = getIndividuals(state, candidatePop); for (int testPop : testPops) { List tArchive = getArchive(state, testPop); List tests = getIndividuals(state, testPop); submit(state, candidates, cArchive, tests, tArchive); } } } /** * Submits new candidates and tests to the archives. The role of the archive is to determine * which individuals of both roles are useful and should be kept in the archive. It is possible * also to remove some existing individual because new one is strictly better. * * @param state * the current evolution state * @param candidates * the list of newly generated candidate solutions * @param cArchive * the list of archival candidate solutions * @param tests * the list of newly generated tests * @param tArchive * the list of archival tests */ protected abstract void submit(EvolutionState state, List candidates, List cArchive, List tests, List tArchive); }