当前位置: 首页>>代码示例>>C++>>正文


C++ T2::objective_function方法代码示例

本文整理汇总了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;
}
开发者ID:SebastianNiemann,项目名称:Mantella,代码行数:58,代码来源:optimise.hpp


注:本文中的T2::objective_function方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。