Development
If you are contributing a new algorithm to this package, you need to know an internal API which allows to add a new algorithm without considerable changes to overall structure of the package.
Adding an algorithm
If you're contributing a new algorithm, you shouldn't need to touch any of the code in src/api/optimize.jl. You should rather add a file named (solver is the name of the solver) algo.jl
in src, and make sure that you define an optimizer parameters and state types, initial_population
that initializes a population of individual
objects, a state type that holds all variables that are (re)used throughout the iterative procedure, an initial_state
that initializes such a state, and an update_state!
method that does the actual work.
Algorithm
Every optimization algorithm have to implement an algorithm parameters type derived from AbstractOptimizer
type, e.g. struct Algo <: AbstractOptimizer end
, with appropriate fields, a default constructor with a keyword for each field.
Function initial_state
returns an initial state for the algorithm, see State section. Function update_state!
returns a Bool
value. If the state update is successfully completed then the function returns false
, otherwise true
.
Evolutionary.AbstractOptimizer
— TypeAbstract evolutionary optimizer algorithm
Evolutionary.initial_state
— FunctionInitialization of ES algorithm state
Initialization of CMA-ES algorithm state
Initialization of GA algorithm state
State
Every optimization algorithm have to implement a state type derived from AbstractOptimizerState
type, e.g. struct AlgoState <: AbstractOptimizerState end
. All derived types should implement value
and minimizer
functions
Evolutionary.AbstractOptimizerState
— TypeAbstract type for defining an optimizer state
Every algorithm have to implement a state type derived from this abstract type.
NLSolversBase.value
— Methodvalue(state)
Returns a minimum value of the current state
.
Evolutionary.minimizer
— Methodvalue(state)
Returns a minimizer object in the current state
.
Evolutionary.terminate
— Methodterminate(state)
Returns true
if the state
requires early termination.
Population
The evolutionary algorithms require a collection of individuals, population, which the algorithm constantly modifies. The population collection type must be derived from the AbstractVector
type. Function initial_population
is used for implementing a strategy of population collection initialization.
The initial_population
must accept two parameters:
method
, an algorithm object derived fromAbstractOptimizer
typeindividual
, a description of an individual template used to create the population
Following population initialization strategies are available:
Evolutionary.initial_population
— Methodinitial_population(method, individual::AbstractVector)
Initialize population by replicating the inividual
vector.
Evolutionary.initial_population
— Methodinitial_population(method, individual::Function)
Initialize population from the inividual
function which returns an individual object.
Evolutionary.initial_population
— Methodinitial_population(method, individuals::AbstractMatrix)
Initialize population from the inividuals
matrix where each individual is a column.