[R] Relatively Simple Maximization Using Optim Doesnt Optimize

J C Nash pro|jcn@@h @end|ng |rom gm@||@com
Thu Mar 12 15:23:15 CET 2020


As author of CG (at least the code that was used to build it), I can say I was
never happy with that code. Rcgmin is the replacement I wrote, and I believe that
could still be improved.

BUT:
  - you have a 1D optimization. Use Brent method and supply bounds.
  - I never intended CG (or BFGS or Nelder-Mead or ...) to work for 1D
    problems
  - as Jeff points out, you need the gradient. I stop Rcgmin and Rvmmin if
    user hasn't supplied one, as numerical approximations need to be very
    good for these gradient methods

JN

On 2020-03-12 10:03 a.m., Jeff Newmiller wrote:
> The help file points out that CG is "fragile" ... and I would expect that failing to define a gradient function will exacerbate that.
> 
> I think you should use a different algorithm or specify a gradient function. You might also consider working with the more recent optimr package contributed by Dr Nash, author of the original optim function in R.
> 
> On March 12, 2020 2:30:26 AM PDT, Skyler Saleebyan <skylerbsaleebyan using gmail.com> wrote:
>> I am trying to familiarize myself with optim() with a relatively simple
>> maximization.
>>
>> Description:
>> L and K are two terms which are constrained to add up to a total 100000
>> (with respective weights to each). To map this constraint I plugged K
>> into
>> the function (to make this as simple as possible.)
>>
>> Together these two feed into one nonlinear function which is the
>> product of
>> two monotonic (on the positive interval) functions. Then that numbers
>> is
>> returned in a function fed to optim, which should maximize the output
>> by
>> adjusting L. The whole code is:
>>
>> production1 <- function(L){
>>  budget=100000
>>  Lcost=12
>>  Kcost=15
>>  K=(budget-L*Lcost)/Kcost
>>  machines=0.05*L^(2/3)*K^(1/3)
>>  return(machines)
>> }
>>
>> # production1(6000) #example of number with much higher output vs optim
>> result
>> S1=optim(1001,production1,method="CG",control=list(fnscale=-1))
>> S1
>>
>> Output:
>> $par
>> [1] 1006.536
>>
>> $value
>> [1] 90.54671
>>
>> $counts
>> function gradient
>>     201      101
>>
>> $convergence
>> [1] 1
>>
>> $message
>> NULL
>>
>>
>> For some reason this never explores the problem space and just spits
>> out
>> some answer close to the initial condition. What am I doing wrong?
>>
>> Thanks,
>> Skyler S.
>>
>> 	[[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list