[R] non-linear integer optimization?

Hans W Borchers hwborchers at googlemail.com
Fri Sep 24 07:29:02 CEST 2010


darckeen <darckeen <at> hotmail.com> writes:

> This is an example of the type of problem, and how i'm currently using
> optim() to solve it.


I would classify this as an integer programming (IP) problem, it is not 
even non-linear, as there are no continuous variables. Your approach with 
optim() will not work, especially not with method 'L-BFGS-B' for numerical
optimization. Maybe it's worth to try method 'SANN'.

Integer programming needs special techniques. If you don't know more about
your function, it may boil down to an exhaustive discrete search that will
be slow anyway. 

Hans Werner

Example: With

    set.seed(8232); mydata <- runif(500,-1,1)   # fix these parameters

the 'optim()' approach finds a minimum of 0.9887148 with "L-BFGS-B" and
0.9139314 with method "SANN", while the global minimum is 0.7360688 in your
constraint area. DEoptim (in package DEoptim) returns 0.750277. The minimum
is more difficult to find in this example as it appears on the boundary.


> mydata <- runif(500,-1,1)
> 
> myfunc <- function(p,d)
> {
> 	print(p <- floor(p))
> 	ws <- function(i,n,x) sum(x[i-n+1]:x[i])
> 	ws1 <- c(rep(NA,p[1]-1),sapply(p[1]:NROW(d),ws,p[1],d))
> 	ws2 <- c(rep(NA,p[2]-1),sapply(p[2]:NROW(d),ws,p[2],d))
> 	ws3 <- c(rep(NA,p[3]-1),sapply(p[3]:NROW(d),ws,p[3],d))
> 	var(ws1+ws2+ws3,na.rm=TRUE)
> }
> 
> opt <- optim(c(25,50,150),myfunc,method="L-BFGS-B",
> 		control=list(fnscale=-1,parscale=c(1,1,1),factr=1,ndeps=c(5,5,5)),
> 		lower=t(c(1,51,101)),upper=t(c(50,100,200)),d=mydata)
> 
> print(floor(opt$par))
> print(myfunc(opt$par,mydata))
> 
> So the parameters to the function to be optimized are parameters to
> functions that only accept integer values.  All of the paramters to be
> optimized are integers that are subject to upper lower bound constraints. 
> This was the solution I came up with after checking CRAN, searching nabble
> etc.  
> 
> It runs but not very efficiently, and does not seem to really explore the
> sample space very well before focusing on a local minimum.  I also looked at
> the constrOptim function but I couldn't figure out how to implement two
> sided constraints with it.



More information about the R-help mailing list