Я пытаюсь оптимизировать функцию в R с помощью пакета nloptr. Вот код: library ('nloptr') hn

1
Astra Uvarova - Saturn's star 9 Янв 2021 в 13:23

1 ответ

Лучший ответ

Это все еще немного предположение, но: единственная возможность, которую я могу придумать, - это использование производного оптимизатора для вашего локального оптимизатора одновременно с использованием оптимизатора без производных для глобального решения (т. Е. в документах NLopt поясняется, что LN в NLOPT_LN_AUGLAG обозначает "локальный, без производной", тогда как _LD_ будет обозначать "локальный, основанный на производной") вызывает проблему? Я получил ответ (хотя и не уверен, что он правильный!), Используя "NLOPT_LN_COBYLA" в качестве алгоритма в local_opts: со всем остальным, как в вашем коде,

local_opts <- list("algorithm" = "NLOPT_LN_COBYLA", 
                   "xtol_rel"=1.0e-18)

# Set optimization options.
opts <- list("algorithm" = "NLOPT_LN_AUGLAG",
             "xtol_rel" = 1.0e-18, "local_opts" = local_opts, "maxeval" = 10000)

print(res <- nloptr ( x0 = x0, 
                eval_f = eval_f,
                eval_g_eq = eval_g_eq,
                eval_g_ineq = eval_g_ineq,
                lb = lb,
                ub = ub,
               opts = opts ))

Возврат

Call:

nloptr(x0 = x0, eval_f = eval_f, lb = lb, ub = ub, eval_g_ineq = eval_g_ineq, 
    eval_g_eq = eval_g_eq, opts = opts)


Minimization using NLopt version 2.4.2 

NLopt solver status: 3 ( NLOPT_FTOL_REACHED: Optimization stopped because 
ftol_rel or ftol_abs (above) was reached. )

Number of Iterations....: 102 
Termination conditions:  xtol_rel: 1e-18    maxeval: 10000 
Number of inequality constraints:  2 
Number of equality constraints:    1 
Optimal value of objective function:  2.13836819774604e-05 
Optimal value of controls: 0 1 -0.0003556752 0.006520304 2.037835

Насколько я понимаю, это привело к правдоподобному решению с учетом ограничений:

  • причина остановки ("ftol_rel или ftol_abs ... был достигнут") разумная
  • для этого использовалось разумное количество (102) итераций (а не maxeval)
  • eval_g_eq(res$solution) дает 0 (что мы также можем увидеть при осмотре, поскольку условие равно x[1]+x[2]-1==0).
  • Условия неравенства: -x1-x2 и x1+x2-1; Я не уверен, как определяется / определяется знак этих неравенств? То же, что и x0, т. Е. При допустимости начальных условий? (Если x1+x2 ограничено равным 1, я не уверен, почему ограничения неравенства здесь вообще могут что-то сделать?)
  • eval_f(x0) значительно больше, чем eval_f(res$solution) ...
1
Ben Bolker 10 Янв 2021 в 17:51