[R] Non linear optimization with nloptr package fail to produce true optimal result

John Fox j|ox @end|ng |rom mcm@@ter@c@
Fri Dec 13 20:44:10 CET 2024


Dear Daniel et al.,

Following on Duncan's remark and examining the message produced by 
nloptr(), I simply tried increasing the maximum number of function 
evaluations:
------ snip -------

 > nloptr(rep(0, 4), f, eval_g_ineq = hin, eval_g_eq = Hx, opts =
+          list("algorithm" = "NLOPT_LN_COBYLA", "xtol_rel" = 1.0e-8,
+               maxeval = 1e5)
+ )

Call:

nloptr(x0 = rep(0, 4), eval_f = f, eval_g_ineq = hin, eval_g_eq = Hx,
     opts = list(algorithm = "NLOPT_LN_COBYLA", xtol_rel = 1e-08,
         maxeval = 1e+05))


Minimization using NLopt version 2.7.1

NLopt solver status: 4 ( NLOPT_XTOL_REACHED: Optimization stopped
because xtol_rel or xtol_abs (above) was reached. )

Number of Iterations....: 46317
Termination conditions:  xtol_rel: 1e-08	maxeval: 1e+05
Number of inequality constraints:  1
Number of equality constraints:    1
Optimal value of objective function:  1287.71725107671
Optimal value of controls: 1.576708 6.456606 6.195305 -19.008

---------- snip ----------

That produces a solution closer to, and better than, the one that you 
suggested (which you obtained how?):

 > f(c(0.222, 6.999, 6.17, -19.371))
[1] 1325.076

I hope this helps,
  John
-- 
John Fox, Professor Emeritus
McMaster University
Hamilton, Ontario, Canada
web: https://www.john-fox.ca/
--
On 2024-12-13 1:45 p.m., Duncan Murdoch wrote:
> Caution: External email.
> 
> 
> You posted a version of this question on StackOverflow, and were given
> advice there that you ignored.
> 
> nloptr() clearly indicates that it is quitting without reaching an
> optimum, but you are hiding that message.  Don't do that.
> 
> Duncan Murdoch
> 
> On 2024-12-13 12:52 p.m., Daniel Lobo wrote:
>> library(nloptr)
>>
>> set.seed(1)
>> A <- 1.34
>> B <- 0.5673
>> C <- 6.356
>> D <- -1.234
>> x <- seq(0.5, 20, length.out = 500)
>> y <- A + B * x + C * x^2 + D * log(x) + runif(500, 0, 3)
>>
>> #Objective function
>>
>> X <- cbind(1, x, x^2, log(x))
>> f <- function(theta) {
>> sum(abs(X %*% theta - y))
>> }
>>
>> #Constraint
>>
>> eps <- 1e-4
>>
>> hin <- function(theta) {
>>    abs(sum(X %*% theta) - sum(y)) - 1e-3 + eps
>> }
>>
>> Hx <- function(theta) {
>>    X[100, , drop = FALSE] %*% theta - (120 - eps)
>> }
>>
>> #Optimization with nloptr
>>
>> Sol = nloptr(rep(0, 4), f, eval_g_ineq = hin, eval_g_eq = Hx, opts =
>> list("algorithm" = "NLOPT_LN_COBYLA", "xtol_rel" = 1.0e-8))$solution
>> # -0.2186159 -0.5032066  6.4458823 -0.4125948
> 
> ______________________________________________
> 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 https://www.R-project.org/posting- 
> guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list