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")