Критерий остановки по среднему значению фитнес функции

This commit is contained in:
2025-09-10 16:16:31 +03:00
parent 1e34db4beb
commit 7c30565526
2 changed files with 35 additions and 16 deletions

View File

@@ -148,6 +148,9 @@ class GARunConfig:
variance_threshold: float | None = (
None # порог дисперсии для остановки (если None - не используется)
)
min_fitness_avg: float | None = (
None # порог среднего значения фитнес функции для остановки
)
@dataclass
@@ -197,14 +200,29 @@ 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}"
)
# Сохраняем график последнего поколения
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,

View File

@@ -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, # порог среднего значения для остановки
)
# Запускаем генетический алгоритм