[R] Constrained Optimization in R (alabama)
Berend Hasselman
bhh at xs4all.nl
Mon Feb 11 06:45:15 CET 2013
On 10-02-2013, at 21:16, Axel Urbiz <axel.urbiz at gmail.com> wrote:
> Dear List,
>
> I'm trying to solve this simple optimization problem in R. The parameters
> are the exponents to the matrix mm. The constraints specify that each row
> of the parameter matrix should sum to 1 and their product to 0. I don't
> understand why the constraints are not satisfied at the solution. I must be
> misinterpreting how to specify the constrains somehow.
>
>
> library(alabama)
>
> ff <- function (x) {
> mm <- matrix(c(10, 25, 5, 10), 2, 2)
> matx <- matrix(x, 2, 2)
> -sum(apply(mm ^ matx, 1, prod))
> }
>
>
> ### constraints
>
> heq <- function(x) {
> h <- rep(NA, 1)
> h[1] <- x[1] + x[3] -1
> h[2] <- x[2] + x[4] -1
> h[3] <- x[1] * x[3]
> h[4] <- x[2] * x[4]
> h
> }
>
> res <- constrOptim.nl(par = c(1, 1, 1, 1), fn = ff,
> heq = heq)
> res$convergence #why NULL?
> matrix(round(res$par, 2), 2, 2) #why constraints are not satisfied?
There is no need to use an optimization function in this case. You can easily find the optimum by hand.
From the constraints :
x[3] equals (1-x[1])
x[4] equals (1-x[2])
Therefore
x[1] * (1-x[1]) equals 0
x[2] * (1-x[2]) equals 0
So you only need to calculate the function value for 4 vectors:
x1 <- c(1,1,0,0)
x2 <- c(0,0,1,1)
x3 <- c(1,0,0,1)
x4 <- c(0,1,1,0)
Modifying your ff function in the way Ravi suggested:
ff <- function (x) {
mm <- matrix(c(10, 25, 5, 10), 2, 2)
matx <- matrix(x, 2, 2)
sum(apply(mm ^ matx, 1, prod))
}
and running ff with x{1,2,3,4} as argument, one gets
> ff(x1)
[1] 35
> ff(x2)
[1] 15
> ff(x3)
[1] 20
> ff(x4)
[1] 30
So ff(x2) achieves the minimum, which corresponds to Ravi's result with auglag.
Berend
More information about the R-help
mailing list