[R] constrained optimization help please!

Berend Hasselman bhh at xs4all.nl
Fri Nov 2 10:33:14 CET 2012


On 01-11-2012, at 21:59, hayduke wrote:

> Hi All, 
> I am having some real difficulty in trying to carry out constrained
> optimization. I have had no problems with the Optim() function but when I

Being pedantic: I assume you mean optim(...)?

> try to constrain the problem I am getting all sorts of error messages.
> The model is a simple 2 area, 2 fleet, 1 stock model of a fishery. The code
> is below. This code runs well but when I try the constrOptim() command with
> an upper limit of f=6 for each fleet (total across 2 areas), the solver does
> not run. 
> Does anybody have any suggestions? Thanks.
> nfleets<-2
> nareas<-2
> M<-1
> M<-array(M,dim=c(nfleets,nareas))
> N<-1000
> cost<-c(40,40)
> cost<-array(cost,dim=c(nfleets,nareas))
> Price<-2
> Price<-array(Price,dim=c(nfleets,nareas))
> q<-array(0.1,dim=c(nfleets,nareas))

Why make it so complicated?
q <- 01. will do what you want

> f<-1
> f<-array(f,dim=c(nfleets,nareas))
> init.eff<-array(3,dim=c(nfleets,nareas))
> OF<-array(c(q*f), dim=c(nfleets, nareas))
> Catch<-array(0,dim=c(nfleets, nareas))
> 
> obj<-function(f){
>    f <- array(f, dim=c(nfleets, nareas))
>    F <- q*f

or simply F <- .1 * F

>    Z <- M+sum(F)
>    S <- exp(-Z)
>    Catch<- N*F/Z*(1-S)
>    Tot.Catch <- sum(Catch)
>    NR<-array(0,dim=c(nfleets,nareas))
>    NR<-Price*Catch - f*cost
>    d.NR<-array(0,dim=c(nfleets,nareas))
>    f <- apply(f, 1, sum)
>    d.NR<- N*q/Z*(1-S-F/Z+F/Z*S+F*S)*Price - cost 
>    return(sum(d.NR*d.NR))
> }
> 
> #zero.bnd <-  rep.int(0, length(f))
> #opt.eff  <- optim( init.eff, obj, method="L-BFGS-B" )  
> 
> upper<-c(6,6)
> lower<-c(0,0)
> 
> constropt.eff<-constrOptim(init.eff,obj,ui=upper, ci=lower,
> method="Nelder-Mead")
> 


Your init.eff is an array. It should be a vector as described in the documentation of constrOptim.
The argument ui is not the upperlimit but should be a matrix.
The documentation of constrOptim clearly states the constraints are of the form ui %*% theta - ci >= 0.

This will work:

init.eff <- init.eff - 1
B <- rbind(c(1,0,1,0),c(0,1,0,1))
constropt.eff<-constrOptim(as.vector(init.eff),obj,ui=-B, ci=-c(6,6), method="Nelder-Mead")
constropt.eff

- you need to do init.eff <- init.eff - 1 to get the initial parameter in the interior of the feasible region
- as.vector(init.eff) stacks the columns so the order is f[1,1],f[2,1],f[1,2],f[2,2]
- If I understand correctly what you want the constraints are f[1,1]+f[1,2] < 6 and f[2,1]+f[2,2] < 6
  That is B %*% as.vector(init.eff) -c(6,6) <= 0

To get the constraints in the correct format for constrOptim() you need to multiply by -1.
So ui=-B and ci=-c(6,6)

Whether the result is correct is for you to decide.
In addition: your problem appears to be quadratic with linear constraints.
Have a look at function lsei() in package limSolve.

Berend




More information about the R-help mailing list