#!/usr/bin/env python
# Created by "Thieu" at 21:17, 12/07/2022 ----------%
# Email: nguyenthieu2102@gmail.com %
# Github: https://github.com/thieu1995 %
# --------------------------------------------------%
import numpy as np
from opfunu.cec_based.cec import CecBenchmark
from opfunu.utils import operator
[docs]class F12020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F1: Shifted and Rotated Bent Cigar Function (F1 CEC-2017)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 100.0'
continuous = True
linear = False
convex = True
unimodal = True
separable = False
differentiable = True
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = False # Number of ambiguous peaks, unknown # peaks
# n_basins = 1
# n_valleys = 1
characteristics = ["Smooth but narrow ridge"]
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_1", f_matrix="M_1_D", f_bias=100.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [2, 5, 10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_data(f_shift)[:self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix, needed_dim=True)
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
z = np.dot(self.f_matrix, x - self.f_shift)
return operator.bent_cigar_func(z) + self.f_bias
[docs]class F22020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F2: Shifted and Rotated Schwefel’s Function (F11 CEC-2014)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 1100.0'
continuous = True
linear = False
convex = False
unimodal = False
separable = False
differentiable = True
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = True # Number of ambiguous peaks, unknown # peaks
# n_basins = 1
# n_valleys = 1
characteristics = ["Local optima’s number is huge", "The penultimate local optimum is far from the global optimum."]
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_2", f_matrix="M_2_D", f_bias=1100.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [2, 5, 10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_data(f_shift)[:self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix, needed_dim=True)
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
z = np.dot(self.f_matrix, 1000.*(x - self.f_shift)/100)
return operator.modified_schwefel_func(z) + self.f_bias
[docs]class F32020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F3: Shifted and Rotated Lunacek bi-Rastrigin Function (F7 CEC-2017)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 700.0'
continuous = True
linear = False
convex = False
unimodal = False
separable = False
differentiable = False
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = False # Number of ambiguous peaks, unknown # peaks
# n_basins = 1
# n_valleys = 1
characteristics = ["Asymmetrical", "Continuous everywhere yet differentiable nowhere"]
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_3", f_matrix="M_3_D", f_bias=700.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [2, 5, 10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_data(f_shift)[:self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix, needed_dim=True)
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
z = np.dot(self.f_matrix, 600.*(x - self.f_shift)/100)
return operator.lunacek_bi_rastrigin_func(z, shift=2.5) + self.f_bias
[docs]class F42020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F4: Expanded Rosenbrock’s plus Griewank’s Function (F15 CEC-2014)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 1900.0'
continuous = True
linear = False
convex = False
unimodal = False
separable = False
differentiable = True
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = False # Number of ambiguous peaks, unknown # peaks
# n_basins = 1
# n_valleys = 1
characteristics = ["Optimal point locates in flat area"]
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_4", f_matrix="M_4_D", f_bias=1900.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [2, 5, 10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_data(f_shift)[:self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix, needed_dim=True)
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
z = np.dot(self.f_matrix, 5. * (x - self.f_shift) / 100)
return operator.expanded_griewank_rosenbrock_func(z) + self.f_bias
[docs]class F52020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F17: Hybrid Function 1 (F17 CEC-2014)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 1700.0'
continuous = True
linear = False
convex = False
unimodal = False
separable = False
differentiable = True
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = True # Number of ambiguous peaks, unknown # peaks
# n_basins = 1
# n_valleys = 1
characteristics = ["Different properties for different variables subcomponents"]
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_6", f_matrix="M_6_D", f_shuffle="shuffle_data_6_D", f_bias=1700.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_data(f_shift)[:self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix, needed_dim=True)
self.f_shuffle = self.check_shuffle_data(f_shuffle, needed_dim=True)
self.f_shuffle = (self.f_shuffle - 1).astype(int)
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift
self.n_funcs = 3
self.p = np.array([0.3, 0.3, 0.4])
self.n1 = int(np.ceil(self.p[0] * self.ndim))
self.n2 = int(np.ceil(self.p[1] * self.ndim)) + self.n1
self.idx1, self.idx2, self.idx3 = self.f_shuffle[:self.n1], self.f_shuffle[self.n1:self.n2], self.f_shuffle[self.n2:self.ndim]
self.g1 = operator.modified_schwefel_func
self.g2 = operator.rastrigin_func
self.g3 = operator.elliptic_func
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix, "f_shuffle": self.f_shuffle}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
z = x - self.f_shift
z1 = np.concatenate((z[self.idx1], z[self.idx2], z[self.idx3]))
mz = np.dot(self.f_matrix, z1)
return self.g1(mz[:self.n1]) + self.g2(mz[self.n1:self.n2]) + self.g3(mz[self.n2:]) + self.f_bias
[docs]class F62020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F16: Hybrid Function 2 (F15 CEC-2017)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 1600.0'
continuous = True
linear = False
convex = False
unimodal = False
separable = False
differentiable = True
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = True # Number of ambiguous peaks, unknown # peaks
# n_basins = 1
# n_valleys = 1
characteristics = []
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_7", f_matrix="M_7_D", f_shuffle="shuffle_data_7_D", f_bias=1600.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_data(f_shift)[:self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix, needed_dim=True)
self.f_shuffle = self.check_shuffle_data(f_shuffle, needed_dim=True)
self.f_shuffle = (self.f_shuffle - 1).astype(int)
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift
self.n_funcs = 4
self.p = np.array([0.2, 0.2, 0.3, 0.3])
self.n1 = int(np.ceil(self.p[0] * self.ndim))
self.n2 = int(np.ceil(self.p[1] * self.ndim)) + self.n1
self.n3 = int(np.ceil(self.p[2] * self.ndim)) + self.n2
self.idx1, self.idx2 = self.f_shuffle[:self.n1], self.f_shuffle[self.n1:self.n2]
self.idx3, self.idx4 = self.f_shuffle[self.n2:self.n3], self.f_shuffle[self.n3:self.ndim]
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix, "f_shuffle": self.f_shuffle}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
mz = np.dot(self.f_matrix, x - self.f_shift)
return (operator.expanded_schaffer_f6_func(mz[self.idx1]) +
operator.hgbat_func(mz[self.idx2], shift=-1.0) +
operator.rosenbrock_func(mz[self.idx3], shift=1.0) +
operator.modified_schwefel_func(mz[self.idx4]) + self.f_bias)
[docs]class F72020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F7: Hybrid Function 3 (F21 CEC-2014)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 2100.0'
continuous = True
linear = False
convex = False
unimodal = False
separable = False
differentiable = True
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = True # Number of ambiguous peaks, unknown # peaks
# n_basins = 1
# n_valleys = 1
characteristics = ["Different properties for different variables subcomponents"]
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_16", f_matrix="M_16_D", f_shuffle="shuffle_data_16_D", f_bias=2100.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_data(f_shift)[:self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix, needed_dim=True)
self.f_shuffle = self.check_shuffle_data(f_shuffle, needed_dim=True)
self.f_shuffle = (self.f_shuffle - 1).astype(int)
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift
self.n_funcs = 5
self.p = np.array([0.1, 0.2, 0.2, 0.2, 0.3])
self.n1 = int(np.ceil(self.p[0] * self.ndim))
self.n2 = int(np.ceil(self.p[1] * self.ndim)) + self.n1
self.n3 = int(np.ceil(self.p[2] * self.ndim)) + self.n2
self.n4 = int(np.ceil(self.p[3] * self.ndim)) + self.n3
self.idx1, self.idx2, self.idx3 = self.f_shuffle[:self.n1], self.f_shuffle[self.n1:self.n2], self.f_shuffle[self.n2:self.n3]
self.idx4, self.idx5 = self.f_shuffle[self.n3:self.n4], self.f_shuffle[self.n4:self.ndim]
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix, "f_shuffle": self.f_shuffle}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
z = x - self.f_shift
z1 = np.concatenate((z[self.idx1], z[self.idx2], z[self.idx3], z[self.idx4], z[self.idx5]))
mz = np.dot(self.f_matrix, z1)
return (operator.expanded_scaffer_f6_func(mz[:self.n1]) +
operator.hgbat_func(mz[self.n1:self.n2], shift=-1.0) +
operator.rosenbrock_func(mz[self.n2:self.n3], shift=1.0) +
operator.modified_schwefel_func(mz[self.n3:self.n4]) +
operator.elliptic_func(mz[self.n4:]) + self.f_bias)
[docs]class F82020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F8: Composition Function 1 (F21 CEC-2017)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 2200.0'
continuous = True
linear = False
convex = False
unimodal = False
separable = False
differentiable = True
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = True # Number of ambiguous peaks, unknown # peaks
characteristics = ["Asymmetrical", "Different properties around different local optima"]
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_22", f_matrix="M_22_D", f_bias=2200.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [2, 5, 10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_matrix(f_shift)[:, :self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix)[:, :self.ndim]
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift[0]
self.n_funcs = 3
self.xichmas = [10, 20, 30]
self.lamdas = [1., 10., 1.]
self.bias = [0, 100, 200]
self.g0 = operator.rastrigin_func
self.g1 = operator.griewank_func
self.g2 = operator.modified_schwefel_func
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
# 1. Rastrigin’s Function F5’
z0 = np.dot(self.f_matrix[:self.ndim, :], x - self.f_shift[0])
g0 = self.lamdas[0] * self.g0(z0) + self.bias[0]
w0 = operator.calculate_weight(x - self.f_shift[0], self.xichmas[0])
# 2. Griewank’s Function F15’
z1 = np.dot(self.f_matrix[self.ndim:2*self.ndim, :], x - self.f_shift[1])
g1 = self.lamdas[1] * self.g1(z1) + self.bias[1]
w1 = operator.calculate_weight(x - self.f_shift[1], self.xichmas[1])
# 3. Modifed Schwefel's Function F10’
# z2 = np.dot(self.f_matrix[2*self.ndim:3*self.ndim, :], x - self.f_shift[2])
z2 = 1000*(x - self.f_shift[2])/100
g2 = self.lamdas[2] * self.g2(z2) + self.bias[2]
w2 = operator.calculate_weight(x - self.f_shift[2], self.xichmas[2])
ws = np.array([w0, w1, w2])
ws = ws / np.sum(ws)
gs = np.array([g0, g1, g2])
return np.dot(ws, gs) + self.f_bias
[docs]class F92020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F9: Composition Function 2 (F23 CEC-2017)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 2400.0'
continuous = True
linear = False
convex = False
unimodal = False
separable = False
differentiable = True
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = True # Number of ambiguous peaks, unknown # peaks
# n_basins = 1
# n_valleys = 1
characteristics = ["Asymmetrical", "Different properties around different local optima"]
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_24", f_matrix="M_24_D", f_bias=2400.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [2, 5, 10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_matrix(f_shift)[:, :self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix)[:, :self.ndim]
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift[0]
self.n_funcs = 4
self.xichmas = [10, 20, 30, 40]
self.lamdas = [10., 1e-6, 10, 1.]
self.bias = [0, 100, 200, 300]
self.g0 = operator.ackley_func
self.g1 = operator.elliptic_func
self.g2 = operator.griewank_func
self.g3 = operator.rastrigin_func
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
# 1. Ackley’s Function F13’
z0 = np.dot(self.f_matrix[:self.ndim, :], x - self.f_shift[0])
g0 = self.lamdas[0] * self.g0(z0) + self.bias[0]
w0 = operator.calculate_weight(x - self.f_shift[0], self.xichmas[0])
# 2. High Conditioned Elliptic Function F11’
z1 = np.dot(self.f_matrix[self.ndim:2*self.ndim, :], x - self.f_shift[1])
g1 = self.lamdas[1] * self.g1(z1) + self.bias[1]
w1 = operator.calculate_weight(x - self.f_shift[1], self.xichmas[1])
# 3. Girewank Function F15’
z2 = np.dot(self.f_matrix[2*self.ndim:3*self.ndim, :], x - self.f_shift[2])
g2 = self.lamdas[2] * self.g2(z2) + self.bias[2]
w2 = operator.calculate_weight(x - self.f_shift[2], self.xichmas[2])
# 4. Rastrigin’s Function F5’
z3 = np.dot(self.f_matrix[3 * self.ndim:4 * self.ndim, :], x - self.f_shift[3])
g3 = self.lamdas[3] * self.g3(z3) + self.bias[3]
w3 = operator.calculate_weight(x - self.f_shift[3], self.xichmas[3])
ws = np.array([w0, w1, w2, w3])
ws = ws / np.sum(ws)
gs = np.array([g0, g1, g2, g3])
return np.dot(ws, gs) + self.f_bias
[docs]class F102020(CecBenchmark):
"""
.. [1] Problem Definitions and Evaluation Criteria for the CEC 2020
Special Session and Competition on Single Objective Bound Constrained Numerical Optimization
"""
name = "F10: Composition Function 3 (F24 CEC-2017)"
latex_formula = r'F_1(x) = \sum_{i=1}^D z_i^2 + bias, z=x-o,\\ x=[x_1, ..., x_D]; o=[o_1, ..., o_D]: \text{the shifted global optimum}'
latex_formula_dimension = r'2 <= D <= 100'
latex_formula_bounds = r'x_i \in [-100.0, 100.0], \forall i \in [1, D]'
latex_formula_global_optimum = r'\text{Global optimum: } x^* = o, F_1(x^*) = bias = 2500.0'
continuous = True
linear = False
convex = False
unimodal = False
separable = False
differentiable = True
scalable = True
randomized_term = False
parametric = True
shifted = True
rotated = True
modality = True # Number of ambiguous peaks, unknown # peaks
# n_basins = 1
# n_valleys = 1
characteristics = ["Asymmetrical", "Different properties around different local optima"]
def __init__(self, ndim=None, bounds=None, f_shift="shift_data_25", f_matrix="M_25_D", f_bias=2500.):
super().__init__()
self.dim_changeable = True
self.dim_default = 30
self.dim_max = 100
self.dim_supported = [2, 5, 10, 15, 20, 30, 50, 100]
self.check_ndim_and_bounds(ndim, self.dim_max, bounds, np.array([[-100., 100.] for _ in range(self.dim_default)]))
self.make_support_data_path("data_2020")
self.f_shift = self.check_shift_matrix(f_shift)[:, :self.ndim]
self.f_matrix = self.check_matrix_data(f_matrix)[:, :self.ndim]
self.f_bias = f_bias
self.f_global = f_bias
self.x_global = self.f_shift[0]
self.n_funcs = 5
self.xichmas = [10, 20, 30, 40, 50]
self.lamdas = [10., 1., 10., 1e-6, 1.]
self.bias = [0, 100, 200, 300, 400]
self.g0 = operator.rastrigin_func
self.g1 = operator.happy_cat_func
self.g2 = operator.ackley_func
self.g3 = operator.discus_func
self.g4 = operator.rosenbrock_func
self.paras = {"f_shift": self.f_shift, "f_bias": self.f_bias, "f_matrix": self.f_matrix}
[docs] def evaluate(self, x, *args):
self.n_fe += 1
self.check_solution(x, self.dim_max, self.dim_supported)
# 1. Rastrigin’s Function F5’
z0 = np.dot(self.f_matrix[:self.ndim, :], x - self.f_shift[0])
g0 = self.lamdas[0] * self.g0(z0) + self.bias[0]
w0 = operator.calculate_weight(x - self.f_shift[0], self.xichmas[0])
# 2. Happycat Function F17’
z1 = np.dot(self.f_matrix[self.ndim:2*self.ndim, :], x - self.f_shift[0])
g1 = self.lamdas[1] * self.g1(z1) + self.bias[1]
w1 = operator.calculate_weight(x - self.f_shift[1], self.xichmas[1])
# 3. Ackley Function F13’
z2 = np.dot(self.f_matrix[2*self.ndim:3*self.ndim, :], x - self.f_shift[0])
g2 = self.lamdas[2] * self.g2(z2) + self.bias[2]
w2 = operator.calculate_weight(x - self.f_shift[2], self.xichmas[2])
# 4. Discus Function F12’
z3 = np.dot(self.f_matrix[3 * self.ndim:4 * self.ndim, :], x - self.f_shift[0])
g3 = self.lamdas[3] * self.g3(z3) + self.bias[3]
w3 = operator.calculate_weight(x - self.f_shift[3], self.xichmas[3])
# 5. Rosenbrock’s Function F4’
z4 = np.dot(self.f_matrix[4 * self.ndim:5 * self.ndim, :], 2.048*(x - self.f_shift[0])/100) + 1
g4 = self.lamdas[4] * self.g4(z4) + self.bias[4]
w4 = operator.calculate_weight(x - self.f_shift[4], self.xichmas[4])
ws = np.array([w0, w1, w2, w3, w4])
ws = ws / np.sum(ws)
gs = np.array([g0, g1, g2, g3, g4])
return np.dot(ws, gs) + self.f_bias