thursday/thursday/external/go_benchmark_functions/go_funcs_A.py

280 lines
7.8 KiB
Python

# -*- coding: utf-8 -*-
from numpy import abs, cos, exp, pi, prod, sin, sqrt, sum
from .go_benchmark import Benchmark
class Ackley01(Benchmark):
r"""
Ackley01 objective function.
The Ackley01 [1]_ global optimization problem is a multimodal minimization
problem defined as follows:
.. math::
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
Here, :math:`n` represents the number of dimensions and :math:`x_i \in
[-35, 35]` for :math:`i = 1, ..., n`.
*Global optimum*: :math:`f(x) = 0` for :math:`x_i = 0` for
:math:`i = 1, ..., n`
.. [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.
"""
def __init__(self, dimensions=2):
Benchmark.__init__(self, dimensions)
self._bounds = list(zip([-35.0] * self.N, [35.0] * self.N))
self.global_optimum = [[0 for _ in range(self.N)]]
self.fglob = 0.0
self.change_dimensionality = True
def fun(self, x, *args):
self.nfev += 1
u = sum(x ** 2)
v = sum(cos(2 * pi * x))
return (-20. * exp(-0.2 * sqrt(u / self.N))
- exp(v / self.N) + 20. + exp(1.))
class Ackley02(Benchmark):
r"""
Ackley02 objective function.
The Ackley02 [1]_ global optimization problem is a multimodal minimization
problem defined as follows:
.. math::
f_{\text{Ackley02}(x) = -200 e^{-0.02 \sqrt{x_1^2 + x_2^2}}
with :math:`x_i \in [-32, 32]` for :math:`i=1, 2`.
*Global optimum*: :math:`f(x) = -200` for :math:`x = [0, 0]`
.. [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([-32.0] * self.N, [32.0] * self.N))
self.global_optimum = [[0 for _ in range(self.N)]]
self.fglob = -200.
def fun(self, x, *args):
self.nfev += 1
return -200 * exp(-0.02 * sqrt(x[0] ** 2 + x[1] ** 2))
class Ackley03(Benchmark):
r"""
Ackley03 [1]_ objective function.
The Ackley03 global optimization problem is a multimodal minimization
problem defined as follows:
.. math::
f_{\text{Ackley03}}(x) = -200 e^{-0.02 \sqrt{x_1^2 + x_2^2}} +
5e^{\cos(3x_1) + \sin(3x_2)}
with :math:`x_i \in [-32, 32]` for :math:`i=1, 2`.
*Global optimum*: :math:`f(x) = -195.62902825923879` for :math:`x
= [-0.68255758, -0.36070859]`
.. [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: I think the minus sign is missing in front of the first term in eqn3
in [1]_. This changes the global minimum
"""
def __init__(self, dimensions=2):
Benchmark.__init__(self, dimensions)
self._bounds = list(zip([-32.0] * self.N, [32.0] * self.N))
self.global_optimum = [[-0.68255758, -0.36070859]]
self.fglob = -195.62902825923879
def fun(self, x, *args):
self.nfev += 1
a = -200 * exp(-0.02 * sqrt(x[0] ** 2 + x[1] ** 2))
a += 5 * exp(cos(3 * x[0]) + sin(3 * x[1]))
return a
class Adjiman(Benchmark):
r"""
Adjiman objective function.
The Adjiman [1]_ global optimization problem is a multimodal minimization
problem defined as follows:
.. math::
f_{\text{Adjiman}}(x) = \cos(x_1)\sin(x_2) - \frac{x_1}{(x_2^2 + 1)}
with, :math:`x_1 \in [-1, 2]` and :math:`x_2 \in [-1, 1]`.
*Global optimum*: :math:`f(x) = -2.02181` for :math:`x = [2.0, 0.10578]`
.. [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 = ([-1.0, 2.0], [-1.0, 1.0])
self.global_optimum = [[2.0, 0.10578]]
self.fglob = -2.02180678
def fun(self, x, *args):
self.nfev += 1
return cos(x[0]) * sin(x[1]) - x[0] / (x[1] ** 2 + 1)
class Alpine01(Benchmark):
r"""
Alpine01 objective function.
The Alpine01 [1]_ global optimization problem is a multimodal minimization
problem defined as follows:
.. math::
f_{\text{Alpine01}}(x) = \sum_{i=1}^{n} \lvert {x_i \sin \left( x_i
\right) + 0.1 x_i} \rvert
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 for _ in range(self.N)]]
self.fglob = 0.0
self.change_dimensionality = True
def fun(self, x, *args):
self.nfev += 1
return sum(abs(x * sin(x) + 0.1 * x))
class Alpine02(Benchmark):
r"""
Alpine02 objective function.
The Alpine02 [1]_ global optimization problem is a multimodal minimization
problem defined as follows:
.. math::
f_{\text{Alpine02}(x) = \prod_{i=1}^{n} \sqrt{x_i} \sin(x_i)
Here, :math:`n` represents the number of dimensions and :math:`x_i \in [0,
10]` for :math:`i = 1, ..., n`.
*Global optimum*: :math:`f(x) = -6.1295` for :math:`x =
[7.91705268, 4.81584232]` 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.
TODO: eqn 7 in [1]_ has the wrong global minimum value.
"""
def __init__(self, dimensions=2):
Benchmark.__init__(self, dimensions)
self._bounds = list(zip([0.0] * self.N, [10.0] * self.N))
self.global_optimum = [[7.91705268, 4.81584232]]
self.fglob = -6.12950
self.change_dimensionality = True
def fun(self, x, *args):
self.nfev += 1
return prod(sqrt(x) * sin(x))
class AMGM(Benchmark):
r"""
AMGM objective function.
The AMGM (Arithmetic Mean - Geometric Mean Equality) global optimization
problem is a multimodal minimization problem defined as follows
.. math::
f_{\text{AMGM}}(x) = \left ( \frac{1}{n} \sum_{i=1}^{n} x_i -
\sqrt[n]{ \prod_{i=1}^{n} x_i} \right )^2
Here, :math:`n` represents the number of dimensions and :math:`x_i \in
[0, 10]` for :math:`i = 1, ..., n`.
*Global optimum*: :math:`f(x) = 0` for :math:`x_1 = x_2 = ... = x_n` for
:math:`i = 1, ..., n`
.. [1] Gavana, A. Global Optimization Benchmarks and AMPGO, retrieved 2015
TODO: eqn 7 in [1]_ has the wrong global minimum value.
"""
def __init__(self, dimensions=2):
Benchmark.__init__(self, dimensions)
self._bounds = list(zip([0.0] * self.N, [10.0] * self.N))
self.global_optimum = [[1, 1]]
self.fglob = 0.0
self.change_dimensionality = True
def fun(self, x, *args):
self.nfev += 1
f1 = sum(x)
f2 = prod(x)
f1 = f1 / self.N
f2 = f2 ** (1.0 / self.N)
f = (f1 - f2) ** 2
return f