Optimization of CEC function with Detpy 2.0

  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)