[R] Full enumeration, how can this be vectorized

Daniel Hoppe daniel.hoppe at em.uni-karlsruhe.de
Mon Nov 25 19:13:48 CET 2002


Hi all,

I am currently using the code snippet below to minimize a function which I
wasn't able to minimize properly with optim (cliffy surface, constraints,
poles). Obviously this iteration is probably the poorest way of implementing
such a function and it is expectedly slow. I've already written some
vectorized functions, but I'm afraid that I'm missing the "big picture" in
this case, I don't know how to start. Probably I could build a 3 x
(length(x) * length(y) * length(z)) matrix holding each possible parameter
combinations. With my current step-size and value range that would be
slightly more than 2,000,000 triples, so that should not be a problem. Then
comes the part I'm totally clueless about, that is applying the target
function to each of the triples in the matrix in an efficient way. From the
resulting vector I could then easily take the minimum value index and get
the parameters from the parameter matrix.

Could someone kindly give me a hint how this could be implemented?

Thanks a lot,

Daniel


Code Snippet:
fullEnumeration <- function(par, stepSize = c(.03, .03, .03))
{
   res <- Inf

   best.x <- -1
   best.y <- -1
   best.z <- -1

   stepx <- stepSize[1]
   stepy <- stepSize[2]
   stepz <- stepSize[3]
   x <- seq(.01, 2, by=stepx)
   y <- seq(.01, 2, by=stepy)
   z <- seq(.01, 15, by=stepz)

   for (i in 1:length(x))
    for (j in 1:length(y))
        for (k in 1:length(z))
        {
		# Pass the current best result to the function being minimized to allow
for early termination
            newRes <- fun(c(x[i], y[j], z[k]), par, res)
            if (!is.na(newRes) && newRes < res)
            {
                res = newRes
                best.x <- x[i]
                best.y <- y[j]
                best.z <- z[k]
            }

        }
   return (c(
        best.x,
        best.y,
        best.z))

}

fun <- function(x, par, currentBestValue=Inf)
{
  x = x[1]
  y = x[2]
  z = x[3]
  TMax <- length(par)

  result <- 0
  for (myT in 1:TMax)
  {
    result <- result +
    (
    ((x * z) / (y-1) * (1 - (z / (z + myT))^(y-1) ))
    - par[myT]
    )^2

    # Allow for short-cut evaluation if running in complete enumeration mode

    if (is.na(result) || currentBestValue < result)
    {
        return (Inf)
    }

  }
  return (result)

}



-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list