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