1import matplotlib.pyplot as plt
2import time
3import pandas as pd
4from opfunu.cec_based import F12014
5
6from detpy.DETAlgs.aade import AADE
7from detpy.DETAlgs.al_shade import ALSHADE
8from detpy.DETAlgs.comde import COMDE
9from detpy.DETAlgs.data.alg_data import COMDEData, DEData, SADEData, FiADEData, ImprovedDEData, AADEData, DEGLData, \
10 DELBData, DERLData, EIDEData, EMDEData, IDEData, JADEData, MGDEData, NMDEData, OppBasedData, \
11 LSHADERSPData, ShadeData, LShadeData, ALSHADEData, SPSLShadeEIGDATA, LShadeEpsinData, Shade_1_1_Data
12from detpy.DETAlgs.de import DE
13from detpy.DETAlgs.degl import DEGL
14from detpy.DETAlgs.delb import DELB
15from detpy.DETAlgs.derl import DERL
16from detpy.DETAlgs.eide import EIDE
17from detpy.DETAlgs.emde import EMDE
18from detpy.DETAlgs.fiade import FiADE
19from detpy.DETAlgs.ide import IDE
20from detpy.DETAlgs.improved_de import ImprovedDE
21from detpy.DETAlgs.jade import JADE
22from detpy.DETAlgs.lshade import LSHADE
23from detpy.DETAlgs.lshade_epsin import LShadeEpsin
24from detpy.DETAlgs.lshadersp import LSHADERSP
25from detpy.DETAlgs.mgde import MGDE
26from detpy.DETAlgs.nmde import NMDE
27from detpy.DETAlgs.opposition_based import OppBasedDE
28from detpy.DETAlgs.sade import SADE
29from detpy.DETAlgs.shade import SHADE
30from detpy.DETAlgs.shade_1_1 import SHADE_1_1
31from detpy.DETAlgs.sps_lshade_eig import SPS_LSHADE_EIG
32
33from detpy.models.fitness_function import FitnessFunctionOpfunu
34from detpy.models.enums import optimization, boundary_constrain
35
36pd.set_option('display.float_format', lambda x: '%.6f' % x)
37
38
39def extract_best_fitness(epoch_metrics):
40 return [epoch.best_individual.fitness_value for epoch in epoch_metrics]
41
42
43def run_algorithm(algorithm_class, params, db_conn="Differential_evolution.db", db_auto_write=False):
44 start_time = time.time()
45 algorithm = algorithm_class(params, db_conn=db_conn, db_auto_write=db_auto_write)
46 results = algorithm.run()
47 elapsed_time = time.time() - start_time
48 fitness_values = [epoch.best_individual.fitness_value for epoch in results.epoch_metrics]
49 best_fitness_value = min(fitness_values)
50 avg_fitness = sum(fitness_values) / len(fitness_values)
51 return avg_fitness, elapsed_time, best_fitness_value
52
53
54def run_multiple_times(algorithm_class, params, runs=10):
55 all_fitness = []
56 all_times = []
57 all_best_fitness = []
58
59 for _ in range(runs):
60 fitness, elapsed_time, best_fitness_value = run_algorithm(algorithm_class, params)
61 all_fitness.append(fitness)
62 all_times.append(elapsed_time)
63 all_best_fitness.append(best_fitness_value)
64
65 avg_fitness = sum(all_fitness) / len(all_fitness)
66 avg_time = sum(all_times) / len(all_times)
67 avg_best_fitness = sum(all_best_fitness) / len(all_best_fitness)
68
69 return avg_fitness, avg_time, avg_best_fitness
70
71
72def plot_fitness_convergence(fitness_results, algorithm_names, num_of_epochs):
73 epochs = range(1, num_of_epochs + 1)
74 for fitness_values, name in zip(fitness_results, algorithm_names):
75 fitness_values = fitness_values[:num_of_epochs]
76 plt.plot(epochs, fitness_values, label=name)
77
78 plt.grid(True)
79 plt.xlabel('Epoch')
80 plt.ylabel('Best Fitness Value')
81 plt.title('Fitness Convergence Algorithms')
82 plt.subplots_adjust(right=0.8)
83 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderpad=1.5, handlelength=2)
84 plt.show()
85
86
87if __name__ == "__main__":
88 num_of_epochs = 100
89 num_of_nfe = 10_000
90
91 fitness_fun_opf = FitnessFunctionOpfunu(
92 func_type=F12014,
93 ndim=10
94 )
95
96 params_common = {
97 'max_nfe': num_of_nfe,
98 'population_size': 100,
99 'dimension': 10,
100 'lb': [-100] * 10,
101 'ub': [100] * 10,
102 'show_plots': False,
103 'optimization_type': optimization.OptimizationType.MINIMIZATION,
104 'boundary_constraints_fun': boundary_constrain.BoundaryFixing.RANDOM,
105 'function': fitness_fun_opf,
106 'log_population': True,
107 'parallel_processing': ['thread', 1]
108 }
109
110 params_aade = AADEData(**params_common)
111 params_comde = COMDEData(**params_common)
112 params_de = DEData(**params_common)
113 params_degl = DEGLData(**params_common)
114 params_delb = DELBData(**params_common)
115 params_derl = DERLData(**params_common)
116 params_eide = EIDEData(**params_common)
117 params_emde = EMDEData(**params_common)
118 params_fiade = FiADEData(**params_common)
119 params_ide = IDEData(**params_common)
120 params_improved_de = ImprovedDEData(**params_common)
121 params_jade = JADEData(**params_common)
122 params_mgde = MGDEData(**params_common)
123 params_nmde = NMDEData(**params_common)
124 params_opposition_based = OppBasedData(**params_common)
125 params_sade = SADEData(**params_common)
126 params_shade = ShadeData(**params_common)
127 params_shade11 = Shade_1_1_Data(**params_common)
128 params_lshade = LShadeData(**params_common)
129 params_lshadersp = LSHADERSPData(**params_common)
130 params_lshadeepsin = LShadeEpsinData(**params_common)
131 params_alshade = ALSHADEData(**params_common)
132
133 algorithms = {
134 "SADE": SADE,
135 "COMDE": COMDE,
136 'DERL': DERL,
137 'NMDE': NMDE,
138 "ALSHADE": ALSHADE,
139 'SHADE1.1': SHADE_1_1,
140 'SHADE': SHADE,
141 'LSHADEEPSIN': LShadeEpsin,
142 'LSHADE': LSHADE,
143 'AADE': AADE,
144 'DE': DE,
145 'DEGL': DEGL,
146 'DELB': DELB,
147 'EIDE': EIDE,
148 'EMDE': EMDE,
149 'JADE': JADE,
150 'MGDE': MGDE,
151 'OppBased': OppBasedDE,
152 'FiADE': FiADE,
153 'IDE': IDE,
154 'ImprovedDE': ImprovedDE,
155 'LSHADERSP': LSHADERSP,
156 'SPS_LSHADE_EIG': SPS_LSHADE_EIG,
157 }
158
159 algorithms_params = {
160 'NMDE': params_nmde,
161 'DERL': params_derl,
162 'COMDE': params_comde,
163 'LSHADE': params_lshade,
164 'AADE': params_aade,
165 'SADE': params_sade,
166 'DE': params_de,
167 'DEGL': params_degl,
168 'DELB': params_delb,
169 'EIDE': params_eide,
170 'EMDE': params_emde,
171 'FiADE': params_fiade,
172 'IDE': params_ide,
173 'ImprovedDE': params_improved_de,
174 'JADE': params_jade,
175 'MGDE': params_mgde,
176 'OppBased': params_opposition_based,
177 'LSHADEEPSIN': params_lshadeepsin,
178 'SHADE': params_shade,
179 'LSHADERSP': params_lshadersp,
180 'ALSHADE': params_alshade,
181 'SPS_LSHADE_EIG': SPSLShadeEIGDATA(**params_common),
182 'SHADE1.1': params_shade11
183 }
184
185 avg_fitness_results = []
186 avg_times = []
187 algorithm_names = []
188 avg_best_fitness_results = []
189
190 for name, algorithm_class in algorithms.items():
191 avg_fitness, avg_time, avg_best_fitness = run_multiple_times(algorithm_class, algorithms_params[name])
192 avg_fitness_results.append(avg_fitness)
193 avg_times.append(avg_time)
194 algorithm_names.append(name)
195 avg_best_fitness_results.append(avg_best_fitness)
196
197 sorted_results = sorted(zip(algorithm_names, avg_fitness_results, avg_times, avg_best_fitness_results),
198 key=lambda x: (x[1], x[2], x[3]))
199
200 df_sorted = pd.DataFrame(sorted_results,
201 columns=["Algorithm", "Average Fitness", "Average Time (s)", "Average Best Fitness"])
202
203 df_fitness_sorted = df_sorted[["Algorithm", "Average Fitness"]].sort_values(by="Average Fitness")
204 df_time_sorted = df_sorted[["Algorithm", "Average Time (s)"]].sort_values(by="Average Time (s)")
205 df_best_fitness_sorted = df_sorted[["Algorithm", "Average Best Fitness"]].sort_values(by="Average Best Fitness")
206
207 print("\nAverage Fitness (sorted by Fitness):")
208 print(df_fitness_sorted)
209
210 print("\nAverage Time (sorted by Time):")
211 print(df_time_sorted)
212
213 print("\nAverage Best Fitness (sorted by Best Fitness):")
214 print(df_best_fitness_sorted)