The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

Type: Package
Title: General Purpose Optimization in R using C++
Version: 0.1.6
Author: Yi Pan [aut, cre]
Maintainer: Yi Pan <ypan1988@gmail.com>
Description: Perform general purpose optimization in R using C++. A unified wrapper interface is provided to call C functions of the five optimization algorithms ('Nelder-Mead', 'BFGS', 'CG', 'L-BFGS-B' and 'SANN') underlying optim().
License: GPL-2 | GPL-3 [expanded from: GPL (≥ 2)]
Encoding: UTF-8
SystemRequirements: C++11
Imports: Rcpp (≥ 0.12.14)
LinkingTo: Rcpp, RcppArmadillo
RoxygenNote: 7.1.1
URL: https://github.com/ypan1988/roptim/
BugReports: https://github.com/ypan1988/roptim/issues
Suggests: R.rsp, testthat (≥ 3.0.0)
VignetteBuilder: R.rsp
Config/testthat/edition: 3
NeedsCompilation: yes
Packaged: 2022-08-06 09:57:32 UTC; yipan
Repository: CRAN
Date/Publication: 2022-08-06 10:30:02 UTC

Example 1: Minimize Rosenbrock function using BFGS

Description

Minimize Rosenbrock function using BFGS.

Usage

example1_rosen_bfgs(print = TRUE)

Arguments

print

whether the results should be printed.

Examples

fr <- function(x) {   ## Rosenbrock Banana function
 x1 <- x[1]
 x2 <- x[2]
 100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}
grr <- function(x) { ## Gradient of 'fr'
 x1 <- x[1]
 x2 <- x[2]
 c(-400 * x1 * (x2 - x1 * x1) - 2 * (1 - x1),
   200 *      (x2 - x1 * x1))
}
res <- optim(c(-1.2,1), fr, grr, method = "BFGS", control = list(trace=TRUE), hessian = TRUE)
res

## corresponding C++ implementation:
example1_rosen_bfgs()

Example 1: Gradient/Hessian checks for the implemented C++ class of Rosenbrock function

Description

Gradient/Hessian checks for the implemented C++ class of Rosenbrock function.

Usage

example1_rosen_grad_hess_check()

Example 1: Minimize Rosenbrock function (with numerical gradient) using BFGS

Description

Minimize Rosenbrock function (with numerical gradient) using BFGS.

Usage

example1_rosen_nograd_bfgs()

Examples

fr <- function(x) {   ## Rosenbrock Banana function
 x1 <- x[1]
 x2 <- x[2]
 100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}

optim(c(-1.2,1), fr, NULL, method = "BFGS")

## corresponding C++ implementation:
example1_rosen_nograd_bfgs()

Example 1: Minimize Rosenbrock function using other methods

Description

Minimize Rosenbrock function using other methods ("Nelder-Mead"/"CG"/ "L-BFGS-B"/"SANN").

Usage

example1_rosen_other_methods()

Examples

fr <- function(x) {   ## Rosenbrock Banana function
 x1 <- x[1]
 x2 <- x[2]
 100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}
grr <- function(x) { ## Gradient of 'fr'
 x1 <- x[1]
 x2 <- x[2]
 c(-400 * x1 * (x2 - x1 * x1) - 2 * (1 - x1),
   200 *      (x2 - x1 * x1))
}

optim(c(-1.2,1), fr)

## These do not converge in the default number of steps
optim(c(-1.2,1), fr, grr, method = "CG")
optim(c(-1.2,1), fr, grr, method = "CG", control = list(type = 2))

optim(c(-1.2,1), fr, grr, method = "L-BFGS-B")

optim(c(-1.2,1), fr, method = "SANN")

## corresponding C++ implementation:
example1_rosen_other_methods()

Example 2: Solve Travelling Salesman Problem (TSP) using SANN

Description

Solve Travelling Salesman Problem (TSP) using SANN.

Usage

example2_tsp_sann(distmat, x)

Arguments

distmat

a distance matrix for storing all pair of locations.

x

initial route.

Examples

## Combinatorial optimization: Traveling salesman problem
library(stats) # normally loaded

eurodistmat <- as.matrix(eurodist)

distance <- function(sq) {  # Target function
 sq2 <- embed(sq, 2)
 sum(eurodistmat[cbind(sq2[,2], sq2[,1])])
}

genseq <- function(sq) {  # Generate new candidate sequence
 idx <- seq(2, NROW(eurodistmat)-1)
 changepoints <- sample(idx, size = 2, replace = FALSE)
 tmp <- sq[changepoints[1]]
 sq[changepoints[1]] <- sq[changepoints[2]]
 sq[changepoints[2]] <- tmp
 sq
}

sq <- c(1:nrow(eurodistmat), 1)  # Initial sequence: alphabetic
distance(sq)
# rotate for conventional orientation
loc <- -cmdscale(eurodist, add = TRUE)$points
x <- loc[,1]; y <- loc[,2]
s <- seq_len(nrow(eurodistmat))
tspinit <- loc[sq,]

plot(x, y, type = "n", asp = 1, xlab = "", ylab = "",
    main = "initial solution of traveling salesman problem", axes = FALSE)
arrows(tspinit[s,1], tspinit[s,2], tspinit[s+1,1], tspinit[s+1,2],
      angle = 10, col = "green")
text(x, y, labels(eurodist), cex = 0.8)

## The original R optimization:
## set.seed(123) # chosen to get a good soln relatively quickly
## res <- optim(sq, distance, genseq, method = "SANN",
##              control = list(maxit = 30000, temp = 2000, trace = TRUE,
##              REPORT = 500))
## res  # Near optimum distance around 12842

## corresponding C++ implementation:
set.seed(4)  # chosen to get a good soln relatively quickly
res <- example2_tsp_sann(eurodistmat, sq)

tspres <- loc[res$par,]
plot(x, y, type = "n", asp = 1, xlab = "", ylab = "",
    main = "optim() 'solving' traveling salesman problem", axes = FALSE)
arrows(tspres[s,1], tspres[s,2], tspres[s+1,1], tspres[s+1,2],
      angle = 10, col = "red")
text(x, y, labels(eurodist), cex = 0.8)

Example 3: Minimize a function using L-BFGS-B with 25-dimensional box constrained

Description

Minimize a function using L-BFGS-B with 25-dimensional box constrained.

Usage

example3_flb_25_dims_box_con()

Examples

flb <- function(x)
{ p <- length(x); sum(c(1, rep(4, p-1)) * (x - c(1, x[-p])^2)^2) }
## 25-dimensional box constrained
optim(rep(3, 25), flb, NULL, method = "L-BFGS-B",
     lower = rep(2, 25), upper = rep(4, 25)) # par[24] is *not* at boundary

## corresponding C++ implementation:
example3_flb_25_dims_box_con()

Example 4: Minimize a "wild" function using SANN and BFGS

Description

Minimize a "wild" function using SANN and BFGS.

Usage

example4_wild_fun()

Examples

## "wild" function , global minimum at about -15.81515
fw <- function (x)
 10*sin(0.3*x)*sin(1.3*x^2) + 0.00001*x^4 + 0.2*x+80
plot(fw, -50, 50, n = 1000, main = "optim() minimising 'wild function'")

res <- optim(50, fw, method = "SANN",
            control = list(maxit = 20000, temp = 20, parscale = 20))
res
## Now improve locally {typically only by a small bit}:
(r2 <- optim(res$par, fw, method = "BFGS"))
points(r2$par,  r2$value,  pch = 8, col = "red", cex = 2)

## corresponding C++ implementation:
example4_wild_fun()

roptim

Description

Perform general purpose optimization in R using C++. A unified wrapper interface is provided to call C functions of the five optimization algorithms ('Nelder-Mead', 'BFGS', 'CG', 'L-BFGS-B' and 'SANN') underlying optim().

Author(s)

Yi Pan

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.