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