1import matplotlib.pyplot as plt
2from detpy.DETAlgs.data.alg_data import SADEData
3from detpy.DETAlgs.sade import SADE
4from detpy.functions import FunctionLoader
5from detpy.models.fitness_function import BenchmarkFitnessFunction
6from detpy.models.enums import optimization, boundary_constrain
7
8
9def extract_best_fitness(epoch_metrics):
10 return [epoch.best_individual.fitness_value for epoch in epoch_metrics]
11
12
13def run_algorithm(algorithm_class, params, db_conn="Differential_evolution.db", db_auto_write=False):
14 algorithm = algorithm_class(params, db_conn=db_conn, db_auto_write=db_auto_write)
15 results = algorithm.run()
16 return [epoch.best_individual.fitness_value for epoch in results.epoch_metrics]
17
18
19def plot_fitness_convergence(fitness_results, algorithm_names, num_of_epochs, function_name):
20 epochs = range(1, num_of_epochs + 1)
21 for fitness_values, name in zip(fitness_results, algorithm_names):
22 fitness_values = fitness_values[:num_of_epochs]
23 plt.plot(epochs, fitness_values, label=name)
24
25 plt.xlabel('Epoch')
26 plt.ylabel('Best Fitness Value')
27 plt.title(f'Fitness Convergence for {function_name}')
28 plt.legend()
29 plt.show()
30
31
32if __name__ == "__main__":
33 num_of_epochs = 100
34 function_loader = FunctionLoader()
35
36 test_functions = [
37 "ackley", "rastrigin", "rosenbrock"
38 ]
39
40 params_common = {
41 'epoch': num_of_epochs,
42 'population_size': 100,
43 'dimension': 2,
44 'lb': [-32.768, -32.768],
45 'ub': [32.768, 32.768],
46 'mode': optimization.OptimizationType.MINIMIZATION,
47 'boundary_constraints_fun': boundary_constrain.BoundaryFixing.RANDOM,
48 'log_population': True,
49 'parallel_processing': ['thread', 5]
50 }
51
52 algorithms = [
53 (SADE, SADEData),
54 ]
55 algorithm_names = ['SADE']
56
57 for function_name in test_functions:
58 fitness_fun = BenchmarkFitnessFunction(
59 function_loader.get_function(function_name=function_name, n_dimensions=2))
60 params_common['function'] = fitness_fun
61
62 fitness_results = []
63 for algorithm_class, data_class in algorithms:
64 params = data_class(**params_common)
65 fitness_values = run_algorithm(algorithm_class, params)
66 fitness_results.append(fitness_values)
67
68 plot_fitness_convergence(fitness_results, algorithm_names, num_of_epochs, function_name)