Different termination criteria can be used to determin how long an alorithm shoud run until the result is returned. In pymoo different ways to set the termination criteria are provided.
Commonly used criteria can be set by using tupels e.g.
An existing class inheriting from
Terminationcan be passed
A custom class can be created and used to determine the termination
In the following each of these possible termination criterium is shown in an example. Please note, that some of them are only applicable for test problems where the optimal solution(s) is/are known.
# import the necessary classes and functions from pymoo.optimize import minimize from pymop.factory import get_problem from pymoo.factory import get_algorithm from pymoo.model.termination import MaximumGenerationTermination, Termination # create a test problem for the purpose of demonstration problem = get_problem("zdt1") pf = problem.pareto_front()
Number of Generations¶
First, the number of generations can be used to stop the executation of an algorithm. For any kind of evolutionary algorithm each iteration is called generation.
res = minimize(problem, method=get_algorithm('nsga2', pop_size=20), termination=('n_gen', 5) )
Number of Function Evaluations¶
Also, the number of function evaluations can be used. Please note that for some algorithms slightly more evaluations will be executed.
res = minimize(problem, method=get_algorithm('nsga2', pop_size=20), termination=('n_eval', 80) )
Furthermore, the performance indicator can be used to determine whether the algorithm should continue the run or not.
from pymoo.factory import get_termination res = minimize(problem, method=get_algorithm('nsga2', pop_size=20), termination=get_termination('igd', 0.1, pf = problem.pareto_front()), pf=pf )
Other method to define the Termination Criterium¶
Moreover, instead of passing the convenience tuple which is loads internally a class implementation of the corresponding termination criterium, the class object can be passed directly.
res = minimize(problem, method=get_algorithm('nsga2', pop_size=20), termination=MaximumGenerationTermination(25), )
Custom Termination Criterium¶
Therefore, instead of using a already written termination criterium, you can define a termination class by yourself and pass it to the algorithm. Here the class called
MyTermination is defined by inherting from the
# the customized termination criterium class MyTermination(Termination): def __init__(self, perc_improvement) -> None: super().__init__() self.perc_improvement = perc_improvement def _do_continue(self, algorithm): import numpy as np return np.random.random() > self.perc_improvement res = minimize(problem, method=get_algorithm('nsga2', pop_size=20), termination=MyTermination(0.01), )