e05jb {NAGFWrappers} | R Documentation |
e05jb is designed to find the global minimum or maximum of an arbitrary function, subject to simple bound-constraints using a multi-level coordinate search method. Derivatives are not required, but convergence is only guaranteed if the objective function is continuous in a neighbourhood of a global optimum. It is not intended for large problems.
The initialization function e05ja must have been called before calling e05jb.
e05jb(objfun, ibound, iinit, bl, bu, list, numpts, initpt, monit, optlist, n = nrow(bl), sdlist = ncol(list))
objfun |
function objfun must evaluate the objective function F(x) for a specified n-vector x.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||
ibound |
integer Indicates whether the facility for dealing with bounds of special forms is to be used. ibound must be set to one of the following values. ibound=0: You will supply \ell and u individually. ibound=1: There are no bounds on x. ibound=2: There are semi-infinite bounds 0 <= x. ibound=3: There are constant bounds \ell = \ell_1 and u = u_1. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
iinit |
integer Selects which initialization method to use. iinit=0: Simple initialization (boundary and midpoint), with numpts[i] = 3, initpt[i] = 2 and list[i, j] = (bl[i](bl[i] + bu[i]) / 2bu[i]), for i = 1 , 2 , . . . , n and j = 1 , 2 , 3. iinit=1: Simple initialization (off-boundary and midpoint), with numpts[i] = 3, initpt[i] = 2 and list[i, j] = ((5bl[i] + bu[i]) / 6(bl[i] + bu[i]) / 2(bl[i] + 5bu[i]) / 6), for i = 1 , 2 , . . . , n and j = 1 , 2 , 3. iinit=2: Initialization using linesearches. iinit=3: You are providing your own initialization list. iinit=4: Generate a random initialization list. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
bl |
double array | ||||||||||||||||||||||||||||||||||||||||||||||||||||
bu |
double array blis \ell, the array of lower bounds. bu is u, the array of upper bounds. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
list |
double array This argument need not be set on entry if you wish to use one of the preset initialization methods (iinit != 3). | ||||||||||||||||||||||||||||||||||||||||||||||||||||
numpts |
integer array This argument need not be set on entry if you wish to use one of the preset initialization methods (iinit != 3). | ||||||||||||||||||||||||||||||||||||||||||||||||||||
initpt |
integer array This argument need not be set on entry if you wish to use one of the preset initialization methods (iinit != 3). | ||||||||||||||||||||||||||||||||||||||||||||||||||||
monit |
function monit may be used to monitor the optimization process. It is invoked upon every successful completion of the procedure in which a sub-box is considered for splitting. It will also be called just before e05jb exits if that splitting procedure was not successful.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||
optlist |
options list Optional parameters may be listed, as shown in the following table:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||
n |
integer: default = nrow(bl) n, the number of variables. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
sdlist |
integer: default = ncol(list) . sdlist is, at least, the maximum over i of the number of points in coordinate i at which to split according to the initialization list list; that is, sdlist >= max_inumpts[i]. |
R interface to the NAG Fortran routine E05JBF.
BL |
double array |
BU |
double array Unless ifail =1, ifail =2 on exit, bl and bu are the actual arrays of bounds used by e05jb. |
LIST |
double array Unless ifail =1, ifail =2, ifail =-999 on exit, the actual initialization data used by e05jb. If you wish to monitor the contents of list you are advised to do so solely through monit, not through the output value here. |
NUMPTS |
integer array Unless ifail =1, ifail =2, ifail =-999 on exit, the actual initialization data used by e05jb. |
INITPT |
integer array Unless ifail =1, ifail =2, ifail =-999 on exit, the actual initialization data used by e05jb. |
X |
double array If ifail =0, contains an estimate of the global optimum (see also the Accuracy section in the Fortran library documentation). |
OBJ |
double If ifail =0, contains the function value at x. |
IFAIL |
integer ifail =0unless the function detects an error or a warning has been flagged (see the Errors section in Fortran library documentation). |
NAG
http://www.nag.co.uk/numeric/FL/nagdoc_fl23/pdf/E05/e05jbf.pdf
optlist <- list() ifail <- 0 peaks <- function(x1, x2) { f = 3 * (1 - x1)^2 * exp(-(x1^2) - (x2 + 1)^2) - 10 * (x1/5 - x1^3 - x2^5) * exp(-x1^2 - x2^2) - 1/3 * exp(-(x1 + 1)^2 - x2^2) } objective = function(n, x, nstate) { print(x[1]) print(x[2]) if (n == 2) { inform <- 0 } else { inform <- -1 } if (inform >= 0) { if (nstate == 1) { writeLines(toString(cat(sprintf("\n", "\n")))) writeLines(toString(cat(sprintf("OBJFUN was just called for the first time", "\n")))) } f <- peaks(x[1], x[2]) } list(F = f, INFORM = as.integer(inform)) } monitor = function(n, ncall, xbest, icount, ninit, list, numpts, initpt, nbaskt, xbaskt, boxl, boxu, nstate) { inform <- 0 if (nstate == 0 || nstate == 1) { writeLines(toString(cat(sprintf("\n", "\n")))) writeLines(toString(cat(sprintf("*** Begin monitoring information ***", "\n")))) writeLines(toString(cat(sprintf("\n", "\n")))) } if (nstate <= 0) { writeLines(toString(cat(sprintf("Total sub-boxes = %s", toString(icount[1]), "\n")))) writeLines(toString(cat(sprintf("Total function evaluations = %s", toString(ncall), "\n")))) writeLines(toString(cat(sprintf("Total function evaluations used in local searches = %s", toString(icount[2]), "\n")))) writeLines(toString(cat(sprintf("Total points used in local search = %s", toString(icount[3]), "\n")))) writeLines(toString(cat(sprintf("Total sweeps through levels = %s", toString(icount[4]), "\n")))) writeLines(toString(cat(sprintf("Total splits by init. list = %s", toString(icount[5]), "\n")))) writeLines(toString(cat(sprintf("Lowest level with nonsplit boxes = %s", toString(icount[6]), "\n")))) writeLines(toString(cat(sprintf("Number of candidate minima in the %s", "shopping basket%s", " = %s", toString(nbaskt), "\n")))) writeLines(toString(cat(sprintf("Shopping basket:", "\n")))) print(xbaskt) writeLines(toString(cat(sprintf("\n", "\n")))) writeLines(toString(cat(sprintf("*** End monitoring information ***", "\n")))) writeLines(toString(cat(sprintf("\n", "\n")))) } list(INFORM = as.integer(inform)) } prob <- "peaks" xres <- 100 yres <- 100 bl <- matrix(c(-3, -3), nrow = 2, ncol = 1, byrow = TRUE) bu <- -bl fglob <- -6.55 xglob <- matrix(c(0.23, -1.63), nrow = 2, ncol = 1, byrow = TRUE) n <- length(bl) if (ifail == 0) { writeLines(toString(cat(sprintf("\n", "\n")))) writeLines(toString(cat(sprintf("Solve with no options or init.-list data", "\n")))) ibound <- 0 iinit <- 0 list <- as.matrix(mat.or.vec(n, 3)) numpts <- as.matrix(mat.or.vec(n, 1)) initpt <- as.matrix(mat.or.vec(n, 1)) ans <- e05jb(objective, ibound, iinit, bl, bu, list, numpts, initpt, monitor, optlist) bl <- ans$BL bu <- ans$BU list <- ans$LIST numpts <- ans$NUMPTS initpt <- ans$INITPT x <- ans$X obj <- ans$OBJ ifail <- ans$IFAIL ifail <- ans$IFAIL writeLines(toString(cat(sprintf("e05jbno options exited with ifail = %s", toString(ifail), "\n")))) if (ifail == 0) { writeLines(toString(cat(sprintf("xbest:", "\n")))) xbest <- ans$XBEST print(xbest) writeLines(toString(cat(sprintf("\n")))) obj <- ans$OBJ writeLines(toString(cat(sprintf("obj = %s", toString(obj), "\n")))) } writeLines(toString(cat(sprintf("\n", "\n")))) writeLines(toString(cat(sprintf("Solve with options and init.-list data", "\n")))) infbnd <-1.1579+077 iinit <- 3 list <- as.matrix(mat.or.vec(n, 3)) list[, 1] <- bl list[, 3] <- bu list[, 2] <- matrix(c(-1, 0), nrow = 2, ncol = 1, byrow = TRUE) numpts <- 3 * matrix(1, n, 1) initpt <- 2 * matrix(1, n, 1) ans <- e05jb(objective, ibound, iinit, bl, bu, list, numpts, initpt, monitor, optlist) ifail <- ans$IFAIL writeLines(toString(cat(sprintf("e05jboptions exited with ifail = %s", toString(ifail), "\n")))) if (ifail == 0) { writeLines(toString(cat(sprintf("xbest:", "\n")))) xbest <- ans$X print(xbest) writeLines(toString(cat(sprintf("\n")))) obj <- ans$OBJ writeLines(toString(cat(sprintf("obj = %s", toString(obj), "\n")))) } }