Критерий остановки по дисперсии фитнеса

This commit is contained in:
2025-09-10 16:05:18 +03:00
parent 010efa17e0
commit 1e34db4beb
2 changed files with 26 additions and 1 deletions

View File

@@ -145,6 +145,9 @@ class GARunConfig:
None # индексы поколений для сохранения графиков None # индексы поколений для сохранения графиков
) )
results_dir: str = "results" # папка для сохранения графиков results_dir: str = "results" # папка для сохранения графиков
variance_threshold: float | None = (
None # порог дисперсии для остановки (если None - не используется)
)
@dataclass @dataclass
@@ -194,6 +197,27 @@ def genetic_algorithm(
history_populations_x.append(xs[:]) history_populations_x.append(xs[:])
history_populations_f.append(fits[:]) history_populations_f.append(fits[:])
# Проверка критерия остановки по дисперсии
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
# Сохранение графика для указанных поколений # Сохранение графика для указанных поколений
if config.save_generations and generation in config.save_generations: if config.save_generations and generation in config.save_generations:
plot_generation_snapshot( plot_generation_snapshot(
@@ -224,7 +248,7 @@ def genetic_algorithm(
return GARunResult( return GARunResult(
best_x, best_x,
best_f, best_f,
config.max_generations, len(history_best_x), # реальное количество поколений
history_best_x, history_best_x,
history_best_f, history_best_f,
history_populations_x, history_populations_x,

View File

@@ -25,6 +25,7 @@ config = GARunConfig(
199, 199,
], # поколения для сохранения графиков ], # поколения для сохранения графиков
results_dir="results", results_dir="results",
variance_threshold=1e-6, # порог дисперсии для остановки
) )
# Запускаем генетический алгоритм # Запускаем генетический алгоритм