"""
Reference: https://www.sfu.ca/~ssurjano/optimization.html
"""
import numpy as np
from smt_optim.benchmarks.base import BenchmarkProblem
[docs]
class Bohachevsky1(BenchmarkProblem):
def __init__(self):
super().__init__()
self.name = "Bohachevsky1"
self.num_dim: int = 2
self.num_obj = 1
self.num_cstr = 0
self.num_fidelity = 1
self.bounds = np.array(
[
[-100, 100],
]
* self.num_dim
)
self.tags = [
"sfu",
]
[docs]
def objective(self, x):
term1 = x[0] ** 2
term2 = 2 * x[1] ** 2
term3 = -0.3 * np.cos(3 * np.pi * x[0])
term4 = -0.4 * np.cos(4 * np.pi * x[1])
return term1 + term2 + term3 + term4 + 0.7
[docs]
class Bohachevsky2(BenchmarkProblem):
def __init__(self):
super().__init__()
self.name = "Bohachevsky2"
self.num_dim: int = 2
self.num_obj = 1
self.num_cstr = 0
self.num_fidelity = 1
self.bounds = np.array(
[
[-100, 100],
]
* self.num_dim
)
self.tags = [
"sfu",
]
[docs]
def objective(self, x):
term1 = x[0] ** 2
term2 = 2 * x[1] ** 2
term3 = -0.3 * np.cos(3 * np.pi * x[0]) * np.cos(4 * np.pi * x[1])
return term1 + term2 + term3 + 0.3
[docs]
class Bohachevsky3(BenchmarkProblem):
def __init__(self):
super().__init__()
self.name = "Bohachevsky3"
self.num_dim: int = 2
self.num_obj = 1
self.num_cstr = 0
self.num_fidelity = 1
self.bounds = np.array(
[
[-100, 100],
]
* self.num_dim
)
self.tags = [
"sfu",
]
[docs]
def objective(self, x):
term1 = x[0] ** 2
term2 = 2 * x[1] ** 2
term3 = -0.3 * np.cos(3 * np.pi * x[0] + 4 * np.pi * x[1])
return term1 + term2 + term3 + 0.3
[docs]
class Perm(BenchmarkProblem):
def __init__(self):
super().__init__()
self.name = "Perm"
self.num_dim: int | str = 2
self.num_obj = 1
self.num_cstr = 0
self.num_fidelity = 1
self.bounds = np.array(
[
[-self.num_dim, self.num_dim],
]
* self.num_dim
)
self.tags = [
"sfu",
"n_variable",
]
self.b = 10
[docs]
def set_dim(self, dim: int):
if "n_variable" in self.tags:
self.num_dim = dim
self.bounds[:, 0] = -self.num_dim
self.bounds[:, 1] = self.num_dim
[docs]
def objective(self, x):
outer = 0
for i in range(self.num_dim):
inner = 0
for j in range(self.num_dim):
inner += ((j + 1) + self.b) * (
x[j] ** (i + 1) - (1 / (j + 1)) ** (i + 1)
)
outer += inner**2
return outer
[docs]
class RotatedHyperEllipsoid(BenchmarkProblem):
def __init__(self):
super().__init__()
self.name = "RotatedHyperEllipsoid"
self.num_dim: int | str = 2
self.num_obj = 1
self.num_cstr = 0
self.num_fidelity = 1
self.bounds = np.array(
[
[-65.536, 65.536],
]
* self.num_dim
)
self.tags = [
"sfu",
"n_variable",
]
[docs]
def objective(self, x):
outer = 0.0
for i in range(self.num_dim):
outer += np.sum(x[: i + 1] ** 2)
return outer
[docs]
class Sphere(BenchmarkProblem):
def __init__(self):
super().__init__()
self.name = "Sphere"
self.num_dim: int | str = 2
self.num_obj = 1
self.num_cstr = 0
self.num_fidelity = 1
self.bounds = np.array(
[
[-5.12, 5.12],
]
* self.num_dim
)
self.tags = [
"sfu",
"n_variable",
]
[docs]
def objective(self, x):
return np.sum(x**2)
[docs]
class SumDifferentPowers(BenchmarkProblem):
def __init__(self):
super().__init__()
self.name = "SumDifferentPowers"
self.num_dim: int | str = 2
self.num_obj = 1
self.num_cstr = 0
self.num_fidelity = 1
self.bounds = np.array(
[
[-1, 1],
]
* self.num_dim
)
self.tags = [
"sfu",
"n_variable",
]
[docs]
def objective(self, x):
powers = np.linspace(1, self.num_dim, self.num_dim) + 1
return np.sum(np.abs(x) ** powers)
[docs]
class SumSquares(BenchmarkProblem):
def __init__(self):
super().__init__()
self.name = "SumSquares"
self.num_dim: int | str = 2
self.num_obj = 1
self.num_cstr = 0
self.num_fidelity = 1
self.bounds = np.array(
[
[-10, 10],
]
* self.num_dim
)
self.tags = [
"sfu",
"n_variable",
]
[docs]
def objective(self, x):
indices = np.linspace(1, self.num_dim, self.num_dim)
return np.sum(indices + x**2)
[docs]
class Trid(BenchmarkProblem):
def __init__(self):
super().__init__()
self.name = "Trid"
self.num_dim: int | str = 2
self.num_obj = 1
self.num_cstr = 0
self.num_fidelity = 1
self.bounds = np.array(
[
[-(self.num_dim**2), self.num_dim**2],
]
* self.num_dim
)
self.tags = [
"sfu",
"n_variable",
]
[docs]
def set_dim(self, dim: int):
if "n_variable" in self.tags:
self.num_dim = dim
self.bounds[:, 0] = -(self.num_dim**2)
self.bounds[:, 1] = self.num_dim**2
[docs]
def objective(self, x):
term1 = np.sum((x - 1) ** 2)
term2 = np.sum(x[1:] * x[:-1])
return term1 - term2