Skip to content

TFiFiE/nelder_mead

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Example usage:

#include "nelder_mead.hpp"
#include <iostream>

template<class Number> inline Number square(const Number number) { return number * number; }

template<class Number> struct Rosenbrock {
  Number operator()(const std::vector<Number>& input) const
  {
    return square(1 - input[0]) + 100 * square(input[1] - square(input[0]));
  }
};

template<class Number> struct Himmelblau {
  Number operator()(const std::vector<Number>& input,
                    const typename NelderMead<Number>::Step) const
  {
    return square(square(input[0]) + input[1] - 11) + square(input[0] + square(input[1]) - 7);
  }
};

template<class Number, class Generator, class Function>
void find_optimum(Generator& generator, Function function)
{
  const auto simplex = NelderMead<Number>::random_polytope(generator, {{{-4, 4}, {-4, 4}}});
  auto nelder_mead = NelderMead<Number>::create(function, simplex);

  while (true) {
    const auto old_worst = *nelder_mead.worst;
    nelder_mead.iteration(function);
    if (old_worst == *nelder_mead.worst)
      break;
  }

  const auto result = *nelder_mead.best;
  std::cout << result.first[0] << ',' << result.first[1] << ':' << result.second << '\n';
}

int main()
{
  std::mt19937 generator((std::random_device())());
  typedef long double Number;
  find_optimum<Number>(generator, Rosenbrock<Number>());
  find_optimum<Number>(generator, Himmelblau<Number>());
}

About

Nelder-Mead simplex algorithm as implemented in free-to-use C++11 header file

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages