Source code for metaheuristic_designer.benchmarks.benchmark_funcs

import time
import numpy as np
from ..objective_function import ObjectiveFunc, ObjectiveFunc
from ..utils import per_individual

__all__ = [
    "MaxOnes",
    "DiophantineEq",
    "SleepTest",
    "MaxOnes",
    "Sphere",
    "HighCondElliptic",
    "BentCigar",
    "Discus",
    "Rosenbrock",
    "Ackley",
    "Weierstrass",
    "Griewank",
    "Rastrigin",
    "ModSchwefel",
    "Katsuura",
    "HappyCat",
    "HGBat",
    "ExpandedGriewankPlusRosenbrock",
    "ExpandedShafferF6",
    "SumPowell",
    "N4XinSheYang",
]


[docs] class MaxOnes(ObjectiveFunc): def __init__(self, dimension, mode="max", constraint_handler=None): super().__init__( constraint_handler=constraint_handler, dimension=dimension, lower_bound=0, upper_bound=1, mode=mode, name="Max ones", vectorized=True )
[docs] def objective(self, population_matrix): return population_matrix.sum(axis=1)
[docs] class DiophantineEq(ObjectiveFunc): def __init__(self, dimension, coeff, target, mode="min"): self.coeff = coeff self.target = target super().__init__(mode=mode, name="Diophantine equation")
[docs] def objective(self, solution): return abs((solution * self.coeff).sum() - self.target)
[docs] class SleepTest(ObjectiveFunc): def __init__(self, dimension, sleep_time=2, mode="min"): self.sleep_time = sleep_time super().__init__(dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Sphere function")
[docs] def objective(self, solution): time.sleep(self.sleep_time) return _sphere(solution)
### Benchmark functions
[docs] class Sphere(ObjectiveFunc): def __init__(self, dimension, mode="min", constraint_handler=None): super().__init__( constraint_handler=constraint_handler, dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Sphere function" )
[docs] def objective(self, solution): return _sphere(solution)
[docs] class HighCondElliptic(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-5.12, upper_bound=5.12, name="High condition elliptic function")
[docs] def objective(self, solution): return _high_cond_elipt_f(solution)
[docs] class BentCigar(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Bent Cigar function")
[docs] def objective(self, solution): return _bent_cigar(solution)
[docs] class Discus(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-5.12, upper_bound=5.12, name="Discus function")
[docs] def objective(self, solution): return _discus(solution)
[docs] class Rosenbrock(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Rosenbrock function")
[docs] def objective(self, solution): return _rosenbrock(solution)
[docs] class Ackley(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-5.12, upper_bound=5.12, name="Ackley function")
[docs] def objective(self, solution): return _ackley(solution)
[docs] class Weierstrass(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Weierstrass function")
[docs] def objective(self, solution): return _weierstrass(solution)
[docs] class Griewank(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Griewank function")
[docs] def objective(self, solution): return _griewank(solution)
[docs] class Rastrigin(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-5.12, upper_bound=5.12, name="Rastrigin function")
[docs] def objective(self, solution): return _rastrigin(solution)
[docs] class ModSchwefel(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Modified Schweafel function")
[docs] def objective(self, solution): return _mod_schwefel(solution)
[docs] class Katsuura(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Katsuura function")
[docs] def objective(self, solution): return _katsuura(solution)
[docs] class HappyCat(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-2, upper_bound=2, name="Happy Cat function")
[docs] def objective(self, solution): return _happy_cat(solution)
[docs] class HGBat(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-2, upper_bound=2, name="HGBat function")
[docs] def objective(self, solution): return _hgbat(solution)
[docs] class ExpandedGriewankPlusRosenbrock(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Expanded Griewank + Rosenbrock")
[docs] def objective(self, solution): return _exp_griewank_plus_rosenbrock(solution)
[docs] class ExpandedShafferF6(ObjectiveFunc): def __init__(self, dimension, mode="min"): super().__init__(dimension=dimension, mode=mode, lower_bound=-100, upper_bound=100, name="Expanded Shaffer F6 function")
[docs] def objective(self, solution): return _exp_shafferF6(solution)
[docs] class SumPowell(ObjectiveFunc): """ Sum of Powell function """ def __init__(self, dimension, mode="min", lim_min=-1, lim_max=1): super().__init__(dimension=dimension, mode=mode, lower_bound=lim_min, upper_bound=lim_max, name="Sum Powell")
[docs] def objective(self, solution): return _sum_powell(solution)
[docs] class N4XinSheYang(ObjectiveFunc): """ N4 Xin-She Yang function """ def __init__(self, dimension, mode="min", lim_min=-10, lim_max=10): super().__init__(dimension=dimension, mode=mode, lower_bound=lim_min, upper_bound=lim_max, name="N4 Xin-She Yang")
[docs] def objective(self, solution): return _n4xinshe_yang(solution)
def _sphere(solution): return (solution**2).sum() def _high_cond_elipt_f(vect): c = 1.0e6 ** ((np.arange(vect.shape[0]) / (vect.shape[0] - 1))) return np.sum(c * vect * vect) def _bent_cigar(solution): return solution[0] ** 2 + 1e6 * (solution[1:] ** 2).sum() def _discus(solution): return 1e6 * solution[0] ** 2 + (solution[1:] ** 2).sum() def _rosenbrock(solution): term1 = solution[1:] - solution[:-1] ** 2 term2 = 1 - solution[:-1] result = 100 * term1**2 + term2**2 return result.sum() def _ackley(solution): term1 = (solution**2).sum() term1 = -0.2 * np.sqrt(term1 / solution.size) term2 = (np.cos(2 * np.pi * solution)).sum() / solution.size return np.exp(1) - 20 * np.exp(term1) - np.exp(term2) + 20 def _weierstrass(solution, iter=20): return np.sum(np.array([0.5**k * np.cos(2 * np.pi * 3**k * (solution + 0.5)) for k in range(iter)])) def _griewank(solution): term1 = (solution**2).sum() term2 = np.prod(np.cos(solution / np.sqrt(np.arange(1, solution.size + 1)))) return 1 + term1 / 4000 - term2 def _rastrigin(solution, A=10): return A * len(solution) + (solution**2 - A * np.cos(2 * np.pi * solution)).sum() def _mod_schwefel(solution): fit = 0 for i in range(solution.size): z = solution[i] + 4.209687462275036e2 if z > 500: fit = fit - (500 - z % 500) * np.sin((500 - z % 500) ** 0.5) tmp = (z - 500) / 100 fit = fit + tmp * tmp / solution.size elif z < -500: fit = fit - (-500 - abs(z) % 500) * np.sin((500 - abs(z) % 500) ** 0.5) tmp = (z + 500) / 100 fit = fit + tmp * tmp / solution.size else: fit = fit - z * np.sin(abs(z) ** 0.5) return fit + 4.189828872724338e2 * solution.size def _katsuura(solution): A = 10 / solution.size**2 temp_list = [ 1 + (i + 1) * np.sum( ( np.abs(2 ** (np.arange(1, 32 + 1)) * solution[i] - np.round(2 ** (np.arange(1, 32 + 1)) * solution[i])) * 2 ** (-np.arange(1, 32 + 1, dtype=float)) ) ** (10 / solution.size**1.2) ) for i in range(solution.size) ] prod_val = np.prod(temp_list) return A * prod_val - A def _happy_cat(solution): z = solution + 4.189828872724338e2 r2 = (z * solution).sum() s = solution.sum() return np.abs(r2 - solution.size) ** 0.25 + (0.5 * r2 + s) / solution.size + 0.5 def _hgbat(solution): z = solution + 4.189828872724338e2 r2 = (z * solution).sum() s = solution.sum() return np.abs((r2**2 - s**2)) ** 0.5 + (0.5 * r2 + s) / solution.size + 0.5 def _exp_griewank_plus_rosenbrock(solution): z = solution[:-1] + 4.189828872724338e2 tmp1 = solution[:-1] ** 2 - solution[1:] tmp2 = z - 1 tmp = 100 * tmp1**2 + tmp2**2 grw = (tmp**2 / 4000 - np.cos(tmp) + 1).sum() term1 = solution[1:] - solution[:-1] ** 2 term2 = 1 - solution[:-1] ros = (100 * term1**2 + term2**2).sum() return grw + ros**2 / 4000 - np.cos(ros) + 1 def _exp_shafferF6(solution): term1 = np.sin(np.sqrt(np.sum(solution[:-1] ** 2 + solution[1:] ** 2))) ** 2 - 0.5 term2 = 1 + 0.001 * (solution[:-1] ** 2 + solution[1:] ** 2).sum() temp = 0.5 + term1 / term2 term1 = np.sin(np.sqrt(np.sum((solution.size - 1) ** 2 + solution[0] ** 2))) ** 2 - 0.5 term2 = 1 + 0.001 * ((solution.size - 1) ** 2 + solution[0] ** 2) return temp + 0.5 + term1 / term2 def _sum_powell(solution): return (np.abs(solution) ** np.arange(2, solution.shape[0] + 2)).sum() def _n4xinshe_yang(solution): sum_1 = np.exp(-(solution**2).sum()) sum_2 = np.exp(-(np.sin(np.sqrt(np.abs(solution))) ** 2).sum()) return (np.sin(solution) ** 2 - sum_1).sum() * sum_2