Source code for smt_optim.benchmarks.sfu.bowl_shaped

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