Я смотрю на пример, приведенный в руководство по nloptr.
Я заменил последнюю часть кода на
local_opts <- list( "algorithm" = "NLOPT_LD_MMA",
"xtol_rel" = 0.0,
"ftol_rel" = 0.0,
"ftol_abs" = 0.0,
"xtol_abs" = 0.0)
opts <- list( "algorithm" = "NLOPT_LD_AUGLAG",
"xtol_rel" = 0.0,
"ftol_rel" = 0.0,
"ftol_abs" = 0.0,
"xtol_abs" = 0.0,
"maxeval" = 100000,
"local_opts" = local_opts )
res <- 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)
print( res )
То есть я изменил xtol / ftol rel / abs на все равными 0, как для основного решателя, так и для локального решателя. Обратите внимание, что оба они используют алгоритм на основе градиента. Я также увеличил максимальное количество шагов с 1к до 100к.
Однако решатель завершается гораздо раньше, с шагом 3k.
Вызов: 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)Минимизация с использованием NLopt версии 2.4.2
Статус решателя NLopt: 3 (NLOPT_FTOL_REACHED: оптимизация остановлена
потому что ftol_rel или ftol_abs (выше) были достигнуты. )Количество итераций ….: 3132 Условия завершения: xtol_rel:
0 ftol_rel: 0 ftol_abs: 0 xtol_abs: 0 maxeval: 1e + 05 Количество
ограничения неравенства: 1 Количество ограничений равенства: 1
Оптимальное значение целевой функции: 17.0140172891563 Оптимальное значение
органов управления: 1 4.743 3.82115 1.379408
Глядя на c ++ реализация nlopt, похоже, этого не должно быть. Условия прекращения, заданные различными уровнями допуска, соответствуют строгому неравенству. Поэтому я что-то упускаю из-за значения статуса решателя: «NLOPT_FTOL_REACHED: оптимизация остановлена, потому что достигнуты ftol_rel или ftol_abs (см. Выше)». ?
Спасибо!
Джон
Задача ещё не решена.
Других решений пока нет …