Using an extra stopping criterion
1import time
2
3from opfunu.cec_based import F12014
4
5from detpy.DETAlgs.lshade import LSHADE
6from detpy.DETAlgs.data.alg_data import LShadeData
7from detpy.models.fitness_function import FitnessFunctionOpfunu
8from detpy.models.enums import optimization, boundary_constrain
9from detpy.models.stop_condition.stop_condition import StopCondition
10
11
12class StopWhenFitnessBelowThreshold(StopCondition):
13 def should_stop(self, nfe, epoch, best_chromosome):
14 # Stop if the best fitness value is less than 100,000
15 # The parameters `nfe` (Number of Function Evaluations), `epoch` (current iteration number),
16 # and `best_chromosome` (the best solution found so far) can be used to define the stopping criterion.
17 return best_chromosome.fitness_value < 100_000
18
19
20fitness_fun_opf = FitnessFunctionOpfunu(
21 func_type=F12014,
22 ndim=10
23)
24
25if __name__ == "__main__":
26 # Define parameters
27 num_of_nfe = 10_000
28 population_size = 100
29 dimension = 10
30
31 # Define LSHADE parameters using LShadeData
32 params_lshade = LShadeData(
33 max_nfe=num_of_nfe,
34 population_size=population_size,
35 dimension=dimension,
36 lb=[-100] * dimension,
37 ub=[100] * dimension,
38 show_plots=False,
39 additional_stop_criteria=StopWhenFitnessBelowThreshold(),
40 optimization_type=optimization.OptimizationType.MINIMIZATION,
41 boundary_constraints_fun=boundary_constrain.BoundaryFixing.RANDOM,
42 function=fitness_fun_opf,
43 log_population=True,
44 parallel_processing=['thread', 1]
45 )
46
47 # Initialize and run LSHADE
48 start_time = time.time()
49 lshade = LSHADE(params_lshade, db_conn='DE.db', db_auto_write=False)
50 results = lshade.run()
51 elapsed_time = time.time() - start_time
52
53 # Extract and display results
54 best_fitness = min(epoch.best_individual.fitness_value for epoch in results.epoch_metrics)
55 print(f"Best Fitness Value: {best_fitness}")
56 print(f"Elapsed Time: {elapsed_time:.2f} seconds")