Мой код выглядит так.
nlopt::opt opt(nlopt::LD_SLSQP, dimension);
opt.set_min_objective(objective, NULL);
opt.add_inequality_mconstraint(constraint1, NULL, tolerance1);
opt.add_equality_mconstraint(constraint2, NULL, tolerance2);
opt.add_equality_mconstraint(constraint3, NULL, tolerance3);
opt.set_xtol_rel(1e-6);
opt.set_ftol_rel(1e-6);
opt.set_lower_bounds(lb);
opt.set_upper_bounds(ub);
opt.set_maxeval(MAX_EVAL);
initial_guess(result_vector);
opt.optimize(result_vector, min_cost);
Оптимизация с 1 ограничением возвращает хороший результат.
Но когда я использую их вместе, оптимизатор не работает должным образом. (каждое ограничение не выполняется)
Есть идеи, почему это происходит ???
Из документации (NLopt Введение):
В принципе, каждое ограничение равенства может быть выражено двумя ограничениями неравенства …, поэтому вы можете подумать, что любой код, который может обрабатывать ограничения неравенства, может автоматически обрабатывать ограничения равенства. На практике это не так — если вы попытаетесь выразить ограничение равенства в виде пары нелинейных ограничений неравенства, некоторые алгоритмы не смогут сойтись.
Мое лучшее предположение состоит в том, что комбинация ограничений неравенства предотвратила бы сходимость оптимизатора. Если ваши ограничения создают ограничение равенства, то введение предлагает использовать это для решения одного параметра в терминах одного (или нескольких) других параметров.
РЕДАКТИРОВАТЬ: я также заметил, что ваши значения ftol и xtol одинаковы; введение также рекомендует против этого, так как из разложения в ряд Тейлора вблизи оптимума ошибка в объективе масштабируется как квадрат ошибки в x.