279 lines
7.8 KiB
Python
279 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
|