.. _method-moga-convergence_type-metric_tracker:

""""""""""""""
metric_tracker
""""""""""""""


Track changes in the non-dominated frontier


.. toctree::
   :hidden:
   :maxdepth: 1



**Specification**

- *Alias:* None

- *Arguments:* None

- *Default:* metric_tracker


**Description**


The moga converger ( ``metric_tracker``) operates by tracking various
changes in the non-dominated frontier from generation to
generation. When the changes occurring over a user specified number of
generations fall below a user specified threshold, the algorithm
stops.

If ``metric_tracker`` is specified, then a ``percent_change`` and
``num_generations`` must be supplied as well.  These are listed as
optional keywords in the input spec.



**Theory**


The ``metric_tracker`` converger tracks 3 metrics specific to the
non-dominated frontier from generation to generation. All 3 of these
metrics are computed as percent changes between the generations. In
order to compute these metrics, the converger stores a duplicate of
the non-dominated frontier at each generation for comparison to the
non-dominated frontier of the next generation.

The first metric is one that indicates how the expanse of the frontier
is changing. The expanse along a given objective is defined by the
range of values existing within the non-dominated set. The expansion
metric is computed by tracking the extremes of the non-dominated
frontier from one generation to the next. Any movement of the extreme
values is noticed and the maximum percentage movement is computed as:

.. code-block::

    range(j, i-1)) j=1,nof \endverbatim where Em is the max expansion
    metric, j is the objective function index, i is the current generation
    number, and nof is the total number of objectives. The range is the
    difference between the largest value along an objective and the
    smallest when considering only non-dominated designs.
    
    The second metric monitors changes in the density of the non-dominated
    set. The density metric is computed as the number of non-dominated
    points divided by the hypervolume of the non-dominated region of
    space. Therefore, changes in the density can be caused by changes in
    the number of non-dominated points or by changes in size of the
    non-dominated space or both. The size of the non-dominated space is
    computed as:

.. code-block::

      Vps(i) = product over j of range(j, i)  j=1,nof

where Vps(i) is the hypervolume of the non-dominated space at
generation i and all other terms have the same meanings as above.

The density of the a given non-dominated space is then:

.. code-block::

      Dps(i) = Pct(i) / Vps(i)

where Pct(i) is the number of points on the non-dominated frontier at
generation i.

The percentage increase in density of the frontier is then calculated as

.. code-block::

      Cd = abs((Dps(i) - Dps(i-1)) / Dps(i-1))

where Cd is the change in density metric.

The final metric is one that monitors the "goodness" of the
non-dominated frontier. This metric is computed by considering each
design in the previous population and determining if it is dominated
by any designs in the current population. All that are determined to
be dominated are counted.  The metric is the ratio of the number that
are dominated to the total number that exist in the previous
population.

As mentioned above, each of these metrics is a percentage. The tracker
records the largest of these three at each generation. Once the
recorded percentage is below the supplied percent change for the
supplied number of generations consecutively, the algorithm is
converged.


