LunacekBiRastriginFunction::LunacekBiRastriginFunction( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions), s_(1.0 - 0.5 / (std::sqrt(static_cast<double>(numberOfDimensions_) + 20.0) - 4.1)), mu_(std::sqrt(5.25 / s_)), parameterConditinong_(getParameterConditioning(10.0)), rotationR_(randomRotationMatrix(numberOfDimensions_)), rotationQ_(randomRotationMatrix(numberOfDimensions_)) { // A vector with all elements randomly and uniformly set to either 2 or -2. setParameterScaling(arma::zeros<arma::Col<double>>(numberOfDimensions_) + (std::bernoulli_distribution(0.5)(Rng::getGenerator()) ? 2.0 : -2.0)); #if defined(SUPPORT_MPI) MPI_Bcast(rotationR_.memptr(), static_cast<int>(rotationR_.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_); return std::min(std::pow(arma::norm(parameter_ - 2.5), 2.0), static_cast<double>(numberOfDimensions_) + s_ * std::pow(arma::norm(parameter_ + mu_), 2.0)) + 10.0 * (static_cast<double>(numberOfDimensions_) - arma::accu(arma::cos(2.0 * arma::datum::pi * rotationQ_ * (parameterConditinong_ % (rotationR_ * (parameter_ - 2.5)))))); }, "BBOB Lunacek bi-Rastrigin Function (f24)"); }
WeierstrassFunction::WeierstrassFunction( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions), parameterConditioning_(getParameterConditioning(std::sqrt(0.01))), rotationR_(randomRotationMatrix(numberOfDimensions_)), rotationQ_(randomRotationMatrix(numberOfDimensions_)) { setParameterTranslation(getRandomParameterTranslation()); #if defined(SUPPORT_MPI) MPI_Bcast(rotationR_.memptr(), static_cast<int>(rotationR_.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_); const arma::Col<double>& z = rotationR_ * (parameterConditioning_ % (rotationQ_ * getOscillatedParameter(rotationR_ * parameter_))); double sum = 0.0; for (arma::uword n = 0; n < z.n_elem; ++n) { for (arma::uword k = 0; k < 12; ++k) { sum += std::pow(0.5, k) * std::cos(2.0 * arma::datum::pi * std::pow(3.0, k) * (z(n) + 0.5)); } } return 10.0 * std::pow(sum / static_cast<double>(numberOfDimensions_) +1.99951171875, 3.0); }, "BBOB Weierstrass Function (f16)"); }
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)"); }
SharpRidgeFunction::SharpRidgeFunction( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions), parameterConditioning_(getParameterConditioning(std::sqrt(10.0))), rotationQ_(synchronise(randomRotationMatrix(numberOfDimensions_))) { if (numberOfDimensions_ < 2) { throw std::domain_error("SharpRidgeFunction: 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_); const arma::vec& z = rotationQ_ * (parameterConditioning_ % parameter_); return std::pow(z(0), 2.0) + 100.0 * arma::norm(z.tail(z.n_elem - 1)); }, "BBOB Sharp Ridge Function (f13)"}}); }
SharpRidgeFunction::SharpRidgeFunction( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions), parameterConditioning_(getParameterConditioning(std::sqrt(10.0))), rotationQ_(randomRotationMatrix(numberOfDimensions_)) { setParameterTranslation(getRandomParameterTranslation()); setParameterRotation(randomRotationMatrix(numberOfDimensions_)); #if defined(SUPPORT_MPI) 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_); const arma::Col<double>& z = rotationQ_ * (parameterConditioning_ % parameter_); return std::pow(z(0), 2.0) + 100.0 * arma::norm(z.tail(z.n_elem - 1)); }, "BBOB Sharp Ridge Function (f13)"); }
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)"}}); }
SchaffersF7Function::SchaffersF7Function( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions), parameterConditioning_(getParameterConditioning(std::sqrt(10.0))), rotationQ_(synchronise(randomRotationMatrix(numberOfDimensions_))) { if (numberOfDimensions_ < 2) { throw std::domain_error("SchaffersF7Function: 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_); const arma::vec& s = arma::square(parameterConditioning_ % (rotationQ_ * getAsymmetricParameter(0.5, parameter_))); const arma::vec& z = arma::pow(s.head(s.n_elem - 1) + s.tail(s.n_elem - 1), 0.25); return std::pow(arma::mean(z % (1.0 + arma::square(arma::sin(50.0 * arma::pow(z, 0.4))))), 2.0); }, "BBOB Schaffers F7 Function (f17)"}}); }
RastriginFunctionRotated::RastriginFunctionRotated( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions), parameterConditioning_(getParameterConditioning(std::sqrt(10.0))), rotationR_(synchronise(randomRotationMatrix(numberOfDimensions_))), rotationQ_(synchronise(randomRotationMatrix(numberOfDimensions_))) { if (numberOfDimensions_ < 2) { throw std::domain_error("RastriginFunctionRotated: The number of dimensions must be greater than 1."); } else if (!isRepresentableAsFloatingPoint(numberOfDimensions_)) { throw std::overflow_error("RastriginFunctionRotated: The number of elements must be representable as a floating point."); } setParameterTranslation(getRandomParameterTranslation()); setObjectiveFunctions({{[this]( const arma::vec& parameter_) { assert(parameter_.n_elem == numberOfDimensions_); const arma::vec& z = rotationR_ * (parameterConditioning_ % (rotationQ_ * getAsymmetricParameter(0.2, getOscillatedParameter(rotationR_ * parameter_)))); return 10.0 * (static_cast<double>(numberOfDimensions_) - arma::accu(arma::cos(2.0 * arma::datum::pi * z))) + std::pow(arma::norm(z), 2.0); }, "BBOB Rastrigin Function, rotated (f15)"}}); }
SchaffersF7FunctionIllConditioned::SchaffersF7FunctionIllConditioned( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions), parameterConditioning_(getParameterConditioning(std::sqrt(1000.0))), rotationQ_(randomRotationMatrix(numberOfDimensions_)) { setParameterTranslation(getRandomParameterTranslation()); setParameterRotation(randomRotationMatrix(numberOfDimensions_)); #if defined(SUPPORT_MPI) 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_); const arma::Col<double>& s = arma::square(parameterConditioning_ % (rotationQ_ * getAsymmetricParameter(0.5, parameter_))); const arma::Col<double>& z = arma::pow(s.head(s.n_elem - 1) + s.tail(s.n_elem - 1), 0.25); return std::pow(arma::mean(z % (1.0 + arma::square(arma::sin(50.0 * arma::pow(z, 0.4))))), 2.0); }, "BBOB Schaffers F7 Function, ill-conditioned (f18)"); }
RosenbrockFunctionRotated::RosenbrockFunctionRotated( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions), max_(std::max(1.0, std::sqrt(numberOfDimensions_) / 8.0)) { setParameterRotation(randomRotationMatrix(numberOfDimensions_)); setObjectiveFunction( [this]( const arma::Col<double>& parameter_) { assert(parameter_.n_elem == numberOfDimensions_); const arma::Col<double>& z = max_ * parameter_ + 0.5; return 100.0 * std::pow(arma::norm(arma::square(z.head(z.n_elem - 1)) - z.tail(z.n_elem - 1)), 2.0) + std::pow(arma::norm(z.head(z.n_elem - 1) - 1.0), 2.0); }, "BBOB Rosenbrock Function, rotated (f9)"); }
DifferentPowersFunction::DifferentPowersFunction( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions) { setParameterTranslation(getRandomParameterTranslation()); setParameterRotation(randomRotationMatrix(numberOfDimensions_)); setObjectiveFunction( [this]( const arma::Col<double>& parameter_) { assert(parameter_.n_elem == numberOfDimensions_); const arma::Col<double>& z = arma::abs(parameter_); return arma::norm(z % getConditionedParameter(arma::square(z))); }, "BBOB Different Powers Function (f14)"); }
CompositeGriewankRosenbrockFunctionF8F2::CompositeGriewankRosenbrockFunctionF8F2( const arma::uword numberOfDimensions) : BlackBoxOptimisationBenchmark(numberOfDimensions), max_(std::max(1.0, std::sqrt(numberOfDimensions_) / 8.0)) { setParameterRotation(randomRotationMatrix(numberOfDimensions_)); setObjectiveFunction( [this]( const arma::Col<double>& parameter_) { assert(parameter_.n_elem == numberOfDimensions_); const arma::Col<double>& s = max_ * parameter_ + 0.5; const arma::Col<double>& z = 100.0 * arma::square(arma::square(s.head(s.n_elem - 1)) - s.tail(s.n_elem - 1)) + arma::square(s.head(s.n_elem - 1) - 1.0); return 10.0 * (arma::mean(z / 4000.0 - arma::cos(z)) + 1.0); }, "BBOB Composite Griewank Rosenbrock Function F8F2 (f19)"); }