ec.multiobjective
Class MultiObjectiveFitness

java.lang.Object
  extended by ec.Fitness
      extended by ec.multiobjective.MultiObjectiveFitness
All Implemented Interfaces:
Prototype, Setup, java.io.Serializable, java.lang.Cloneable, java.lang.Comparable
Direct Known Subclasses:
NSGA2MultiObjectiveFitness, SPEA2MultiObjectiveFitness

public class MultiObjectiveFitness
extends Fitness

MultiObjectiveFitness is a subclass of Fitness which implements basic multi-objective mechanisms suitable for being used with a variety of multi-objective selection mechanisms, including ones using pareto-optimality.

The object contains two items: an array of floating point values representing the various multiple fitnesses, and a flag (maximize) indicating whether higher is considered better. By default, isIdealFitness() always returns false; you might want to override that, though it'd be unusual -- what is the ideal fitness from the perspective of a pareto front?

The object also contains maximum and minimum fitness values suggested for the problem, on a per-objective basis. By default the maximum values are all 1.0 and the minimum values are all 0.0, but you can change these. Note that maximum does not mean "best" unless maximize is true.

The class also contains utility methods or computing pareto dominance, Pareto Fronts and Pareto Front Ranks, and distance in multiobjective space. The default comparison operators use Pareto Dominance, though this is often overridden by subclasses.

The fitness() method returns the maximum of the fitness values, which is clearly nonsensical: you should not be using this method.

Subclasses of this class may add certain auxiliary fitness measures which are printed out by MultiObjectiveStatistics along with the multiple objectives. To have these values printed out, override the getAuxiliaryFitnessNames() and getAuxiliaryFitnessValues() methods.

Parameters

base.num-objectives
(else)multi.num-objectives
int >= 1
(the number of fitnesses in the objectives array)
base.maximize
bool = true (default) or false
(are higher values considered "better"?)
base.max
float (1.0 default) (maximum fitness value for all objectives) base.max.i
float (1.0 default) (maximum fitness value for objective i. Overrides the all-objective maximum fitness.) base.min
float (0.0 (default) (minimum fitness value for all objectives) base.min.i
float = 0.0 (default) (minimum fitness value for objective i. Overrides the all-objective minimum fitness.)

Default Base
multi.fitness

See Also:
Serialized Form

Field Summary
static java.lang.String FITNESS_POSTAMBLE
           
protected  boolean maximize
           
 float[] maxObjective
          Desired maximum fitness values.
 float[] minObjective
          Desired minimum fitness values.
static java.lang.String MULTI_FITNESS_POSTAMBLE
           
protected  float[] objectives
          The various fitnesses.
static java.lang.String P_MAXIMIZE
          Is higher better?
static java.lang.String P_MAXOBJECTIVES
          parameter for max fitness values
static java.lang.String P_MINOBJECTIVES
          parameter for min fitness values
static java.lang.String P_NUMOBJECTIVES
          parameter for size of objectives
 
Fields inherited from class ec.Fitness
FITNESS_PREAMBLE, P_FITNESS, trials
 
Constructor Summary
MultiObjectiveFitness()
           
 
Method Summary
 boolean betterThan(Fitness fitness)
          Returns true if I'm better than _fitness.
 java.lang.Object clone()
          Creates a new individual cloned from a prototype, and suitable to begin use in its own evolutionary context.
 Parameter defaultBase()
          Returns the default base for this prototype.
 boolean equivalentTo(Fitness _fitness)
          Returns true if I'm equivalent in fitness (neither better nor worse) to _fitness.
 float fitness()
          Returns the Max() of objectives, which adheres to Fitness.java's protocol for this method.
 java.lang.String fitnessToString()
          Print to a string the fitness in a fashion intended to be parsed in again via readFitness(...).
 java.lang.String fitnessToStringForHumans()
          Print to a string the fitness in a fashion readable by humans, and not intended to be parsed in again.
 java.lang.String[] getAuxilliaryFitnessNames()
          Returns auxilliary fitness value names to be printed by the statistics object.
 double[] getAuxilliaryFitnessValues()
          Returns auxilliary fitness values to be printed by the statistics object.
 int getNumObjectives()
           
 float getObjective(int i)
           
 float[] getObjectives()
          Returns the objectives as an array.
 boolean isIdealFitness()
          Returns true if this fitness is the "ideal" fitness.
 boolean isMaximizing()
           
 double manhattanObjectiveDistance(MultiObjectiveFitness other)
          Returns the Manhattan difference between two Fitnesses in Objective space.
 boolean paretoDominates(MultiObjectiveFitness other)
          Returns true if I'm better than _fitness.
static java.util.ArrayList partitionIntoParetoFront(Individual[] inds, java.util.ArrayList front, java.util.ArrayList nonFront)
          Divides an array of Individuals into the Pareto front and the "nonFront" (everyone else).
static java.util.ArrayList partitionIntoRanks(Individual[] inds)
          Divides inds into pareto front ranks (each an ArrayList), and returns them, in order, stored in an ArrayList.
 void readFitness(EvolutionState state, java.io.DataInput dataInput)
          Reads the binary form of an individual from a DataInput.
 void readFitness(EvolutionState state, java.io.LineNumberReader reader)
          Reads in the fitness from a form outputted by fitnessToString() and thus printFitnessForHumans(...).
 void setObjectives(EvolutionState state, float[] newObjectives)
           
 void setup(EvolutionState state, Parameter base)
          Sets up.
 double sumSquaredObjectiveDistance(MultiObjectiveFitness other)
          Returns the sum of the squared difference between two Fitnesses in Objective space.
 void writeFitness(EvolutionState state, java.io.DataOutput dataOutput)
          Writes the binary form of an individual out to a DataOutput.
 
Methods inherited from class ec.Fitness
compareTo, printFitness, printFitness, printFitness, printFitnessForHumans, printFitnessForHumans, setToMeanOf
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

MULTI_FITNESS_POSTAMBLE

public static final java.lang.String MULTI_FITNESS_POSTAMBLE
See Also:
Constant Field Values

FITNESS_POSTAMBLE

public static final java.lang.String FITNESS_POSTAMBLE
See Also:
Constant Field Values

P_NUMOBJECTIVES

public static final java.lang.String P_NUMOBJECTIVES
parameter for size of objectives

See Also:
Constant Field Values

P_MAXOBJECTIVES

public static final java.lang.String P_MAXOBJECTIVES
parameter for max fitness values

See Also:
Constant Field Values

P_MINOBJECTIVES

public static final java.lang.String P_MINOBJECTIVES
parameter for min fitness values

See Also:
Constant Field Values

P_MAXIMIZE

public static final java.lang.String P_MAXIMIZE
Is higher better?

See Also:
Constant Field Values

maxObjective

public float[] maxObjective
Desired maximum fitness values. By default these are 1.0. Shared.


minObjective

public float[] minObjective
Desired minimum fitness values. By default these are 0.0. Shared.


objectives

protected float[] objectives
The various fitnesses.


maximize

protected boolean maximize
Constructor Detail

MultiObjectiveFitness

public MultiObjectiveFitness()
Method Detail

getAuxilliaryFitnessNames

public java.lang.String[] getAuxilliaryFitnessNames()
Returns auxilliary fitness value names to be printed by the statistics object. By default, an empty array is returned, but various algorithms may override this to provide additional columns.


getAuxilliaryFitnessValues

public double[] getAuxilliaryFitnessValues()
Returns auxilliary fitness values to be printed by the statistics object. By default, an empty array is returned, but various algorithms may override this to provide additional columns.


isMaximizing

public boolean isMaximizing()

getNumObjectives

public int getNumObjectives()

getObjectives

public float[] getObjectives()
Returns the objectives as an array. Note that this is the *actual array*. Though you could set values in this array, you should NOT do this -- rather, set them using setObjectives().


getObjective

public float getObjective(int i)

setObjectives

public void setObjectives(EvolutionState state,
                          float[] newObjectives)

defaultBase

public Parameter defaultBase()
Description copied from interface: Prototype
Returns the default base for this prototype. This should generally be implemented by building off of the static base() method on the DefaultsForm object for the prototype's package. This should be callable during setup(...).


clone

public java.lang.Object clone()
Description copied from interface: Prototype
Creates a new individual cloned from a prototype, and suitable to begin use in its own evolutionary context.

Typically this should be a full "deep" clone. However, you may share certain elements with other objects rather than clone hem, depending on the situation:

Implementations.

Specified by:
clone in interface Prototype
Overrides:
clone in class Fitness

fitness

public float fitness()
Returns the Max() of objectives, which adheres to Fitness.java's protocol for this method. Though you should not rely on a selection or statistics method which requires this.

Specified by:
fitness in class Fitness

setup

public void setup(EvolutionState state,
                  Parameter base)
Sets up. This must be called at least once in the prototype before instantiating any fitnesses that will actually be used in evolution.

Specified by:
setup in interface Prototype
Specified by:
setup in interface Setup
Overrides:
setup in class Fitness

isIdealFitness

public boolean isIdealFitness()
Returns true if this fitness is the "ideal" fitness. Default always returns false. You may want to override this.

Specified by:
isIdealFitness in class Fitness

equivalentTo

public boolean equivalentTo(Fitness _fitness)
Returns true if I'm equivalent in fitness (neither better nor worse) to _fitness. The rule I'm using is this: If one of us is better in one or more criteria, and we are equal in the others, then equivalentTo is false. If each of us is better in one or more criteria each, or we are equal in all criteria, then equivalentTo is true. Multiobjective optimization algorithms may choose to override this to do something else.

Specified by:
equivalentTo in class Fitness

betterThan

public boolean betterThan(Fitness fitness)
Returns true if I'm better than _fitness. The DEFAULT rule I'm using is this: if I am better in one or more criteria, and we are equal in the others, then betterThan is true, else it is false. Multiobjective optimization algorithms may choose to override this to do something else.

Specified by:
betterThan in class Fitness

paretoDominates

public boolean paretoDominates(MultiObjectiveFitness other)
Returns true if I'm better than _fitness. The rule I'm using is this: if I am better in one or more criteria, and we are equal in the others, then betterThan is true, else it is false.


partitionIntoParetoFront

public static java.util.ArrayList partitionIntoParetoFront(Individual[] inds,
                                                           java.util.ArrayList front,
                                                           java.util.ArrayList nonFront)
Divides an array of Individuals into the Pareto front and the "nonFront" (everyone else). The Pareto front is returned. You may provide ArrayLists for the front and a nonFront. If you provide null for the front, an ArrayList will be created for you. If you provide null for the nonFront, non-front individuals will not be added to it. This algorithm is O(n^2).


partitionIntoRanks

public static java.util.ArrayList partitionIntoRanks(Individual[] inds)
Divides inds into pareto front ranks (each an ArrayList), and returns them, in order, stored in an ArrayList.


sumSquaredObjectiveDistance

public double sumSquaredObjectiveDistance(MultiObjectiveFitness other)
Returns the sum of the squared difference between two Fitnesses in Objective space.


manhattanObjectiveDistance

public double manhattanObjectiveDistance(MultiObjectiveFitness other)
Returns the Manhattan difference between two Fitnesses in Objective space.


fitnessToString

public java.lang.String fitnessToString()
Description copied from class: Fitness
Print to a string the fitness in a fashion intended to be parsed in again via readFitness(...). The fitness and evaluated flag should not be included. The default form simply calls toString(), which is almost certainly wrong, and you'll probably want to override this to something else.

Overrides:
fitnessToString in class Fitness

fitnessToStringForHumans

public java.lang.String fitnessToStringForHumans()
Description copied from class: Fitness
Print to a string the fitness in a fashion readable by humans, and not intended to be parsed in again. The default form simply calls toString(), but you'll probably want to override this to something else.

Overrides:
fitnessToStringForHumans in class Fitness

readFitness

public void readFitness(EvolutionState state,
                        java.io.LineNumberReader reader)
                 throws java.io.IOException
Description copied from class: Fitness
Reads in the fitness from a form outputted by fitnessToString() and thus printFitnessForHumans(...). The default version of this method exits the program with an "unimplemented" error.

Overrides:
readFitness in class Fitness
Throws:
java.io.IOException

writeFitness

public void writeFitness(EvolutionState state,
                         java.io.DataOutput dataOutput)
                  throws java.io.IOException
Description copied from class: Fitness
Writes the binary form of an individual out to a DataOutput. This is not for serialization: the object should only write out the data relevant to the object sufficient to rebuild it from a DataInput. The default version exits the program with an "unimplemented" error; you should override this.

Overrides:
writeFitness in class Fitness
Throws:
java.io.IOException

readFitness

public void readFitness(EvolutionState state,
                        java.io.DataInput dataInput)
                 throws java.io.IOException
Description copied from class: Fitness
Reads the binary form of an individual from a DataInput. This is not for serialization: the object should only read in the data written out via printIndividual(state,dataInput). The default version exits the program with an "unimplemented" error; you should override this.

Overrides:
readFitness in class Fitness
Throws:
java.io.IOException