13#ifndef OPTIMIST_OPTIMIZER_NELDER_MEAD_HH
14#define OPTIMIST_OPTIMIZER_NELDER_MEAD_HH
41 template <
typename Real, Integer N>
67 this->m_s.reserve(N+1);
74 std::string
name_impl()
const {
return "NelderMead";}
84 this->m_s.push_back(x_ini);
86 for (
Integer i{0}; i < N; ++i) {
89 this->m_s.push_back(x);
100 return std::accumulate(this->m_s.begin(), this->m_s.end(), this->m_c) / N;
108 template <
typename FunctionLambda>
109 void sort(FunctionLambda && function)
111 std::sort(this->m_s.begin(), this->m_s.end(),
113 Real function_a, function_b;
114 this->evaluate_function(std::forward<FunctionLambda>(function), a, function_a);
115 this->evaluate_function(std::forward<FunctionLambda>(function), b, function_b);
116 return function_a < function_b;
128 return this->m_c + this->m_alpha * (this->m_c - this->m_s.back());
138 return this->m_c + this->m_gamma * (x - this->m_c);
148 return this->m_c + this->m_rho * (x - this->m_c);
157 return this->m_c + this->m_rho * (this->m_s.back() - this->m_c);
165 for (
Integer i{1}; i < static_cast<Integer>(this->m_s.size()); ++i) {
166 this->m_s.at(i) = this->m_s.at(1) + this->m_sigma * (this->m_s.at(i) - this->m_s.at(1));
188 Vector x_r, x_c, x_e, simplex_size;
189 Real function_x_r, function_x_1, function_x_last, function_x_e, function_x_c;
198 this->
sort(function);
205 this->
evaluate_function(std::forward<FunctionLambda>(function), x_r, function_x_r);
206 this->
evaluate_function(std::forward<FunctionLambda>(function), this->m_s.at(1), function_x_1);
207 this->
evaluate_function(std::forward<FunctionLambda>(function), this->m_s.back(), function_x_last);
209 if (function_x_1 <= function_x_r && function_x_r < function_x_last)
211 this->m_s.back() = x_r;
212 if (this->
m_verbose) {this->
info(function_x_1,
"Reflection");}
214 else if (function_x_r < function_x_1)
218 this->
evaluate_function(std::forward<FunctionLambda>(function), x_e, function_x_e);
219 if (function_x_e < function_x_r) {
220 this->m_s.back() = x_e;
222 this->m_s.back() = x_r;
224 if (this->
m_verbose) {this->
info(function_x_1,
"Expansion");}
226 else if (function_x_r < function_x_last)
230 this->
evaluate_function(std::forward<FunctionLambda>(function), x_c, function_x_c);
231 if (function_x_c < function_x_r) {
232 this->m_s.back() = x_c;
236 if (this->
m_verbose) {this->
info(function_x_1,
"Outward contraction");}
242 this->
evaluate_function(std::forward<FunctionLambda>(function), x_c, function_x_c);
243 if (function_x_c < function_x_last) {
244 this->m_s.back() = x_c;
248 if (this->
m_verbose) {this->
info(function_x_1,
"Inward contraction");}
250 simplex_size = this->m_s.back() - this->m_s.front();
251 if (simplex_size.norm() < this->m_tolerance) {
261 x_sol = this->m_s.at(0);
bool solve_impl(FunctionLambda &&function, Vector const &x_ini, Vector &x_sol)
Definition NelderMead.hh:179
Vector inward_contraction() const
Definition NelderMead.hh:155
static constexpr bool requires_first_derivative
Definition NelderMead.hh:46
Vector expansion(Vector const &x) const
Computes the expansion point.
Definition NelderMead.hh:136
void initialize(Vector const &x_ini, Real delta)
Definition NelderMead.hh:81
Simplex m_s
Definition NelderMead.hh:55
Real m_gamma
Definition NelderMead.hh:58
std::string name_impl() const
Definition NelderMead.hh:74
Real m_sigma
Definition NelderMead.hh:60
Vector centroid() const
Definition NelderMead.hh:98
void sort(FunctionLambda &&function)
Definition NelderMead.hh:109
NelderMead()
Definition NelderMead.hh:66
Real m_alpha
Definition NelderMead.hh:57
Vector m_c
Definition NelderMead.hh:56
static constexpr bool requires_second_derivative
Definition NelderMead.hh:47
Vector outward_contraction(Vector const &x) const
Definition NelderMead.hh:146
Vector reflection() const
Computes the reflection point.
Definition NelderMead.hh:126
Real m_rho
Definition NelderMead.hh:59
std::vector< Vector > Simplex
Definition NelderMead.hh:52
static constexpr bool requires_function
Definition NelderMead.hh:45
void shrink()
Definition NelderMead.hh:163
Class container for the multi-dimensional optimizer.
Definition Optimizer.hh:47
Optimizer()
Definition Optimizer.hh:69
typename SolverBase< Real, N, 1, NelderMead< Real, N >, false >::InputType Vector
Definition Optimizer.hh:60
typename SolverBase< Real, N, 1, NelderMead< Real, N >, false >::SecondDerivativeType Matrix
Definition Optimizer.hh:64
void info(Real residuals, std::string const ¬es="-")
Definition SolverBase.hh:924
Integer m_iterations
Definition SolverBase.hh:84
Integer m_max_iterations
Definition SolverBase.hh:85
void store_trace(InputType const &x)
Definition SolverBase.hh:813
void header()
Definition SolverBase.hh:870
void reset()
Definition SolverBase.hh:748
bool m_verbose
Definition SolverBase.hh:92
bool m_converged
Definition SolverBase.hh:98
void bottom()
Definition SolverBase.hh:900
bool evaluate_function(FunctionLambda &&function, InputType const &x, OutputType &out)
Definition SolverBase.hh:768
Namespace for the Optimist library.
Definition Optimist.hh:88
OPTIMIST_DEFAULT_INTEGER_TYPE Integer
The Integer type as used for the API.
Definition Optimist.hh:96