"""
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.
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