[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