This package contains is an implementation of the Strength Pareto 
Evolutionary Algorithm 2 (SPEA2).

Details of this approach can be found in the following paper:

E. Zitzler, M. Laumanns, and L. Thiele.SPEA2: Improving the Performance
of the Strength Pareto Evolutionary Algorithm. Technical Report 103,
Computer Engineering and Communication Networks Lab (TIK), Swiss Federal
Institute of Technology (ETH) Zurich, Gloriastrasse 35, CH-8092 Zurich,
May 2001. 

ftp://ftp.tik.ee.ethz.ch/pub/people/zitzler/ZLT2001a.ps (Postscript),
ftp://ftp.tik.ee.ethz.ch/pub/people/zitzler/ZLT2001a.pdf (PDF)

This package has a significant history.  The early versions of the
package were donated by Robert Hubley at the Institute for Systems
Biology.  Major later modifications were made by Sean Luke, Gabriel Balan,
and Keith Sullivan.  Then the SPEA2 package was almost entirely rewritten
in 2010 by Faisal Abidi and Sean Luke.


EXAMPLES
--------

The ec.app.moosuite package contains test cases against which to test SPEA2.


How ECJ implements SPEA2
------------------------

SPEA2 is an elitist archive method which in some sense extends mu+lambda. 
That is, SPEA2 maintains a pool (the "archive") of some N high quality
individuals which more or less holds the present known pareto front of
the population.  That archive is carried over from generation to generation.

SPEA2 has an elaborate fitness setting procedure which involves the 
computation of several measures of domination (known as "strength") and
sparsity.  New children are bred and an archive is formed by loading the pareto
front, trimmed by sparsity plus various other "highly fit" children (if there
is space). Both the fitness setting and breeding procedures are handled by a
revised version of SimpleBreeder:

	ec.multiobjective.spea2.SPEA2Breeder

Because it uses auxiliary fitness measures to perform breeding, SPEA2 requires
a subclass of MultiObjectiveFitness which stores these auxiliary measures:

	ec.multiobjective.spea2.SPEA2MultiObjectiveFitness

SPEA2 and NSGA-II have different approaches to building archives. This impacts
on how you need to set your population sizes in order to achieve the same number
of evaluations.  In ECJ, NSGA-II does not include the archive as part of the basic
population size.  Rather, it builds the archive separately, then builds the
population by breeding from the archive, then gloms the two together.  On the
other hand, SPEA2 uses a (tunable) portion of its population as the archive, and
breeds individuals into the remainder of the population.  This means that to have
a "population size" for SPEA2 that's the same as NSGA-II, you need to increase
SPEA2's population size to NSGA-II's population size plus SPEA2's archive (elites)
size.  For example, if you have an NSGA-II population size of 100, and SPEA2 is using
an archive size of 50, to be fair you should make SPEA2's population size be 150.

If you set things so that SPEA2 and NSGA-II must reevaluate the fitness of 
their archives (which is rare), things are different.  Now you should set SPEA2
so that its archive size and population size is equal to twice NSGA-II's population
size (because NSGA-II's archive size is the size of its population).


SPEA2 assumes that you will be using it in conjunction with TournamentSelection
as your selection operator. You can use whatever selection operator you like but it
won't be canonical.


