/* * This file is part of JGAP. * * JGAP offers a dual license model containing the LGPL as well as the MPL. * * For licensing information please see the file license.txt included with JGAP * or have a look at the top of class org.jgap.Chromosome which representatively * includes the JGAP license policy applicable for any file delivered with JGAP. */ package org.jgap.gp.impl; import java.util.Comparator; import org.jgap.*; import org.jgap.gp.*; /** * Simple comparator to allow the sorting of GPProgram lists with the highest * fitness value in first place of the list. * Usage example: * Arrays.sort( * population.getGPPrograms(), * new GPProgramFitnessComparator() ); * * @author Klaus Meffert * @since 3.0 */ public class GPProgramFitnessComparator implements Comparator { /** String containing the CVS revision. Read out via reflection!*/ private final static String CVS_REVISION = "$Revision: 1.4 $"; private IGPFitnessEvaluator m_fitnessEvaluator; /** * Constructs the comparator using the DefaultFitnessEvaluator * * @author Klaus Meffert * @since 3.0 */ public GPProgramFitnessComparator() { this(new DefaultGPFitnessEvaluator()); } /** * @param a_evaluator the fitness evaluator to use * * @author Klaus Meffert * @since 3.0 */ public GPProgramFitnessComparator(IGPFitnessEvaluator a_evaluator) { if (a_evaluator == null) { throw new IllegalArgumentException("Evaluator must not be null"); } m_fitnessEvaluator = a_evaluator; } /** * Compares two programs by using a FitnessEvaluator. * * @param a_program1 the first program to compare * @param a_program2 the second program to compare * @return -1 if a_program1 is fitter than a_program2, 1 if it is the other * way round and 0 if both are equal * * @author Klaus Meffert * @since 3.0 */ public int compare(final Object a_program1, final Object a_program2) { IGPProgram progOne = (IGPProgram) a_program1; IGPProgram progTwo = (IGPProgram) a_program2; if (m_fitnessEvaluator.isFitter(progOne, progTwo)) { return -1; } else if (m_fitnessEvaluator.isFitter(progTwo, progOne)) { return 1; } else { return 0; } } }