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, num_of_epochs):
36 epochs = range(1, num_of_epochs + 1)
37 for fitness_values, name in zip(fitness_results, algorithm_names):
38 fitness_values = fitness_values[:num_of_epochs]
39 plt.plot(epochs, fitness_values, label=name)
40
41 plt.grid(True)
42 plt.xlabel('Epoch')
43 plt.ylabel('Best Fitness Value')
44 plt.title('Fitness Convergence Algorithms')
45 plt.subplots_adjust(right=0.8)
46 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderpad=1.5, handlelength=2)
47 plt.show()
48
49
50if __name__ == "__main__":
51 num_of_epochs = 50
52 function_loader = FunctionLoader()
53 ackley_function = function_loader.get_function(function_name="ackley", n_dimensions=2)
54 fitness_fun = BenchmarkFitnessFunction(ackley_function)
55
56 params_common = {
57 'epoch': num_of_epochs,
58 'population_size': 50,
59 'dimension': 2,
60 'lb': [-32.768, -32.768],
61 'ub': [32.768, 32.768],
62 'mode': optimization.OptimizationType.MINIMIZATION,
63 'boundary_constraints_fun': boundary_constrain.BoundaryFixing.RANDOM,
64 'function': fitness_fun,
65 'log_population': True,
66 'parallel_processing': ['thread', 5]
67 }
68 params_aade = AADEData(**params_common)
69 params_comde = COMDEData(**params_common)
70 params_de = DEData(**params_common)
71 params_degl = DEGLData(**params_common)
72 params_delb = DELBData(**params_common)
73 params_derl = DERLData(**params_common)
74 params_eide = EIDEData(**params_common)
75 params_emde = EMDEData(**params_common)
76 params_fiade = FiADEData(**params_common)
77 params_ide = IDEData(**params_common)
78 params_improved_de = ImprovedDEData(**params_common)
79 params_jade = JADEData(**params_common)
80 params_mgde = MGDEData(**params_common)
81 params_nmde = NMDEData(**params_common)
82 params_opposition_based = OppBasedData(**params_common)
83 params_sade = SADEData(**params_common)
84 #
85 fitness_aade = run_algorithm(AADE, params_aade)
86 fitness_comde = run_algorithm(COMDE, params_comde)
87 fitness_de = run_algorithm(DE, params_de)
88 fitness_degl = run_algorithm(DEGL, params_degl)
89 fitness_delb = run_algorithm(DELB, params_delb)
90 fitness_derl = run_algorithm(DERL, params_derl)
91 fitness_eide = run_algorithm(EIDE, params_eide)
92 fitness_emde = run_algorithm(EMDE, params_emde)
93 fitness_fiade = run_algorithm(FiADE, params_fiade)
94 fitness_ide = run_algorithm(IDE, params_ide)
95 fitness_improved_de = run_algorithm(ImprovedDE, params_improved_de)
96 fitness_jade = run_algorithm(JADE, params_jade)
97 fitness_mgde = run_algorithm(MGDE, params_mgde)
98 fitness_ndme = run_algorithm(NMDE, params_nmde)
99 fitness_opposition_based = run_algorithm(OppBasedDE, params_opposition_based)
100 fitness_sade = run_algorithm(SADE, params_sade)
101
102 fitness_results = [fitness_aade, fitness_comde, fitness_de, fitness_degl, fitness_delb, fitness_derl, fitness_eide,
103 fitness_emde, fitness_fiade,
104 fitness_ide, fitness_improved_de, fitness_jade, fitness_mgde, fitness_ndme,
105 fitness_opposition_based, fitness_sade]
106
107 algorithm_names = ['AADE', 'COMDE', 'DE', 'DEGL', 'DELB', 'DERL', 'EIDE', 'EMDE', 'FiADE', 'IDE', 'ImprovedDE',
108 'JADE', 'MGDE', 'NMDE', 'OppBasedDE', 'SADE']
109
110 plot_fitness_convergence(fitness_results, algorithm_names, num_of_epochs)