241 lines
7.6 KiB
Python
241 lines
7.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
import numpy as np
|
|
from numpy import abs, sum, sin, cos, pi, exp, arange, prod, sqrt
|
|
from .go_benchmark import Benchmark
|
|
|
|
|
|
class XinSheYang01(Benchmark):
|
|
|
|
r"""
|
|
Xin-She Yang 1 objective function.
|
|
|
|
This class defines the Xin-She Yang 1 [1]_ global optimization problem.
|
|
This is a multimodal minimization problem defined as follows:
|
|
|
|
.. math::
|
|
|
|
f_{\text{XinSheYang01}}(x) = \sum_{i=1}^{n} \epsilon_i \lvert x_i
|
|
\rvert^i
|
|
|
|
|
|
The variable :math:`\epsilon_i, (i = 1, ..., n)` is a random variable
|
|
uniformly distributed in :math:`[0, 1]`.
|
|
|
|
Here, :math:`n` represents the number of dimensions and
|
|
:math:`x_i \in [-5, 5]` 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([-5.0] * self.N, [5.0] * self.N))
|
|
self.custom_bounds = ([-2, 2], [-2, 2])
|
|
|
|
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
|
|
|
|
i = arange(1.0, self.N + 1.0)
|
|
return sum(np.random.random(self.N) * (abs(x) ** i))
|
|
|
|
|
|
class XinSheYang02(Benchmark):
|
|
|
|
r"""
|
|
Xin-She Yang 2 objective function.
|
|
|
|
This class defines the Xin-She Yang 2 [1]_ global optimization problem.
|
|
This is a multimodal minimization problem defined as follows:
|
|
|
|
.. math::
|
|
|
|
f_{\text{XinSheYang02}}(\x) = \frac{\sum_{i=1}^{n} \lvert{x_{i}}\rvert}
|
|
{e^{\sum_{i=1}^{n} \sin\left(x_{i}^{2.0}
|
|
\right)}}
|
|
|
|
Here, :math:`n` represents the number of dimensions and
|
|
:math:`x_i \in [-2\pi, 2\pi]` 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([-2 * pi] * self.N,
|
|
[2 * pi] * 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)) * exp(-sum(sin(x ** 2.0)))
|
|
|
|
|
|
class XinSheYang03(Benchmark):
|
|
|
|
r"""
|
|
Xin-She Yang 3 objective function.
|
|
|
|
This class defines the Xin-She Yang 3 [1]_ global optimization problem.
|
|
This is a multimodal minimization problem defined as follows:
|
|
|
|
.. math::
|
|
|
|
f_{\text{XinSheYang03}}(x) = e^{-\sum_{i=1}^{n} (x_i/\beta)^{2m}}
|
|
- 2e^{-\sum_{i=1}^{n} x_i^2}
|
|
\prod_{i=1}^{n} \cos^2(x_i)
|
|
|
|
|
|
Where, in this exercise, :math:`\beta = 15` and :math:`m = 3`.
|
|
|
|
Here, :math:`n` represents the number of dimensions and
|
|
:math:`x_i \in [-20, 20]` for :math:`i = 1, ..., n`.
|
|
|
|
*Global optimum*: :math:`f(x) = -1` 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([-20.0] * self.N, [20.0] * self.N))
|
|
|
|
self.global_optimum = [[0 for _ in range(self.N)]]
|
|
self.fglob = -1.0
|
|
self.change_dimensionality = True
|
|
|
|
def fun(self, x, *args):
|
|
self.nfev += 1
|
|
|
|
beta, m = 15.0, 5.0
|
|
u = sum((x / beta) ** (2 * m))
|
|
v = sum(x ** 2)
|
|
w = prod(cos(x) ** 2)
|
|
|
|
return exp(-u) - 2 * exp(-v) * w
|
|
|
|
|
|
class XinSheYang04(Benchmark):
|
|
|
|
r"""
|
|
Xin-She Yang 4 objective function.
|
|
|
|
This class defines the Xin-She Yang 4 [1]_ global optimization problem.
|
|
This is a multimodal minimization problem defined as follows:
|
|
|
|
.. math::
|
|
|
|
f_{\text{XinSheYang04}}(x) = \left[ \sum_{i=1}^{n} \sin^2(x_i)
|
|
- e^{-\sum_{i=1}^{n} x_i^2} \right ]
|
|
e^{-\sum_{i=1}^{n} \sin^2 \sqrt{ \lvert
|
|
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) = -1` 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 = -1.0
|
|
self.change_dimensionality = True
|
|
|
|
def fun(self, x, *args):
|
|
self.nfev += 1
|
|
|
|
u = sum(sin(x) ** 2)
|
|
v = sum(x ** 2)
|
|
w = sum(sin(sqrt(abs(x))) ** 2)
|
|
return (u - exp(-v)) * exp(-w)
|
|
|
|
|
|
class Xor(Benchmark):
|
|
|
|
r"""
|
|
Xor objective function.
|
|
|
|
This class defines the Xor [1]_ global optimization problem. This is a
|
|
multimodal minimization problem defined as follows:
|
|
|
|
.. math::
|
|
|
|
f_{\text{Xor}}(x) = \left[ 1 + \exp \left( - \frac{x_7}{1 +
|
|
\exp(-x_1 - x_2 - x_5)} - \frac{x_8}{1 + \exp(-x_3 - x_4 - x_6)}
|
|
- x_9 \right ) \right ]^{-2} \\
|
|
+ \left [ 1 + \exp \left( -\frac{x_7}{1 + \exp(-x_5)}
|
|
- \frac{x_8}{1 + \exp(-x_6)} - x_9 \right ) \right] ^{-2} \\
|
|
+ \left [1 - \left\{1 + \exp \left(-\frac{x_7}{1 + \exp(-x_1 - x_5)}
|
|
- \frac{x_8}{1 + \exp(-x_3 - x_6)} - x_9 \right ) \right\}^{-1}
|
|
\right ]^2 \\
|
|
+ \left [1 - \left\{1 + \exp \left(-\frac{x_7}{1 + \exp(-x_2 - x_5)}
|
|
- \frac{x_8}{1 + \exp(-x_4 - x_6)} - x_9 \right ) \right\}^{-1}
|
|
\right ]^2
|
|
|
|
|
|
with :math:`x_i \in [-1, 1]` for :math:`i=1,...,9`.
|
|
|
|
*Global optimum*: :math:`f(x) = 0.9597588` for
|
|
:math:`\x = [1, -1, 1, -1, -1, 1, 1, -1, 0.421134]`
|
|
|
|
.. [1] Gavana, A. Global Optimization Benchmarks and AMPGO retrieved 2015
|
|
"""
|
|
|
|
def __init__(self, dimensions=9):
|
|
Benchmark.__init__(self, dimensions)
|
|
|
|
self._bounds = list(zip([-1.0] * self.N, [1.0] * self.N))
|
|
|
|
self.global_optimum = [[1.0, -1.0, 1.0,
|
|
-1.0, -1.0, 1.0, 1.0, -1.0, 0.421134]]
|
|
self.fglob = 0.9597588
|
|
|
|
def fun(self, x, *args):
|
|
self.nfev += 1
|
|
|
|
F11 = x[6] / (1.0 + exp(-x[0] - x[1] - x[4]))
|
|
F12 = x[7] / (1.0 + exp(-x[2] - x[3] - x[5]))
|
|
F1 = (1.0 + exp(-F11 - F12 - x[8])) ** (-2)
|
|
F21 = x[6] / (1.0 + exp(-x[4]))
|
|
F22 = x[7] / (1.0 + exp(-x[5]))
|
|
F2 = (1.0 + exp(-F21 - F22 - x[8])) ** (-2)
|
|
F31 = x[6] / (1.0 + exp(-x[0] - x[4]))
|
|
F32 = x[7] / (1.0 + exp(-x[2] - x[5]))
|
|
F3 = (1.0 - (1.0 + exp(-F31 - F32 - x[8])) ** (-1)) ** 2
|
|
F41 = x[6] / (1.0 + exp(-x[1] - x[4]))
|
|
F42 = x[7] / (1.0 + exp(-x[3] - x[5]))
|
|
F4 = (1.0 - (1.0 + exp(-F41 - F42 - x[8])) ** (-1)) ** 2
|
|
|
|
return F1 + F2 + F3 + F4
|