Остановка по повтореням лучшего значения

This commit is contained in:
2025-10-09 12:25:23 +03:00
parent b7f2234bff
commit 745cfea282
7 changed files with 44 additions and 7 deletions

View File

@@ -30,6 +30,9 @@ class GARunConfig:
pc: float # вероятность кроссинговера
pm: float # вероятность мутации
max_generations: int # максимальное количество поколений
max_best_repetitions: int | None = (
None # остановка при повторении лучшего результата
)
seed: int | None = None # seed для генератора случайных чисел
minimize: bool = False # если True, ищем минимум вместо максимума
save_generations: list[int] | None = (
@@ -39,6 +42,7 @@ class GARunConfig:
fitness_avg_threshold: float | None = (
None # порог среднего значения фитнес функции для остановки
)
log_every_generation: bool = False # логировать каждое поколение
@dataclass(frozen=True)
@@ -337,6 +341,7 @@ def genetic_algorithm(config: GARunConfig) -> GARunResult:
best: Generation | None = None
generation_number = 1
best_repetitions = 0
while True:
# Вычисляем фитнес для всех особей в популяции
@@ -357,6 +362,12 @@ def genetic_algorithm(config: GARunConfig) -> GARunResult:
)
history.append(current)
if config.log_every_generation:
print(
f"Generation #{generation_number} best: {current.best_fitness},"
f" avg: {np.mean(current.fitnesses)}"
)
# Обновляем лучшую эпоху
if (
best is None
@@ -371,6 +382,15 @@ def genetic_algorithm(config: GARunConfig) -> GARunResult:
if generation_number >= config.max_generations:
stop_algorithm = True
if config.max_best_repetitions is not None and generation_number > 1:
if history[-2].best_fitness == current.best_fitness:
best_repetitions += 1
if best_repetitions == config.max_best_repetitions:
stop_algorithm = True
else:
best_repetitions = 0
# if config.variance_threshold is not None:
# fitness_variance = np.var(fitnesses)
# if fitness_variance < config.variance_threshold: