85 lines
2.6 KiB
Python
85 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
from numpy import sum, cos, sin, log
|
|
from .go_benchmark import Benchmark
|
|
|
|
|
|
class VenterSobiezcczanskiSobieski(Benchmark):
|
|
|
|
r"""
|
|
Venter Sobiezcczanski-Sobieski objective function.
|
|
|
|
This class defines the Venter Sobiezcczanski-Sobieski [1]_ global optimization
|
|
problem. This is a multimodal minimization problem defined as follows:
|
|
|
|
.. math::
|
|
|
|
f_{\text{VenterSobiezcczanskiSobieski}}(x) = x_1^2 - 100 \cos^2(x_1)
|
|
- 100 \cos(x_1^2/30)
|
|
+ x_2^2 - 100 \cos^2(x_2)
|
|
- 100 \cos(x_2^2/30)
|
|
|
|
|
|
with :math:`x_i \in [-50, 50]` for :math:`i = 1, 2`.
|
|
|
|
*Global optimum*: :math:`f(x) = -400` 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.
|
|
|
|
TODO Jamil #160 hasn't written the equation very well. Normally a cos
|
|
squared term is written as cos^2(x) rather than cos(x)^2
|
|
"""
|
|
|
|
def __init__(self, dimensions=2):
|
|
Benchmark.__init__(self, dimensions)
|
|
|
|
self._bounds = list(zip([-50.0] * self.N, [50.0] * self.N))
|
|
self.custom_bounds = ([-10, 10], [-10, 10])
|
|
|
|
self.global_optimum = [[0.0 for _ in range(self.N)]]
|
|
self.fglob = -400
|
|
|
|
def fun(self, x, *args):
|
|
self.nfev += 1
|
|
|
|
u = x[0] ** 2.0 - 100.0 * cos(x[0]) ** 2.0
|
|
v = -100.0 * cos(x[0] ** 2.0 / 30.0) + x[1] ** 2.0
|
|
w = - 100.0 * cos(x[1]) ** 2.0 - 100.0 * cos(x[1] ** 2.0 / 30.0)
|
|
return u + v + w
|
|
|
|
|
|
class Vincent(Benchmark):
|
|
|
|
r"""
|
|
Vincent objective function.
|
|
|
|
This class defines the Vincent [1]_ global optimization problem. This
|
|
is a multimodal minimization problem defined as follows:
|
|
|
|
.. math::
|
|
|
|
f_{\text{Vincent}}(x) = - \sum_{i=1}^{n} \sin(10 \log(x))
|
|
|
|
Here, :math:`n` represents the number of dimensions and
|
|
:math:`x_i \in [0.25, 10]` for :math:`i = 1, ..., n`.
|
|
|
|
*Global optimum*: :math:`f(x) = -n` for :math:`x_i = 7.70628098`
|
|
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([0.25] * self.N, [10.0] * self.N))
|
|
|
|
self.global_optimum = [[7.70628098 for _ in range(self.N)]]
|
|
self.fglob = -float(self.N)
|
|
self.change_dimensionality = True
|
|
|
|
def fun(self, x, *args):
|
|
self.nfev += 1
|
|
|
|
return -sum(sin(10.0 * log(x)))
|