# smco: simple Monte Carlo optimizer using adaptive coordinate... In smco: A simple Monte Carlo optimizer using adaptive coordinate sampling

## Description

The function `smco` is use to optimize non-linear complex functions based on three simple ideas: first, the sampling of each component of the solution vector, one at a time, based on a truncated normal distribution; second, the evolution of the standard deviation of the sampling distribution in each iteration, as a mechanism of self-adaptation; and third, the restart of the algorithm for escaping of local optima.

## Usage

 ```1 2 3 4``` ``` smco(par = NULL, fn, gr = NULL, ..., N = length(par), LB, UB, maxiter = 1000, Co = 0.01, Cmin = 0.0001, Cmax = 0.5, trc = FALSE, lambda = 20, useBFGS = FALSE, control = list(), hessian = FALSE) ```

## Arguments

 `par` Initial values for the parameters to be optimized over. When it is 'NULL' the user must be specify the value for the 'N' parameter and the algorithm it is initializated in a random point. `fn` A function to be minimized (or maximized), with first argument the vector of parameters over which minimization is to take place. It should return a scalar result. `gr` A function to return the gradient for the '"L-BFGS-B"' method when the option `trc` is set to TRUE. If it is 'NULL', a finite-difference approximation will be used. `...` Further arguments to be passed to 'fn' and 'gr'. `N` The number of dimensions of the vector of solution variables `LB, UB` Lower and upper bounds on the variables. `maxiter` The maximum number of iterations. The number of function calls to '"L-BFGS-B"' implementation is not taking into count. `Co, Cmin, Cmax` Initial, minimum and maximum values for the standard deviation of the truncated normal distribution `trc` Logical. When it is 'TRUE' the progress of the optimization algorithm is reported. `lambda` Restarting parameter. When the algorithm reaches 'lambda' * 'N' iterations without found a new local optimum the restart ocurrs. `useBFGS` Logical. When it value is 'TRUE', first, a new random value for the current coordinate is generated using a truncated normal distribution; second, the one-dimensional optimization of the value of the current coordinate is made using the '"L-BFGS-B"' method implemented in the `optim` function `control` A list of control parameters for the '"L-BFGS-B"' implemented in the `optim` function. `hessian` A control parameter for the '"L-BFGS-B"' implemented in the `optim` function.

## Details

The algorithm tries to improve the current solution by changing the i-th coordinate by a random value generated using a truncated normal distribution. Only a random value for each coordinate is generated each time. When the parameter 'useBFGS' is 'TRUE', the new random value is used as the initial point for the one-dimensional optimization of the i-th coordinate using '"L-BFGS-B"' method implemented in the `optim` function.

The standard deviation of the truncated random deviation changes in each iteration in a random way. The values of the standard deviation are bounded to the interval defined by 'Cmin' and 'Cmax'.

When the algorithm reaches 'lambda' * 'N' iterations without found a new local optimum the restart ocurrs. For this, a new random current solution is generated.

## Value

A list with components:

 `par` The best set of parameters found. `value` The value of 'fn' corresponding to 'par'. `f.opt, f.min, f.curr` Vectors of size 'maxiter' containing the values of the global optimum, local optimum and current value of the function 'fn' for the current iteration. `call` The call to the function.

## Author(s)

Prof. Juan D. Velasquez, Ph.D.
[email protected]

## References

Velasquez, J. D. (2011). A Simple Monte Carlo optimizer based on Adaptive Coordinate Sampling. Submitted to Operation Research Letters.

`optim`
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15``` ```SphereModel.fcn <- function( x ) { return(sum(x ^ 2)) } f = SphereModel.fcn; ndim = 10; LB = rep( -600.000, ndim); UB = rep( 600.000, ndim); maxiter = 100; s = smco(par = NULL, fn = SphereModel.fcn, N = ndim, LB = LB, UB = UB, maxiter = maxiter, Co = 0.01, Cmin = 0.0001, Cmax = 0.5, trc = TRUE, lambda = 20, useBFGS = TRUE, control = list(maxit = 10)) ```