Optimization of the Ackley function with all DE variants

  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)