diff --git a/lab1/gen.py b/lab1/gen.py index ebdaaeb..26dacbc 100644 --- a/lab1/gen.py +++ b/lab1/gen.py @@ -148,6 +148,9 @@ class GARunConfig: variance_threshold: float | None = ( None # порог дисперсии для остановки (если None - не используется) ) + min_fitness_avg: float | None = ( + None # порог среднего значения фитнес функции для остановки + ) @dataclass @@ -197,26 +200,41 @@ def genetic_algorithm( history_populations_x.append(xs[:]) history_populations_f.append(fits[:]) - # Проверка критерия остановки по дисперсии + # Проверка критериев остановки + stop_algorithm = False + + # Критерий остановки по дисперсии if config.variance_threshold is not None: fitness_variance = np.var(fits) if fitness_variance < config.variance_threshold: print( f"Остановка на поколении {generation}: дисперсия {fitness_variance:.6f} < {config.variance_threshold}" ) - # Сохраняем график последнего поколения - if config.save_generations: - plot_generation_snapshot( - history_best_x, - history_best_f, - history_populations_x, - history_populations_f, - generation, - config.x_min, - config.x_max, - config.results_dir, - ) - break + stop_algorithm = True + + # Критерий остановки по среднему значению фитнес функции + if config.min_fitness_avg is not None: + mean_fitness = np.mean(fits) + if mean_fitness > config.min_fitness_avg: + print( + f"Остановка на поколении {generation}: среднее значение {mean_fitness:.6f} > {config.min_fitness_avg}" + ) + stop_algorithm = True + + # Сохраняем график последнего поколения при досрочной остановке + if stop_algorithm: + if config.save_generations: + plot_generation_snapshot( + history_best_x, + history_best_f, + history_populations_x, + history_populations_f, + generation, + config.x_min, + config.x_max, + config.results_dir, + ) + break # Сохранение графика для указанных поколений if config.save_generations and generation in config.save_generations: diff --git a/lab1/main.py b/lab1/main.py index f149115..209a1a8 100644 --- a/lab1/main.py +++ b/lab1/main.py @@ -7,7 +7,7 @@ config = GARunConfig( x_min=3.1, x_max=20.0, precision_digits=3, - pop_size=5, + pop_size=15, pc=0.7, pm=0.01, max_generations=200, @@ -25,7 +25,8 @@ config = GARunConfig( 199, ], # поколения для сохранения графиков results_dir="results", - variance_threshold=1e-6, # порог дисперсии для остановки + # variance_threshold=1e-6, # порог дисперсии для остановки + min_fitness_avg=0.015, # порог среднего значения для остановки ) # Запускаем генетический алгоритм