Shuffled Complex Evolution (SCE) optimisation. Designed to have a similar
interface to the standard optim function.
SCEoptim(FUN, par, ..., lower = -Inf, upper = Inf, control = list())function to optimise (to minimise by default), or the name of one. This should return a scalar numeric value.
a numeric vector of initial parameter values.
further arguments passed to FUN.
lower and upper bounds on the parameters. Should be the
same length as par, or length 1 if a bound applies to all parameters.
a list of options as in optim(), see Details.
a list of class "SCEoptim".
optimal parameter set.
value of objective function at optimal point.
code, where 0 indicates successful covergence.
(non-)convergence message.
number of function evaluations.
number of iterations of the CCE algorithm.
number of seconds taken.
objective function values from each iteration in a matrix.
best parameter set from each iteration in a matrix.
if (control$returnpop = TRUE), the parameter sets
from each iteration are returned in a three dimensional array.
the list of options settings in effect.
This is an evolutionary algorithm combined with a simplex algorithm.
Options can be given in the list control, in the same way as with
optim:
number of complexes. Defaults to
5.
number of iteration in inner loop (CCE
algorithm). Defaults to NA, in which case it is taken as 2 *
NDIM + 1, as recommended by Duan et al (1994).
function scaling factor (set to -1 for a maximisation problem). By default it is a minimisation problem.
influences sampling
of parents from each complex. Duan et al (1992) describe a 'trapezoidal'
(i.e. linear weighting) scheme, which corresponds to elitism = 1.
Higher values give more weight towards the better parameter sets. Defaults
to 1.
sampling scheme for initial
values: "latin" (hypercube) or "random". Defaults to "latin".
reltol is the convergence threshold: relative
improvement factor required in an SCE iteration (in same sense as
optim), and defaults to 1e-5.
tolsteps is the number of iterations where the improvement is within
reltol required to confirm convergence. This defaults to 7.
reltol is the convergence threshold: relative improvement
factor required in an SCE iteration (in same sense as optim), and
defaults to 1e-5.
tolsteps is the number of iterations where the improvement is within
reltol required to confirm convergence. This defaults to 7.
reltol is the convergence threshold:
relative improvement factor required in an SCE iteration (in same sense as
optim), and defaults to 1e-5.
tolsteps is the number of iterations where the improvement is within
reltol required to confirm convergence. This defaults to 7.
maximum number of iterations. Defaults to
10000.
maximum number of function
evaluations. Defaults to Inf.
maximum
duration of optimization in seconds. Defaults to Inf.
whether to return populations (parameter sets)
from all iterations. Defaults to FALSE.
an
integer specifying the level of user feedback. Defaults to 0.
number of iterations between reports when trace >= 1.
Defaults to 1.
Qingyun Duan, Soroosh Sorooshian and Vijai Gupta (1992). Effective and Efficient Global Optimization for Conceptual Rainfall-Runoff Models, Water Resources Research 28(4), pp. 1015-1031.
Qingyun Duan, Soroosh Sorooshian and Vijai Gupta (1994). Optimal use of the SCE-UA global optimization method for calibrating watershed models, Journal of Hydrology 158, pp. 265-284.
optim, DEoptim package, rgenoud package
## reproduced from help("optim")
## 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
ans <- SCEoptim(Rosenbrock, c(-1.2, 1), control = list(trace = 1))
#> Nr Iter Nr Fun Eval Current best function Current worst function
#> 1 76 12.7189 5.90572e+06
#> 2 130 0.0790716 91938.6
#> 3 180 0.0790716 11519.4
#> 4 238 0.0790716 7756.29
#> 5 299 0.0790716 4938.58
#> 6 357 0.0383434 583.981
#> 7 411 0.0202285 459.469
#> 8 463 0.00640054 72.8587
#> 9 512 0.000512332 13.8056
#> 10 567 0.000512332 6.78692
#> 11 618 0.000289162 0.359706
#> 12 671 2.64181e-05 0.359706
#> 13 720 1.22006e-05 0.0497167
#> 14 768 9.39611e-06 0.0497167
#> 15 821 2.92256e-06 0.0398932
#> 16 874 1.08368e-06 0.00634343
#> 17 928 7.97997e-07 0.00231506
#> 18 984 3.93934e-07 0.00231506
#> 19 1040 1.60248e-08 0.00231506
#> 20 1091 1.21385e-08 0.000466116
#> 21 1144 7.68396e-10 0.000466116
#> 22 1197 4.94091e-10 3.03208e-05
#> 23 1244 2.25976e-10 3.03208e-05
#> 24 1296 2.25976e-10 1.7887e-06
#> 25 1352 5.63513e-11 1.7887e-06
#> 26 1404 5.26145e-12 1.7887e-06
#> 27 1456 3.45141e-12 4.32406e-07
#> 28 1505 3.45141e-12 4.32406e-07
#> 29 1555 7.13553e-13 1.09271e-07
#> 30 1606 4.89783e-13 1.09271e-07
#> 31 1658 9.58268e-14 2.69055e-08
#> Change in solution over [tolsteps] less than specified tolerance (reltol).
str(ans)
#> List of 11
#> $ call : language SCEoptim(FUN = Rosenbrock, par = c(-1.2, 1), control = list(trace = 1))
#> $ control :List of 13
#> ..$ ncomplex : num 5
#> ..$ cce.iter : logi NA
#> ..$ fnscale : num 1
#> ..$ elitism : num 1
#> ..$ initsample: chr "latin"
#> ..$ reltol : num 1e-05
#> ..$ tolsteps : num 7
#> ..$ maxit : num 10000
#> ..$ maxeval : num Inf
#> ..$ maxtime : num Inf
#> ..$ returnpop : logi FALSE
#> ..$ trace : num 1
#> ..$ REPORT : num 1
#> $ par : num [1:2] 1 1
#> $ value : num 9.58e-14
#> $ convergence: num 0
#> $ message : chr "Change in solution over [tolsteps] less than specified tolerance (reltol)."
#> $ counts : num 1658
#> $ iterations : num 31
#> $ time : num 0.224
#> $ POP.FIT.ALL: num [1:31, 1:25] 12.7189 0.0791 0.0791 0.0791 0.0791 ...
#> $ BESTMEM.ALL: num [1:31, 1:2] -2.56 1.06 1.06 1.06 1.06 ...
#> - attr(*, "class")= chr [1:2] "SCEoptim" "list"
## '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
}
ans <- SCEoptim(Wild, 0,
lower = -50, upper = 50,
control = list(trace = 1)
)
#> Nr Iter Nr Fun Eval Current best function Current worst function
#> 1 60 70.2357 159.001
#> 2 104 67.7087 137.391
#> 3 154 67.7087 137.391
#> 4 196 67.7087 85.5385
#> 5 242 67.7087 85.5385
#> 6 288 67.5218 86.4444
#> 7 336 67.5218 87.4622
#> 8 374 67.5218 87.271
#> 9 422 67.5218 87.3583
#> 10 462 67.5218 86.3995
#> 11 502 67.5218 84.989
#> 12 542 67.4761 87.3014
#> 13 588 67.4761 87.4661
#> 14 628 67.4761 87.4661
#> 15 662 67.4761 87.244
#> 16 708 67.4761 87.4532
#> 17 742 67.4761 87.1166
#> 18 786 67.4761 87.1166
#> Change in solution over [tolsteps] less than specified tolerance (reltol).
ans$par
#> [1] -15.66244