GallaghersGaussian21hiPeaksFunction::GallaghersGaussian21hiPeaksFunction(
        const arma::uword numberOfDimensions)
        : BlackBoxOptimisationBenchmark(numberOfDimensions),
          weight_(arma::join_cols(arma::Col<double>({10.0}), arma::linspace<arma::Col<double>>(1.1, 9.1, 20))),
          localParameterConditionings_(getRandomLocalParameterHighConditionings(21)),
          localParameterTranslations_(arma::randu<arma::Mat<double>>(numberOfDimensions_, 21) * 9.8 - 4.9),
          rotationQ_(randomRotationMatrix(numberOfDimensions_)) {
      localParameterTranslations_.col(0) = 0.8 * localParameterTranslations_.col(0);

#if defined(SUPPORT_MPI)
      MPI_Bcast(localParameterConditionings_.memptr(), static_cast<int>(localParameterConditionings_.n_elem), MPI_DOUBLE, 0, MPI_COMM_WORLD);
      MPI_Bcast(localParameterTranslations_.memptr(), static_cast<int>(localParameterTranslations_.n_elem), MPI_DOUBLE, 0, MPI_COMM_WORLD);
      MPI_Bcast(rotationQ_.memptr(), static_cast<int>(rotationQ_.n_elem), MPI_DOUBLE, 0, MPI_COMM_WORLD);
#endif

      setObjectiveFunction(
          [this](
              const arma::Col<double>& parameter_) {
            assert(parameter_.n_elem == numberOfDimensions_);
              
            double maximalValue = std::numeric_limits<double>::lowest();
            for (arma::uword n = 0; n < 21; ++n) {
              const arma::Col<double>& localParameterTranslation = parameter_ - localParameterTranslations_.col(n);
              maximalValue = std::max(maximalValue, weight_(n) * std::exp(-0.5 / static_cast<double>(numberOfDimensions_) * arma::dot(localParameterTranslation, rotationQ_.t() * arma::diagmat(localParameterConditionings_.col(n)) * rotationQ_ * localParameterTranslation)));
            }

            return std::pow(getOscillatedValue(10.0 - maximalValue), 2.0);
          },
          "BBOB Gallagher's Gaussian 21-hi Peaks Function (f22)");
    }
Пример #2
0
    double AttractiveSectorFunction::getObjectiveValueImplementation(
        const arma::Col<double>& parameter) const {
      assert(parameter.n_elem == numberOfDimensions_);

      arma::Col<double> z = rotationQ_ * (parameterConditioning_ % parameter);
      z.elem(arma::find(z % parameterTranslation_ > 0.0)) *= 100.0;

      return std::pow(getOscillatedValue(std::pow(arma::norm(z), 2.0)), 0.9);
    }
    arma::Col<double> BlackBoxOptimisationBenchmark::getOscillatedParameter(
        const arma::Col<double>& parameter) const {
      arma::Col<double> oscillatedParameter(parameter.n_elem);

      for (arma::uword n = 0; n < parameter.n_elem; ++n) {
        oscillatedParameter(n) = getOscillatedValue(parameter(n));
      }

      return oscillatedParameter;
    }
    double GallaghersGaussian101mePeaksFunction::getObjectiveValueImplementation(
        const arma::Col<double>& parameter) const {
      assert(parameter.n_elem == numberOfDimensions_);

      double maximalValue = std::numeric_limits<double>::lowest();
      for (arma::uword n = 0; n < 101; ++n) {
        const arma::Col<double>& locallyTranslatedParameter = parameter - localParameterTranslations_.col(n);
        maximalValue = std::max(maximalValue, weight_(n) * std::exp(-0.5 / static_cast<double>(numberOfDimensions_) * arma::dot(locallyTranslatedParameter, rotationQ_.t() * arma::diagmat(localParameterConditionings_.col(n)) * rotationQ_ * locallyTranslatedParameter)));
      }

      return std::pow(getOscillatedValue(10.0 - maximalValue), 2.0);
    }
Пример #5
0
    AttractiveSectorFunction::AttractiveSectorFunction(
        const arma::uword numberOfDimensions)
        : BlackBoxOptimisationBenchmark(numberOfDimensions),
          parameterConditioning_(getParameterConditioning(std::sqrt(10.0))),
          rotationQ_(synchronise(randomRotationMatrix(numberOfDimensions_))) {
      if (numberOfDimensions_ < 2) {
        throw std::domain_error("AttractiveSectorFunction: The number of dimensions must be greater than 1.");
      }

      setParameterTranslation(getRandomParameterTranslation());
      setParameterRotation(randomRotationMatrix(numberOfDimensions_));

      setObjectiveFunctions({{[this](
                                  const arma::vec& parameter_) {
                                assert(parameter_.n_elem == numberOfDimensions_);

                                arma::vec z = rotationQ_ * (parameterConditioning_ % parameter_);
                                z.elem(arma::find(z % parameterTranslation_ > 0.0)) *= 100.0;

                                return std::pow(getOscillatedValue(std::pow(arma::norm(z), 2.0)), 0.9);
                              },
          "BBOB Attractive Sector Function (f6)"}});
    }