From 764be714f614572f60a8cce51901d224bb372269 Mon Sep 17 00:00:00 2001 From: Erik Strand <erik.strand@cba.mit.edu> Date: Thu, 16 Apr 2020 12:21:32 -0400 Subject: [PATCH] Teach nm to build its own simplex --- .../optimizers/nelder_mead/nelder_mead.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/optimization/optimizers/nelder_mead/nelder_mead.h b/optimization/optimizers/nelder_mead/nelder_mead.h index 662d085..36826b1 100644 --- a/optimization/optimizers/nelder_mead/nelder_mead.h +++ b/optimization/optimizers/nelder_mead/nelder_mead.h @@ -28,6 +28,8 @@ public: MatrixDN const& simplex_vertices() const { return simplex_vertices_; } VectorN const& simplex_values() const { return simplex_values_; } + // Constructs a simplex from an initial point by offset all coordinate values. + VectorD optimize(Objective& objective, VectorD const& initial_point, Scalar offset = 1); // Each row of simplex is a vertex. VectorD optimize(Objective& objective, MatrixDN const& simplex); @@ -60,6 +62,23 @@ private: static constexpr Scalar tiny_ = 1e-10; }; +//.................................................................................................. +template <typename Objective, int32_t D> +auto NelderMead<Objective, D>::optimize( + Objective& objective, + VectorD const& initial_point, + Scalar offset +) -> VectorD { + MatrixDN simplex; + simplex.resize(initial_point.size(), initial_point.size() + 1); + simplex.col(0) = initial_point; + for (uint32_t i = 0; i < initial_point.size(); ++i) { + simplex.col(i + 1) = initial_point; + simplex(i, i + 1) += offset; + } + return optimize(objective, simplex); +} + //.................................................................................................. template <typename Objective, int32_t D> auto NelderMead<Objective, D>::optimize(Objective& objective, MatrixDN const& simplex) -> VectorD { -- GitLab