thursday/thursday/external/go_benchmark_functions/go_funcs_V.py

86 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)))