C++: NLopt COBYLA по сравнению с Matlab fmincon
Я использую NLopt library
, COBYLA algorithm
в C++ для минимизации функции затрат на основе журнала. Я уже реализовал то же самое, используя fmincom
в Matlab. Функция Matlab работает намного лучше, чем NLopt
, Это требует гораздо меньшего количества оптимизаций, чем NLopt, а также сходится к минимальному значению, намного лучше, чем NLopt.
Я считаю, что дополнительные параметры, используемые для алгоритмов, различны. Я попытался скопировать те же параметры для NLopt, что и для значения по умолчанию в fmincon в Matlab, и он все еще не дает аналогичных результатов.
Мне нужно знать, как сходиться таким же образом, как Matlab, если это возможно, используя COBYLA в NLopt. заранее спасибо
1 ответ
Почему КОБИЛА? fmincon
это больше похоже на NLopt L-BFGS, см. также LBFGS. Они используют оценки градиента, поэтому сходятся гораздо быстрее, чем линейные приближения COBYLA, когда функция func() → квадратичная.
Я бы предложил
- распечатать / построить все значения функций для обоих оптимизаторов (распечатать внутри вашей функции)
- опубликовать все варианты для обоих; КОБИЛА очень чувствительна к робегу и ренду
- попробуйте NLopt L-BFGS или NLopt BOBYQA, "итеративно построенное квадратичное приближение" .
Добавлено: использует fmincom
"Конечные различия, используемые для оценки градиентов, являются либо" прямыми "(по умолчанию), либо" центральными " ..."
автоматически. Вы можете запустить L-BFGS или любой оптимизатор градиента с оценщиком градиента, таким как односторонние или центральные различия. В целом, это может быть плохой оценкой для шумных функций или вблизи границ;
но это работает для вас в fmincom, поэтому должно работать и в NLopt L-BFGS.
Попробуйте сначала, прежде чем тратить время на совершенно разные методы.
Вы хотите установить эти параметры NLopt: initial_step
например, 1 или. 1 ftol_abs
а также xtol_abs
например, 1е-4, не меньше, чем нужно
(для COBYLA, initial_step → rhobegin и initial_step масштабируются x xtol_abs → rhoend.)
NB распечатать коды возврата из любого оптимизатора: почему он остановился?