Use a stopping condition

Stopping conditions allow a EA to terminate before the maximum number of iterations (generations) have been completed. Using one can save a significant amount of computational resources, and they can be based on any manner of things, such as:

  • The average fitness of a generation hasn’t improved in a number of generations.
  • The variation between individuals in the population is reasonably low.
  • When a best-case solution has been found.

We can include a stopping condition by redefining the edo.DataOptimiser.stop() method in a subclass to update the converged parameter:

>>> import edo
>>> import numpy as np
>>>
>>> class MyOptimiser(edo.DataOptimiser):
...     def stop(self, tolerance):
...         """
...         Stop if the population fitness variance is less than
...         ``tolerance``.
...         """
...         fitness_variance = np.var(self.pop_fitness)
...         self.converged = fitness_variance < tolerance

To see this in action, consider the example from the first tutorial:

>>> from edo.distributions import Uniform
>>>
>>> Uniform.param_limits["bounds"] = [-1, 1]
>>> families = [edo.Family(Uniform)]
>>>
>>> def xsquared(ind):
...     return ind.dataframe.iloc[0, 0] ** 2
>>>
>>> opt = MyOptimiser(xsquared, 100, [1, 1], [1, 1], families, max_iter=5)

Now we can run the algorithm as normal, and with an appropriate value of tolerance, it will stop before the maximum number of iterations:

>>> _ = opt.run(random_state=0, stop_kwargs={"tolerance": 1e-6})
>>> opt.generation
4