/*
* 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;
import java.util.*;
import org.jgap.audit.*;
import org.jgap.data.config.*;
/**
* Abstract base implementation of interface INaturalSelector.
*
* @author Neil Rotstan
* @author Klaus Meffert
* @since 2.0
*/
public abstract class NaturalSelector
implements INaturalSelector, Configurable {
/** String containing the CVS revision. Read out via reflection!*/
private static final String CVS_REVISION = "$Revision: 1.32 $";
protected /*transient*/ Configuration m_config;
protected IEvolutionMonitor m_monitor;
protected boolean m_monitorActive;
/**
* Default constructor
*
* @author Klaus Meffert
* @since 3.3.2
*/
public NaturalSelector() {
}
/**
*
* @param a_config the configuration to use
*
* @author Klaus Meffert
* @since 3.0
*/
public NaturalSelector(Configuration a_config) {
this();
m_config = a_config;
if(m_config == null) {
throw new IllegalArgumentException("Configuration must not be null!");
}
// Monitoring stuff:
IEvolutionMonitor m_monitor = getConfiguration().getMonitor();
m_monitorActive = m_monitor != null;
}
/**
* @return the (immutable) configuration to use
*
* @author Klaus Meffert
* @since 3.0
*/
public Configuration getConfiguration() {
return m_config;
}
/**
* Add a Chromosome instance to this selector's working pool of Chromosomes.
*
* @param a_chromosomeToAdd the specimen to add to the pool
*
* @author Neil Rotstan
* @since 1.0
*/
protected abstract void add(IChromosome a_chromosomeToAdd);
/**
* Comparator regarding only the fitness value. Best fitness value will
* be on first position of resulting sorted list
*
* @author Klaus Meffert
* @since 1.1
*/
public class FitnessValueComparator
implements Comparator, java.io.Serializable {
public int compare(Object first, Object second) {
IChromosome chrom1 = (IChromosome) first;
IChromosome chrom2 = (IChromosome) second;
if (getConfiguration().getFitnessEvaluator().isFitter(chrom2,
chrom1)) {
return 1;
}
else if (getConfiguration().getFitnessEvaluator().isFitter(
chrom1, chrom2)) {
return -1;
}
else {
return 0;
}
}
}
/**
* Comparator regarding first the age (older is better), then the fitness
* value. Better results will be on top of the resulting sorted list.
*
* @author Klaus Meffert
* @since 3.3.3
*/
public class AgeFitnessValueComparator
implements Comparator, java.io.Serializable {
public int compare(Object first, Object second) {
IChromosome chrom1 = (IChromosome) first;
IChromosome chrom2 = (IChromosome) second;
if (chrom1.getAge() > chrom2.getAge()) {
return -1;
}
if (chrom1.getAge() < chrom2.getAge()) {
return 1;
}
if (getConfiguration().getFitnessEvaluator().isFitter(chrom2,
chrom1)) {
return 1;
}
else if (getConfiguration().getFitnessEvaluator().isFitter(
chrom1, chrom2)) {
return -1;
}
else {
return 0;
}
}
}
/**
* Comparator regarding first the fitness value, then the age (younger is
* better). Better results will be on top of the resulting sorted list.
*
* @author Klaus Meffert
* @since 3.3.4
*/
public class FitnessAgeValueComparator
implements Comparator, java.io.Serializable {
public int compare(Object first, Object second) {
IChromosome chrom1 = (IChromosome) first;
IChromosome chrom2 = (IChromosome) second;
if (getConfiguration().getFitnessEvaluator().isFitter(chrom2,
chrom1)) {
return 1;
}
else if (getConfiguration().getFitnessEvaluator().isFitter(
chrom1, chrom2)) {
return -1;
}
if (chrom1.getAge() < chrom2.getAge()) {
return -1;
}
if (chrom1.getAge() > chrom2.getAge()) {
return 1;
}
else {
return 0;
}
}
}
}