Optimization of common benchmark functions

 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)