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)


ABSTRACT 

The Strength Pareto Evolutionary Algorithm (SPEA) (Zitzler and Thiele
1999) is a relatively recent technique for finding or approximating the
Pareto-optimal set for multiobjective optimization problems. In
different studies (Zitzler and Thiele 1999; Zitzler, Deb, and Thiele
2000) SPEA has shown very good performance in comparison to other
multiobjective evolutionary algorithms, and therefore it has been a
point of reference in various recent investigations, e.g., (Corne,
Knowles, and Oates 2000). Furthermore, it has been used in different
applications, e.g., (La-hanas, Milickovic, Baltas, and Zamboglou 2001).
In this paper, an improved ver-sion, namely SPEA2, is proposed, which
incorporates in contrast to its predecessor a fine-grained fitness
assignment strategy, a density estimation technique, and an enhanced
archive truncation method. The comparison of SPEA2 with SPEA and two
other modern elitist methods, PESA and NSGA-II, on different test
problems yields promising results.

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.  This computation is performed by a revised SimpleEvaluator subclass:

	ec.multiobjective.spea2.SPEA2Evaluator

New children are then bred and an archive is formed by loading the pareto
front, trimmed by sparsity plus various other "highly fit" children (if there
is space).  The breeding procedure is 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

When SPEA2 needs to do breeding, it does so solely from the archive, not from
the full population.  This means that the selection operator 
(TournamentSelection, which SPEA uses) needs to be modified to only 
consider the archive when selecting an individual.  Our modified version is:

	ec.multiobjecive.spea2.SPEA2TournamentSelection


SPEA2 and NSGA-II have different approaches to building archives which 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).


