COMMON_2D_3D = {
"Rosenbrock": {
"objective_function": rosenbrock,
"gradient_function": rosenbrock_gradient,
"lower_bounds": -2.048,
"upper_bounds": 2.048,
"known_optimum_by_dimension": {
2: np.array([1.0, 1.0], dtype=float),
3: np.array([1.0, 1.0, 1.0], dtype=float),
},
"gradient_rate": 0.001,
"gradient_iterations": 5000,
},
"Rastrigin": {
"objective_function": rastrigin,
"gradient_function": rastrigin_gradient,
"lower_bounds": -5.12,
"upper_bounds": 5.12,
"known_optimum_by_dimension": {
2: np.zeros(2, dtype=float),
3: np.zeros(3, dtype=float),
},
"gradient_rate": 0.001,
"gradient_iterations": 4000,
},
"Schwefel": {
"objective_function": schwefel,
"gradient_function": schwefel_gradient,
"lower_bounds": -500.0,
"upper_bounds": 500.0,
"known_optimum_by_dimension": {
2: np.array([420.968746, 420.968746], dtype=float),
3: np.array([420.968746, 420.968746, 420.968746], dtype=float),
},
"gradient_rate": 0.01,
"gradient_iterations": 4000,
},
"Griewank": {
"objective_function": griewank,
"gradient_function": griewank_gradient,
"lower_bounds": -600.0,
"upper_bounds": 600.0,
"known_optimum_by_dimension": {
2: np.zeros(2, dtype=float),
3: np.zeros(3, dtype=float),
},
"gradient_rate": 0.01,
"gradient_iterations": 4000,
},
}
ONLY_2D = {
"Goldstein-Price 2D": {
"objective_function": goldstein_price,
"gradient_function": goldstein_price_gradient,
"dimension": 2,
"lower_bounds": -2.0,
"upper_bounds": 2.0,
"known_optimum": np.array([0.0, -1.0], dtype=float),
"gradient_rate": 0.00001,
"gradient_iterations": 6000,
},
"Six-Hump Camel 2D": {
"objective_function": six_hump_camel,
"gradient_function": six_hump_camel_gradient,
"dimension": 2,
"lower_bounds": -3.0,
"upper_bounds": 3.0,
"known_optimum": np.array([0.089842, -0.712656], dtype=float),
"gradient_rate": 0.01,
"gradient_iterations": 5000,
},
}
def build_cases() -> dict:
cases = {}
for function_name, config in COMMON_2D_3D.items():
for dimension in [2, 3]:
case_name = f"{function_name} {dimension}D"
cases[case_name] = {
"objective_function": config["objective_function"],
"gradient_function": config["gradient_function"],
"dimension": dimension,
"lower_bounds": config["lower_bounds"],
"upper_bounds": config["upper_bounds"],
"known_optimum": config["known_optimum_by_dimension"][dimension],
"gradient_rate": config["gradient_rate"],
"gradient_iterations": config["gradient_iterations"],
"gradient_tolerance": 1e-8,
"ea_population_size": 40 if dimension == 2 else 50,
"ea_iterations": 120 if dimension == 2 else 150,
"pso_swarm_size": 40 if dimension == 2 else 50,
"pso_iterations": 120 if dimension == 2 else 150,
"de_population_size": 40 if dimension == 2 else 50,
"de_iterations": 120 if dimension == 2 else 150,
"seed": 42,
}
for case_name, config in ONLY_2D.items():
cases[case_name] = {
**config,
"gradient_tolerance": 1e-8,
"ea_population_size": 40,
"ea_iterations": 120,
"pso_swarm_size": 40,
"pso_iterations": 120,
"de_population_size": 40,
"de_iterations": 120,
"seed": 42,
}
return cases
CASES = build_cases()
list(CASES.keys())