1import matplotlib.pyplot as plt
2from detpy.DETAlgs.aade import AADE
3from detpy.DETAlgs.comde import COMDE
4from detpy.DETAlgs.data.alg_data import COMDEData, DEData, SADEData, FiADEData, ImprovedDEData, AADEData, DEGLData, \
5 DELBData, DERLData, EIDEData, EMDEData, IDEData, JADEData, MGDEData, NMDEData, OppBasedData
6from detpy.DETAlgs.de import DE
7from detpy.DETAlgs.degl import DEGL
8from detpy.DETAlgs.delb import DELB
9from detpy.DETAlgs.derl import DERL
10from detpy.DETAlgs.eide import EIDE
11from detpy.DETAlgs.emde import EMDE
12from detpy.DETAlgs.fiade import FiADE
13from detpy.DETAlgs.ide import IDE
14from detpy.DETAlgs.improved_de import ImprovedDE
15from detpy.DETAlgs.jade import JADE
16from detpy.DETAlgs.mgde import MGDE
17from detpy.DETAlgs.nmde import NMDE
18from detpy.DETAlgs.opposition_based import OppBasedDE
19from detpy.DETAlgs.sade import SADE
20from detpy.functions import FunctionLoader
21from detpy.models.fitness_function import BenchmarkFitnessFunction
22from detpy.models.enums import optimization, boundary_constrain
23
24
25def extract_best_fitness(epoch_metrics):
26 return [epoch.best_individual.fitness_value for epoch in epoch_metrics]
27
28
29def run_algorithm(algorithm_class, params, db_conn="Differential_evolution.db", db_auto_write=False):
30 algorithm = algorithm_class(params, db_conn=db_conn, db_auto_write=db_auto_write)
31 results = algorithm.run()
32 return [epoch.best_individual.fitness_value for epoch in results.epoch_metrics]
33
34
35def plot_fitness_convergence(fitness_results, algorithm_names, max_nfe, population_size):
36 max_epochs = int(max_nfe / population_size)
37 for fitness_values, name in zip(fitness_results, algorithm_names):
38 n = min(len(fitness_values), max_epochs)
39
40 epochs = range(1, n + 1)
41 y = fitness_values[:n]
42
43 plt.plot(epochs, y, label=name)
44
45 plt.grid(True)
46 plt.xlabel('Epoch')
47 plt.ylabel('Best Fitness Value')
48 plt.title('Fitness Convergence Algorithms')
49 plt.subplots_adjust(right=0.8)
50 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderpad=1.5, handlelength=2)
51 plt.show()
52
53
54if __name__ == "__main__":
55 num_of_nfe = 1000
56 function_loader = FunctionLoader()
57 ackley_function = function_loader.get_function(function_name="ackley", n_dimensions=2)
58 fitness_fun = BenchmarkFitnessFunction(ackley_function)
59
60 params_common = {
61 'max_nfe': num_of_nfe,
62 'population_size': 50,
63 'dimension': 2,
64 'lb': [-32.768, -32.768],
65 'ub': [32.768, 32.768],
66 'optimization_type': optimization.OptimizationType.MINIMIZATION,
67 'boundary_constraints_fun': boundary_constrain.BoundaryFixing.RANDOM,
68 'function': fitness_fun,
69 'log_population': True,
70 'parallel_processing': ['thread', 5]
71 }
72 params_aade = AADEData(**params_common)
73 params_comde = COMDEData(**params_common)
74 params_de = DEData(**params_common)
75 params_degl = DEGLData(**params_common)
76 params_delb = DELBData(**params_common)
77 params_derl = DERLData(**params_common)
78 params_eide = EIDEData(**params_common)
79 params_emde = EMDEData(**params_common)
80 params_fiade = FiADEData(**params_common)
81 params_ide = IDEData(**params_common)
82 params_improved_de = ImprovedDEData(**params_common)
83 params_jade = JADEData(**params_common)
84 params_mgde = MGDEData(**params_common)
85 params_nmde = NMDEData(**params_common)
86 params_opposition_based = OppBasedData(**params_common)
87 params_sade = SADEData(**params_common)
88 #
89 fitness_aade = run_algorithm(AADE, params_aade)
90 fitness_comde = run_algorithm(COMDE, params_comde)
91 fitness_de = run_algorithm(DE, params_de)
92 fitness_degl = run_algorithm(DEGL, params_degl)
93 fitness_delb = run_algorithm(DELB, params_delb)
94 fitness_derl = run_algorithm(DERL, params_derl)
95 fitness_eide = run_algorithm(EIDE, params_eide)
96 fitness_emde = run_algorithm(EMDE, params_emde)
97 fitness_fiade = run_algorithm(FiADE, params_fiade)
98 fitness_ide = run_algorithm(IDE, params_ide)
99 fitness_improved_de = run_algorithm(ImprovedDE, params_improved_de)
100 fitness_jade = run_algorithm(JADE, params_jade)
101 fitness_mgde = run_algorithm(MGDE, params_mgde)
102 fitness_ndme = run_algorithm(NMDE, params_nmde)
103 fitness_opposition_based = run_algorithm(OppBasedDE, params_opposition_based)
104 fitness_sade = run_algorithm(SADE, params_sade)
105
106 fitness_results = [fitness_aade, fitness_comde, fitness_de, fitness_degl, fitness_delb, fitness_derl, fitness_eide,
107 fitness_emde, fitness_fiade,
108 fitness_ide, fitness_improved_de, fitness_jade, fitness_mgde, fitness_ndme,
109 fitness_opposition_based, fitness_sade]
110
111 algorithm_names = ['AADE', 'COMDE', 'DE', 'DEGL', 'DELB', 'DERL', 'EIDE', 'EMDE', 'FiADE', 'IDE', 'ImprovedDE',
112 'JADE', 'MGDE', 'NMDE', 'OppBasedDE', 'SADE']
113
114 plot_fitness_convergence(fitness_results, algorithm_names, num_of_nfe, params_common["population_size"])