Source code for opfunu.name_based.a_func

#!/usr/bin/env python
# Created by "Thieu" at 18:47, 29/06/2022 ----------%                                                                               
#       Email: nguyenthieu2102@gmail.com            %                                                    
#       Github: https://github.com/thieu1995        %                         
# --------------------------------------------------%

import numpy as np
from opfunu.benchmark import Benchmark


[docs]class Ackley01(Benchmark): r""" .. [1] Adorio, E. MVF - "Multivariate Test Functions Library in C for Unconstrained Global Optimization", 2005 TODO: the -0.2 factor in the exponent of the first term is given as -0.02 in Jamil et al. """ name = "Ackley 01" latex_formula = r'f_{\text{Ackley01}}(x) = -20 e^{-0.2 \sqrt{\frac{1}{n} \sum_{i=1}^n x_i^2}} - e^{\frac{1}{n} \sum_{i=1}^n \cos(2 \pi x_i)} + 20 + e' latex_formula_dimension = r'd \in \mathbb{N}_{+}^{*}' latex_formula_bounds = r'x_i \in [-35, 35], \forall i \in \llbracket 1, d\rrbracket' latex_formula_global_optimum = r'f(0, ..., 0) = 0' continuous = True linear = False convex = True unimodal = False separable = False differentiable = True scalable = True randomized_term = False parametric = False modality = False # Number of ambiguous peaks, unknown # peaks def __init__(self, ndim=None, bounds=None): super().__init__() self.dim_changeable = True self.dim_default = 2 self.check_ndim_and_bounds(ndim, bounds, np.array([[-35., 35.] for _ in range(self.dim_default)])) self.f_global = 0.0 self.x_global = np.zeros(self.ndim)
[docs] def evaluate(self, x, *args): self.check_solution(x) self.n_fe += 1 u = np.sum(x ** 2) v = np.sum(np.cos(2 * np.pi * x)) return (-20. * np.exp(-0.2 * np.sqrt(u / self.ndim)) - np.exp(v / self.ndim) + 20. + np.exp(1.))
[docs]class Ackley02(Benchmark): r""" .. [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark FunctionsFor Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. """ name = "Ackley 02" latex_formula = r'f_{\text{Ackley02}(x) = -200 e^{-0.02 \sqrt{x_1^2 + x_2^2}}' latex_formula_dimension = r'd = 2' latex_formula_bounds = r'x_i \in [-32.0, 32.0], \forall i \in \llbracket 1, d\rrbracket' latex_formula_global_optimum = r'f(0, ..., 0) = -200' continuous = True linear = False convex = True unimodal = True separable = False differentiable = True scalable = False randomized_term = False parametric = False modality = False # Number of ambiguous peaks, unknown # peaks def __init__(self, ndim=None, bounds=None): super().__init__() self.dim_changeable = False self.dim_default = 2 self.check_ndim_and_bounds(ndim, bounds, np.array([[-32., 32.] for _ in range(self.dim_default)])) self.f_global = -200.0 self.x_global = np.zeros(self.ndim)
[docs] def evaluate(self, x, *args): self.check_solution(x) self.n_fe += 1 return -200 * np.exp(-0.02 * np.sqrt(x[0] ** 2 + x[1] ** 2))
[docs]class Ackley03(Benchmark): r""" .. [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark FunctionsFor Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. """ name = "Ackley 03" latex_formula = r'f_{\text{Ackley03}}(x) = -200 e^{-0.02 \sqrt{x_1^2 + x_2^2}} + 5e^{\cos(3x_1) + \sin(3x_2)}' latex_formula_dimension = r'd = 2' latex_formula_bounds = r'x_i \in [-32.0, 32.0], \forall i \in \llbracket 1, d\rrbracket' latex_formula_global_optimum = r'f(x1, x2)\approx-195.629028238419, at$$ $$x1=-0.682584587365898, and$$ $$ x2=-0.36075325513719' continuous = True linear = False convex = True unimodal = True separable = False differentiable = True scalable = False randomized_term = False parametric = False modality = False # Number of ambiguous peaks, unknown # peaks def __init__(self, ndim=None, bounds=None): super().__init__() self.dim_changeable = False self.dim_default = 2 self.check_ndim_and_bounds(ndim, bounds, np.array([[-32., 32.] for _ in range(self.dim_default)])) self.f_global = -195.62902825923879 self.x_global = np.array([-0.68255758, -0.36070859])
[docs] def evaluate(self, x, *args): self.check_solution(x) self.n_fe += 1 return -200 * np.exp(-0.02 * np.sqrt(x[0] ** 2 + x[1] ** 2)) + 5 * np.exp(np.cos(3 * x[0]) + np.sin(3 * x[1]))
[docs]class Adjiman(Benchmark): """ [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark FunctionsFor Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. """ name = "Adjiman Function" latex_formula = r'f_{\text{Adjiman}}(x) = \cos(x_1)\sin(x_2) - \frac{x_1}{(x_2^2 + 1)}' latex_formula_dimension = r'd = 2' latex_formula_bounds = r'x_1 \in [-1.0, 2.0], x_2 \in [-1., 1.]' latex_formula_global_optimum = r'f(x1, x2)\approx-2.02181, at$$ $$x1=2.0, and$$ $$ x2=0.10578' continuous = True linear = False convex = True unimodal = False separable = False differentiable = True scalable = False randomized_term = False parametric = False modality = False # Number of ambiguous peaks, unknown # peaks def __init__(self, ndim=None, bounds=None): super().__init__() self.dim_changeable = False self.dim_default = 2 self.check_ndim_and_bounds(ndim, bounds, np.array([[-1.0, 2.0], [-1.0, 1.0]])) self.f_global = -2.02180678 self.x_global = np.array([2.0, 0.10578])
[docs] def evaluate(self, x, *args): self.check_solution(x) self.n_fe += 1 return np.cos(x[0]) * np.sin(x[1]) - x[0] / (x[1] ** 2 + 1)
[docs]class Alpine01(Benchmark): """ [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark FunctionsFor Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. """ name = "Alpine01 Function" latex_formula = r'f_{\text{Alpine01}}(x) = \sum_{i=1}^{n} \lvert {x_i \sin \left( x_i\right) + 0.1 x_i} \rvert' latex_formula_dimension = r'd \in \mathbb{N}_{+}^{*}' latex_formula_bounds = r'x_i \in [-10.0, 10.0], \forall i \in \llbracket 1, d\rrbracket' latex_formula_global_optimum = r'f(x*)\approx 0, at$$ $$x*=0.0' continuous = True linear = False convex = True unimodal = False separable = True differentiable = False scalable = False randomized_term = False parametric = False modality = False # Number of ambiguous peaks, unknown # peaks def __init__(self, ndim=None, bounds=None): super().__init__() self.dim_changeable = True self.dim_default = 2 self.check_ndim_and_bounds(ndim, bounds, np.array([[-10., 10.] for _ in range(self.dim_default)])) self.f_global = 0.0 self.x_global = np.zeros(self.ndim)
[docs] def evaluate(self, x, *args): self.check_solution(x) self.n_fe += 1 return np.sum(np.abs(x * np.sin(x) + 0.1 * x))
[docs]class Alpine02(Benchmark): """ [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark FunctionsFor Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. """ name = "Alpine02 Function" latex_formula = r'f_{\text{Alpine02}(x) = \prod_{i=1}^{n} \sqrt{x_i} \sin(x_i)' latex_formula_dimension = r'd \in \mathbb{N}_{+}^{*}' latex_formula_bounds = r'x_i \in [0., 10.0], \forall i \in \llbracket 1, d\rrbracket' latex_formula_global_optimum = r'f(x*)\approx -6.12950, at$$ $$x_1=7.91705268, x_2=4.81584232' continuous = True linear = False convex = True unimodal = False separable = True differentiable = True scalable = True randomized_term = False parametric = False modality = False # Number of ambiguous peaks, unknown # peaks def __init__(self, ndim=None, bounds=None): super().__init__() self.dim_changeable = True self.dim_default = 2 self.check_ndim_and_bounds(ndim, bounds, np.array([[0., 10.] for _ in range(self.dim_default)])) self.f_global = -6.12950 self.x_global = np.array([7.91705268, 4.81584232] + list(np.random.uniform(0, 10, self.ndim-2)))
[docs] def evaluate(self, x, *args): self.check_solution(x) self.n_fe += 1 return np.prod(np.sqrt(x) * np.sin(x))
[docs]class AMGM(Benchmark): """ [1] The AMGM (Arithmetic Mean - Geometric Mean Equality). [2] Gavana, A. Global Optimization Benchmarks and AMPGO, retrieved 2015 """ name = "AMGM Function" latex_formula = r'f_{\text{AMGM}}(x) = \left ( \frac{1}{n} \sum_{i=1}^{n} x_i - \sqrt[n]{ \prod_{i=1}^{n} x_i} \right )^2' latex_formula_dimension = r'd \in \mathbb{N}_{+}^{*}' latex_formula_bounds = r'x_i \in [0., 10.0], \forall i \in \llbracket 1, d\rrbracket' latex_formula_global_optimum = r'f(x*)\approx 0, at$$ $$x_1=x_2=...=x_n' continuous = True linear = False convex = True unimodal = False separable = False differentiable = False scalable = True randomized_term = False parametric = False modality = False # Number of ambiguous peaks, unknown # peaks def __init__(self, ndim=None, bounds=None): super().__init__() self.dim_changeable = True self.dim_default = 2 self.check_ndim_and_bounds(ndim, bounds, np.array([[0., 10.] for _ in range(self.dim_default)])) self.f_global = 0.0 self.x_global = np.ones(self.ndim)
[docs] def evaluate(self, x, *args): self.check_solution(x) self.n_fe += 1 f1 = np.sum(x) / self.ndim f2 = np.prod(x) ** (1.0 / self.ndim) return (f1 - f2) ** 2