本文整理汇总了C++中T2::objective_function方法的典型用法代码示例。如果您正苦于以下问题:C++ T2::objective_function方法的具体用法?C++ T2::objective_function怎么用?C++ T2::objective_function使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类T2
的用法示例。
在下文中一共展示了T2::objective_function方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: optimise
optimise_result<T1, N> optimise(
const T2<T1, N>& problem,
const T3<T1, N>& optimiser,
std::vector<std::array<T1, N>> initial_parameters) {
static_assert(std::is_floating_point<T1>::value, "");
static_assert(N > 0, "");
static_assert(std::is_base_of<mant::problem<T1, N>, T2<T1, N>>::value, "");
static_assert(std::is_base_of<mant::optimiser<T1, N>, T3<T1, N>>::value, "");
assert(static_cast<bool>(problem.objective_function));
assert(static_cast<bool>(optimiser.optimisation_function));
assert(initial_parameters.size() > 0);
// Maps the parameter's bounds from [*problem.lower_bounds*, *problem.upper_bounds*] to [0, 1] and places all active dimensions (in-order) upfront.
for (auto& parameter : initial_parameters) {
for (std::size_t n = 0; n < optimiser.active_dimensions.size(); ++n) {
parameter.at(n) = (
parameter.at(optimiser.active_dimensions.at(n)) -
problem.lower_bounds.at(n)
) / (problem.upper_bounds.at(n) - problem.lower_bounds.at(n));
}
}
mant::problem<T1, N> mapped_problem;
mapped_problem.objective_function = [&problem, &optimiser](const auto& parameter) {
std::array<T1, N> mapped_parameter = problem.lower_bounds;
for (std::size_t n = optimiser.active_dimensions.size(); n > 0; --n) {
mapped_parameter.at(optimiser.active_dimensions.at(n - 1)) =
problem.lower_bounds.at(n - 1) +
parameter.at(n - 1) * (
problem.upper_bounds.at(n - 1) - problem.lower_bounds.at(n - 1)
);
}
return problem.objective_function(mapped_parameter);
};
assert(std::all_of(
mapped_problem.lower_bounds.cbegin(), std::next(mapped_problem.lower_bounds.cbegin(), optimiser.active_dimensions.size()),
std::bind(std::equal_to<T1>{}, std::placeholders::_1, T1(0.0))
));
assert(std::all_of(
mapped_problem.upper_bounds.cbegin(), std::next(mapped_problem.upper_bounds.cbegin(), optimiser.active_dimensions.size()),
std::bind(std::equal_to<T1>{}, std::placeholders::_1, T1(1.0))
));
auto&& result = optimiser.optimisation_function(mapped_problem, initial_parameters);
// Remaps the parameter's bounds back from [0, 1] to [*lower_bounds*, *upper_bounds*] and permutes the parameter to match the active dimensions.
for (std::size_t n = optimiser.active_dimensions.size(); n > 0; --n) {
result.parameter.at(optimiser.active_dimensions.at(n - 1)) =
problem.lower_bounds.at(n - 1) +
result.parameter.at(n - 1) * (
problem.upper_bounds.at(n - 1) - problem.lower_bounds.at(n - 1)
);
}
return result;
}