DEoptim {DEoptim} | R Documentation |
Performs evolutionary optimization via the Differential Evolution algorithm.
DEoptim(fn, lower, upper, control = DEoptim.control(), ...)
fn |
A function to be minimized, with first argument the vector
of parameters over which minimization is to take place. It should
return a scalar result. NA and NaN values are not
allowed. |
lower, upper |
Bounds on the variables. |
control |
A list of control parameters;
see DEoptim.control . |
... |
Further arguments to be passed to fn . |
DEoptim
performs minimization of fn
. Note that
fn
must be minimized with respect to 20 or fewer parameters;
this is a limitation of the implementation and may
be eliminated in the future at the request of users.
The control
argument is a list; see the help file for
DEoptim.control
for details.
A list of lists of the class DEoptim
.
list optim
contains the followings:
bestmem
: the best set of parameters found.
bestval
: the value of fn
corresponding to bestmem
.
nfeval
: number of function evaluations.
iter
: number of procedure iterations.
list member
contains the followings:
lower
: the lower boundary.
upper
: the upper boundary.
bestvalit
: the best value of fn
at each iteration.
bestmemit
: the best member at each iteration.
pop
: the population generated at the last iteration.
storepop
: a list containing the intermediate populations.
DEoptim
calls C code similar to the MS Visual C++ v5.0
implementation of the Differential Evolution algorithm distributed
with the book Differential Evolution – A Practical Approach to
Global Optimization by Price, K.V., Storn, R.M., Lampinen J.A,
Springer-Verlag, 2005, and found on-line at
http://www.icsi.berkeley.edu/~storn/DeWin.zip.
If you experience misconvergence in the optimization process you usually
have to increase the value for NP
, but often you only have to adjust
F
to be a little lower or higher than 0.8
. If you increase
NP
and simultaneously lower F
a little, convergence is more
likely to occur but generally takes longer, i.e. DEoptim
is getting
more robust (there is always a convergence speed/robustness tradeoff).
DEoptim
is much more sensitive to the choice of F
than it is to
the choice of CR
. CR
is more like a fine tuning element. High
values of CR
like CR=1
give faster convergence if convergence
occurs. Sometimes, however, you have to go down as much as CR=0
to
make DEoptim
robust enough for a particular problem.
To perform a maximization (instead of minimization) of a given
function, simply define a new function which is the opposite of the
function to maximize and apply DEoptim
to it.
To integrate additional constraints on the parameters x
of
fn(x)
, for instance x[1] + x[2]^2 < 2
, integrate the
constraint within the function to optimize, for instance:
fn <- function(x){ if (x[1] + x[2]^2 < 2){ r <- Inf else{ ... } return(r) }
Note that DEoptim
stops if any NA
or NaN
value is
obtained. You have to redefine your function to handle these values
(for instance, set NA
to Inf
in your objective function).
You can reproduce your results by setting the seed of the random number
generator, e.g. set.seed(1234)
.
Please cite the package in publications. Use citation("DEoptim")
.
David Ardia david.ardia@unifr.ch and Katharine Mullen katharine.mullen@nist.gov.
Differential Evolution homepage: http://www.icsi.berkeley.edu/~storn/code.html
Price, K.V., Storn, R.M., Lampinen J.A. (2005). Differential Evolution - A Practical Approach to Global Optimization. Springer-Verlag. ISBN 3540209506.
DEoptim.control
for control arguments,
DEoptim-methods
for methods on DEoptim
objects,
including some examples in plotting the results;
optim
or constrOptim
for alternative optimization algorithms.
## Rosenbrock Banana function Rosenbrock <- function(x){ x1 <- x[1] x2 <- x[2] 100 * (x2 - x1 * x1)^2 + (1 - x1)^2 } lower <- c(-10,-10) upper <- -lower set.seed(1234) DEoptim(Rosenbrock, lower, upper) DEoptim(Rosenbrock, lower, upper, DEoptim.control(NP = 100)) outDEoptim <- DEoptim(Rosenbrock, lower, upper, DEoptim.control(NP = 80, itermax = 400, F = 1.2, CR = 0.7)) plot(outDEoptim) ## 'Wild' function, global minimum at about -15.81515 Wild <- function(x) 10 * sin(0.3 * x) * sin(1.3 * x^2) + 0.00001 * x^4 + 0.2 * x + 80 plot(Wild, -50, 50, n = 1000, main = "'Wild function'") outDEoptim <- DEoptim(Wild, lower = -50, upper = 50, control = DEoptim.control(trace = FALSE)) plot(outDEoptim) DEoptim(Wild, lower = -50, upper = 50, control = DEoptim.control(NP = 50))