Tutorial
After reading this tutorial you'll become an expert using Metaheuristics
module.
Minimization Problem
Assume you want to optimize the following minimization problem:
Minimize:
\[f(x) = 10D + \sum_{i=1}^D x_i^2 - 10cos(2\pi x_i)\]
where $x\in [-5, 5]^D$, that is, each coordinate in $x$ is between -5 and 5. Use $D=10$.
Note that the global optimum is obtained when $x_i = 0$ for all $i$. Thus, $\min f(x) = 0$.
Objective function:
f(x) = 10length(x) + sum( x.^2 - 10cos.(2pi*x) )
Bounds:
bounds = [-5ones(10) 5ones(10)]'
Providing Information
Since the optimum is known, then we can provide this information to the optimizer.
information = Information(f_optimum = 0.0)
Common Settings
Usually users could require to limit the number of generation/iteration or the number of function evaluations. To do that, let's assume that the metaheuristic should evaluate at most $9000D$ times the objective function. Moreover, since information
is provided, then we can set the desired accuracy ($|f(x) - f(x^*)| $) to $10^{-5}$.
options = Options(f_calls_limit = 9000*10, f_tol = 1e-5)
Choose a Metaheuristic
Metaheuristics.jl
provides different metaheuristics for optimization such as Evolutionary Centers Algorithm (ECA), Differential Evolution (DE), Particle Swarm Optimization (PSO), etc. In this tutorial we will use ECA
, but you can use another algorithm following but the same steps.
The metaheuristics accept its parameters but share two common and optional settings information
and options
.
algorithm = ECA(information = information, options = options)
Optimize
Now, we are able to approximate the optimum. To do that is necessary to use the optimize
function as follows:
result = optimize(f, bounds, algorithm)
Get the Results
Once optimize
stopped, then we can get the approximate solutions.
Approximated minimum:
fx = minimum(result)
Approximated minimizer:
x = minimizer(result)
Get Information about the Resulting Population
Sometimes is useful to analyze the resulting population (for population-based metaheuristics). To do that you can use fvals
to get objective function evaluation and positions
to get their positions.
Bonus
We recommend you to save your program in a function for performance purposes:
using Metaheuristics
function main()
# objective function
f(x) = 10length(x) + sum( x.^2 - 10cos.(2π*x) )
# limits/bounds
bounds = [-5ones(10) 5ones(10)]'
# information on the minimization problem
information = Information(f_optimum = 0.0)
# generic settings
options = Options(f_calls_limit = 9000*10, f_tol = 1e-5)
# metaheuristic used to optimize
algorithm = ECA(information = information, options = options)
# start the minimization proccess
result = optimize(f, bounds, algorithm)
fx = minimum(result)
x = minimizer(result)
@show fx
@show x
end
Summary
Now you are able to approximate global optimum solutions using Metaheuristics.