# -*- coding: utf-8 -*- from numpy import (abs, sum, sin, cos, sqrt, log, prod, where, pi, exp, arange, floor, log10, atleast_2d, zeros) from .go_benchmark import Benchmark class Parsopoulos(Benchmark): r""" Parsopoulos objective function. This class defines the Parsopoulos [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Parsopoulos}}(x) = \cos(x_1)^2 + \sin(x_2)^2 with :math:`x_i \in [-5, 5]` for :math:`i = 1, 2`. *Global optimum*: This function has infinite number of global minima in R2, at points :math:`\left(k\frac{\pi}{2}, \lambda \pi \right)`, where :math:`k = \pm1, \pm3, ...` and :math:`\lambda = 0, \pm1, \pm2, ...` In the given domain problem, function has 12 global minima all equal to zero. .. [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark Functions For Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-5.0] * self.N, [5.0] * self.N)) self.global_optimum = [[pi / 2.0, pi]] self.fglob = 0 def fun(self, x, *args): self.nfev += 1 return cos(x[0]) ** 2.0 + sin(x[1]) ** 2.0 class Pathological(Benchmark): r""" Pathological objective function. This class defines the Pathological [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Pathological}}(x) = \sum_{i=1}^{n -1} \frac{\sin^{2}\left( \sqrt{100 x_{i+1}^{2} + x_{i}^{2}}\right) -0.5}{0.001 \left(x_{i}^{2} - 2x_{i}x_{i+1} + x_{i+1}^{2}\right)^{2} + 0.50} Here, :math:`n` represents the number of dimensions and :math:`x_i \in [-100, 100]` for :math:`i = 1, 2`. *Global optimum*: :math:`f(x) = 0.` for :math:`x = [0, 0]` for :math:`i = 1, 2` .. [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark Functions For Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-100.0] * self.N, [100.0] * self.N)) self.global_optimum = [[0 for _ in range(self.N)]] self.fglob = 0. def fun(self, x, *args): self.nfev += 1 vec = (0.5 + (sin(sqrt(100 * x[: -1] ** 2 + x[1:] ** 2)) ** 2 - 0.5) / (1. + 0.001 * (x[: -1] ** 2 - 2 * x[: -1] * x[1:] + x[1:] ** 2) ** 2)) return sum(vec) class Paviani(Benchmark): r""" Paviani objective function. This class defines the Paviani [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Paviani}}(x) = \sum_{i=1}^{10} \left[\log^{2}\left(10 - x_i\right) + \log^{2}\left(x_i -2\right)\right] - \left(\prod_{i=1}^{10} x_i^{10} \right)^{0.2} with :math:`x_i \in [2.001, 9.999]` for :math:`i = 1, ... , 10`. *Global optimum*: :math:`f(x_i) = -45.7784684040686` for :math:`x_i = 9.350266` for :math:`i = 1, ..., 10` .. [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark Functions For Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. TODO: think Gavana web/code definition is wrong because final product term shouldn't raise x to power 10. """ def __init__(self, dimensions=10): Benchmark.__init__(self, dimensions) self._bounds = list(zip([2.001] * self.N, [9.999] * self.N)) self.global_optimum = [[9.350266 for _ in range(self.N)]] self.fglob = -45.7784684040686 def fun(self, x, *args): self.nfev += 1 return sum(log(x - 2) ** 2.0 + log(10.0 - x) ** 2.0) - prod(x) ** 0.2 class Penalty01(Benchmark): r""" Penalty 1 objective function. This class defines the Penalty 1 [1]_ global optimization problem. This is a imultimodal minimization problem defined as follows: .. math:: f_{\text{Penalty01}}(x) = \frac{\pi}{30} \left\{10 \sin^2(\pi y_1) + \sum_{i=1}^{n-1} (y_i - 1)^2 \left[1 + 10 \sin^2(\pi y_{i+1}) \right] + (y_n - 1)^2 \right \} + \sum_{i=1}^n u(x_i, 10, 100, 4) Where, in this exercise: .. math:: y_i = 1 + \frac{1}{4}(x_i + 1) And: .. math:: u(x_i, a, k, m) = \begin{cases} k(x_i - a)^m & \textrm{if} \hspace{5pt} x_i > a \\ 0 & \textrm{if} \hspace{5pt} -a \leq x_i \leq a \\ k(-x_i - a)^m & \textrm{if} \hspace{5pt} x_i < -a \end{cases} Here, :math:`n` represents the number of dimensions and :math:`x_i \in [-50, 50]` for :math:`i= 1, ..., n`. *Global optimum*: :math:`f(x) = 0` for :math:`x_i = -1` for :math:`i = 1, ..., n` .. [1] Gavana, A. Global Optimization Benchmarks and AMPGO retrieved 2015 """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-50.0] * self.N, [50.0] * self.N)) self.custom_bounds = ([-5.0, 5.0], [-5.0, 5.0]) self.global_optimum = [[-1.0 for _ in range(self.N)]] self.fglob = 0.0 self.change_dimensionality = True def fun(self, x, *args): self.nfev += 1 a, b, c = 10.0, 100.0, 4.0 xx = abs(x) u = where(xx > a, b * (xx - a) ** c, 0.0) y = 1.0 + (x + 1.0) / 4.0 return (sum(u) + (pi / 30.0) * (10.0 * sin(pi * y[0]) ** 2.0 + sum((y[: -1] - 1.0) ** 2.0 * (1.0 + 10.0 * sin(pi * y[1:]) ** 2.0)) + (y[-1] - 1) ** 2.0)) class Penalty02(Benchmark): r""" Penalty 2 objective function. This class defines the Penalty 2 [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Penalty02}}(x) = 0.1 \left\{\sin^2(3\pi x_1) + \sum_{i=1}^{n-1} (x_i - 1)^2 \left[1 + \sin^2(3\pi x_{i+1}) \right ] + (x_n - 1)^2 \left [1 + \sin^2(2 \pi x_n) \right ]\right \} + \sum_{i=1}^n u(x_i, 5, 100, 4) Where, in this exercise: .. math:: u(x_i, a, k, m) = \begin{cases} k(x_i - a)^m & \textrm{if} \hspace{5pt} x_i > a \\ 0 & \textrm{if} \hspace{5pt} -a \leq x_i \leq a \\ k(-x_i - a)^m & \textrm{if} \hspace{5pt} x_i < -a \\ \end{cases} Here, :math:`n` represents the number of dimensions and :math:`x_i \in [-50, 50]` for :math:`i = 1, ..., n`. *Global optimum*: :math:`f(x) = 0` for :math:`x_i = 1` for :math:`i = 1, ..., n` .. [1] Gavana, A. Global Optimization Benchmarks and AMPGO retrieved 2015 """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-50.0] * self.N, [50.0] * self.N)) self.custom_bounds = ([-4.0, 4.0], [-4.0, 4.0]) self.global_optimum = [[1.0 for _ in range(self.N)]] self.fglob = 0.0 self.change_dimensionality = True def fun(self, x, *args): self.nfev += 1 a, b, c = 5.0, 100.0, 4.0 xx = abs(x) u = where(xx > a, b * (xx - a) ** c, 0.0) return (sum(u) + 0.1 * (10 * sin(3.0 * pi * x[0]) ** 2.0 + sum((x[:-1] - 1.0) ** 2.0 * (1.0 + sin(3 * pi * x[1:]) ** 2.0)) + (x[-1] - 1) ** 2.0 * (1 + sin(2 * pi * x[-1]) ** 2.0))) class PenHolder(Benchmark): r""" PenHolder objective function. This class defines the PenHolder [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{PenHolder}}(x) = -e^{\left|{e^{-\left|{- \frac{\sqrt{x_{1}^{2} + x_{2}^{2}}}{\pi} + 1}\right|} \cos\left(x_{1}\right) \cos\left(x_{2}\right)}\right|^{-1}} with :math:`x_i \in [-11, 11]` for :math:`i = 1, 2`. *Global optimum*: :math:`f(x_i) = -0.9635348327265058` for :math:`x_i = \pm 9.646167671043401` for :math:`i = 1, 2` .. [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark Functions For Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-11.0] * self.N, [11.0] * self.N)) self.global_optimum = [[-9.646167708023526, 9.646167671043401]] self.fglob = -0.9635348327265058 def fun(self, x, *args): self.nfev += 1 a = abs(1. - (sqrt(x[0] ** 2 + x[1] ** 2) / pi)) b = cos(x[0]) * cos(x[1]) * exp(a) return -exp(-abs(b) ** -1) class PermFunction01(Benchmark): r""" PermFunction 1 objective function. This class defines the PermFunction1 [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{PermFunction01}}(x) = \sum_{k=1}^n \left\{ \sum_{j=1}^n (j^k + \beta) \left[ \left(\frac{x_j}{j}\right)^k - 1 \right] \right\}^2 Here, :math:`n` represents the number of dimensions and :math:`x_i \in [-n, n + 1]` for :math:`i = 1, ..., n`. *Global optimum*: :math:`f(x) = 0` for :math:`x_i = i` for :math:`i = 1, ..., n` .. [1] Mishra, S. Global Optimization by Differential Evolution and Particle Swarm Methods: Evaluation on Some Benchmark Functions. Munich Personal RePEc Archive, 2006, 1005 TODO: line 560 """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-self.N] * self.N, [self.N + 1] * self.N)) self.global_optimum = [list(range(1, self.N + 1))] self.fglob = 0.0 self.change_dimensionality = True def fun(self, x, *args): self.nfev += 1 b = 0.5 k = atleast_2d(arange(self.N) + 1).T j = atleast_2d(arange(self.N) + 1) s = (j ** k + b) * ((x / j) ** k - 1) return sum((sum(s, axis=1) ** 2)) class PermFunction02(Benchmark): r""" PermFunction 2 objective function. This class defines the Perm Function 2 [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{PermFunction02}}(x) = \sum_{k=1}^n \left\{ \sum_{j=1}^n (j + \beta) \left[ \left(x_j^k - {\frac{1}{j}}^{k} \right ) \right] \right\}^2 Here, :math:`n` represents the number of dimensions and :math:`x_i \in [-n, n+1]` for :math:`i = 1, ..., n`. *Global optimum*: :math:`f(x) = 0` for :math:`x_i = \frac{1}{i}` for :math:`i = 1, ..., n` .. [1] Mishra, S. Global Optimization by Differential Evolution and Particle Swarm Methods: Evaluation on Some Benchmark Functions. Munich Personal RePEc Archive, 2006, 1005 TODO: line 582 """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-self.N] * self.N, [self.N + 1] * self.N)) self.custom_bounds = ([0, 1.5], [0, 1.0]) self.global_optimum = [1. / arange(1, self.N + 1)] self.fglob = 0.0 self.change_dimensionality = True def fun(self, x, *args): self.nfev += 1 b = 10 k = atleast_2d(arange(self.N) + 1).T j = atleast_2d(arange(self.N) + 1) s = (j + b) * (x ** k - (1. / j) ** k) return sum((sum(s, axis=1) ** 2)) class Pinter(Benchmark): r""" Pinter objective function. This class defines the Pinter [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Pinter}}(x) = \sum_{i=1}^n ix_i^2 + \sum_{i=1}^n 20i \sin^2 A + \sum_{i=1}^n i \log_{10} (1 + iB^2) Where, in this exercise: .. math:: \begin{cases} A = x_{i-1} \sin x_i + \sin x_{i+1} \\ B = x_{i-1}^2 - 2x_i + 3x_{i + 1} - \cos x_i + 1\\ \end{cases} Where :math:`x_0 = x_n` and :math:`x_{n + 1} = x_1`. Here, :math:`n` represents the number of dimensions and :math:`x_i \in [-10, 10]` for :math:`i = 1, ..., n`. *Global optimum*: :math:`f(x) = 0` for :math:`x_i = 0` for :math:`i = 1, ..., n` .. [1] Jamil, M. & Yang, X.-S. A Literature Survey of Benchmark Functions For Global Optimization Problems Int. Journal of Mathematical Modelling and Numerical Optimisation, 2013, 4, 150-194. """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-10.0] * self.N, [10.0] * self.N)) self.global_optimum = [[0.0 for _ in range(self.N)]] self.fglob = 0.0 self.change_dimensionality = True def fun(self, x, *args): self.nfev += 1 i = arange(self.N) + 1 xx = zeros(self.N + 2) xx[1: - 1] = x xx[0] = x[-1] xx[-1] = x[0] A = xx[0: -2] * sin(xx[1: - 1]) + sin(xx[2:]) B = xx[0: -2] ** 2 - 2 * xx[1: - 1] + 3 * xx[2:] - cos(xx[1: - 1]) + 1 return (sum(i * x ** 2) + sum(20 * i * sin(A) ** 2) + sum(i * log10(1 + i * B ** 2))) class Plateau(Benchmark): r""" Plateau objective function. This class defines the Plateau [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Plateau}}(x) = 30 + \sum_{i=1}^n \lfloor \lvert x_i \rvert\rfloor Here, :math:`n` represents the number of dimensions and :math:`x_i \in [-5.12, 5.12]` for :math:`i = 1, ..., n`. *Global optimum*: :math:`f(x) = 30` for :math:`x_i = 0` for :math:`i = 1, ..., n` .. [1] Gavana, A. Global Optimization Benchmarks and AMPGO retrieved 2015 """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-5.12] * self.N, [5.12] * self.N)) self.global_optimum = [[0.0 for _ in range(self.N)]] self.fglob = 30.0 self.change_dimensionality = True def fun(self, x, *args): self.nfev += 1 return 30.0 + sum(floor(abs(x))) class Powell(Benchmark): r""" Powell objective function. This class defines the Powell [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Powell}}(x) = (x_3+10x_1)^2 + 5(x_2-x_4)^2 + (x_1-2x_2)^4 + 10(x_3-x_4)^4 Here, :math:`n` represents the number of dimensions and :math:`x_i \in [-4, 5]` for :math:`i = 1, ..., 4`. *Global optimum*: :math:`f(x) = 0` for :math:`x_i = 0` for :math:`i = 1, ..., 4` ..[1] Powell, M. An iterative method for finding stationary values of a function of several variables Computer Journal, 1962, 5, 147-151 """ def __init__(self, dimensions=4): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-4.0] * self.N, [5.0] * self.N)) self.global_optimum = [[0, 0, 0, 0]] self.fglob = 0 def fun(self, x, *args): self.nfev += 1 return ((x[0] + 10 * x[1]) ** 2 + 5 * (x[2] - x[3]) ** 2 + (x[1] - 2 * x[2]) ** 4 + 10 * (x[0] - x[3]) ** 4) class PowerSum(Benchmark): r""" Power sum objective function. This class defines the Power Sum global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{PowerSum}}(x) = \sum_{k=1}^n\left[\left(\sum_{i=1}^n x_i^k \right) - b_k \right]^2 Where, in this exercise, :math:`b = [8, 18, 44, 114]` Here, :math:`x_i \in [0, 4]` for :math:`i = 1, ..., 4`. *Global optimum*: :math:`f(x) = 0` for :math:`x = [1, 2, 2, 3]` .. [1] Gavana, A. Global Optimization Benchmarks and AMPGO retrieved 2015 """ def __init__(self, dimensions=4): Benchmark.__init__(self, dimensions) self._bounds = list(zip([0.0] * self.N, [4.0] * self.N)) self.global_optimum = [[1.0, 2.0, 2.0, 3.0]] self.fglob = 0.0 def fun(self, x, *args): self.nfev += 1 b = [8.0, 18.0, 44.0, 114.0] k = atleast_2d(arange(self.N) + 1).T return sum((sum(x ** k, axis=1) - b) ** 2) class Price01(Benchmark): r""" Price 1 objective function. This class defines the Price 1 [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Price01}}(x) = (\lvert x_1 \rvert - 5)^2 + (\lvert x_2 \rvert - 5)^2 with :math:`x_i \in [-500, 500]` for :math:`i = 1, 2`. *Global optimum*: :math:`f(x_i) = 0.0` for :math:`x = [5, 5]` or :math:`x = [5, -5]` or :math:`x = [-5, 5]` or :math:`x = [-5, -5]`. .. [1] Price, W. A controlled random search procedure for global optimisation Computer Journal, 1977, 20, 367-370 """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-500.0] * self.N, [500.0] * self.N)) self.custom_bounds = ([-10.0, 10.0], [-10.0, 10.0]) self.global_optimum = [[5.0, 5.0]] self.fglob = 0.0 def fun(self, x, *args): self.nfev += 1 return (abs(x[0]) - 5.0) ** 2.0 + (abs(x[1]) - 5.0) ** 2.0 class Price02(Benchmark): r""" Price 2 objective function. This class defines the Price 2 [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Price02}}(x) = 1 + \sin^2(x_1) + \sin^2(x_2) - 0.1e^{(-x_1^2 - x_2^2)} with :math:`x_i \in [-10, 10]` for :math:`i = 1, 2`. *Global optimum*: :math:`f(x) = 0.9` for :math:`x_i = [0, 0]` .. [1] Price, W. A controlled random search procedure for global optimisation Computer Journal, 1977, 20, 367-370 """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-10.0] * self.N, [10.0] * self.N)) self.global_optimum = [[0.0, 0.0]] self.fglob = 0.9 def fun(self, x, *args): self.nfev += 1 return 1.0 + sum(sin(x) ** 2) - 0.1 * exp(-x[0] ** 2.0 - x[1] ** 2.0) class Price03(Benchmark): r""" Price 3 objective function. This class defines the Price 3 [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Price03}}(x) = 100(x_2 - x_1^2)^2 + \left[6.4(x_2 - 0.5)^2 - x_1 - 0.6 \right]^2 with :math:`x_i \in [-50, 50]` for :math:`i = 1, 2`. *Global optimum*: :math:`f(x) = 0` for :math:`x = [-5, -5]`, :math:`x = [-5, 5]`, :math:`x = [5, -5]`, :math:`x = [5, 5]`. .. [1] Price, W. A controlled random search procedure for global optimisation Computer Journal, 1977, 20, 367-370 TODO Jamil #96 has an erroneous factor of 6 in front of the square brackets """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-5.0] * self.N, [5.0] * self.N)) self.custom_bounds = ([0, 2], [0, 2]) self.global_optimum = [[1.0, 1.0]] self.fglob = 0.0 def fun(self, x, *args): self.nfev += 1 return (100 * (x[1] - x[0] ** 2) ** 2 + (6.4 * (x[1] - 0.5) ** 2 - x[0] - 0.6) ** 2) class Price04(Benchmark): r""" Price 4 objective function. This class defines the Price 4 [1]_ global optimization problem. This is a multimodal minimization problem defined as follows: .. math:: f_{\text{Price04}}(x) = (2 x_1^3 x_2 - x_2^3)^2 + (6 x_1 - x_2^2 + x_2)^2 with :math:`x_i \in [-50, 50]` for :math:`i = 1, 2`. *Global optimum*: :math:`f(x) = 0` for :math:`x = [0, 0]`, :math:`x = [2, 4]` and :math:`x = [1.464, -2.506]` .. [1] Price, W. A controlled random search procedure for global optimisation Computer Journal, 1977, 20, 367-370 """ def __init__(self, dimensions=2): Benchmark.__init__(self, dimensions) self._bounds = list(zip([-50.0] * self.N, [50.0] * self.N)) self.custom_bounds = ([0, 2], [0, 2]) self.global_optimum = [[2.0, 4.0]] self.fglob = 0.0 def fun(self, x, *args): self.nfev += 1 return ((2.0 * x[1] * x[0] ** 3.0 - x[1] ** 3.0) ** 2.0 + (6.0 * x[0] - x[1] ** 2.0 + x[1]) ** 2.0)