DEoptim {DEoptim}R Documentation

Differential Evolution Optimization

Description

Performs evolutionary optimization via the Differential Evolution algorithm.

Usage

DEoptim(fn, lower, upper, control = DEoptim.control(), ...)

Arguments

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.

Details

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.

Value

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.

Note

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").

Author(s)

David Ardia david.ardia@unifr.ch and Katharine Mullen katharine.mullen@nist.gov.

References

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.

See Also

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.

Examples

  ## 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))

[Package DEoptim version 2.0-1 Index]