#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>());
}
-
Notifications
You must be signed in to change notification settings - Fork 0
Nelder-Mead simplex algorithm as implemented in free-to-use C++11 header file
License
TFiFiE/nelder_mead
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
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 0
No packages published