From 7c305655260156ac7b591deadc79731f103e2a2b Mon Sep 17 00:00:00 2001 From: Arity-T Date: Wed, 10 Sep 2025 16:16:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D1=80=D0=B8=D1=82=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=BE=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D1=81=D1=80=D0=B5=D0=B4=D0=BD=D0=B5=D0=BC?= =?UTF-8?q?=D1=83=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8E=20?= =?UTF-8?q?=D1=84=D0=B8=D1=82=D0=BD=D0=B5=D1=81=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab1/gen.py | 46 ++++++++++++++++++++++++++++++++-------------- lab1/main.py | 5 +++-- 2 files changed, 35 insertions(+), 16 deletions(-) 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, # порог среднего значения для остановки ) # Запускаем генетический алгоритм