best for now RMSE: 30.937

This commit is contained in:
2025-11-07 00:08:08 +03:00
parent cb2b031e9c
commit cfae423f11
4 changed files with 140 additions and 10 deletions

View File

@@ -26,3 +26,63 @@ def roulette_selection(population: Population, fitnesses: Fitnesses) -> Populati
selected.append(population[idx])
return selected
def tournament_selection(
population: Population,
fitnesses: Fitnesses,
k: int = 3,
) -> Population:
"""Турнирная селекция.
В каждом турнире случайно выбирается k особей, и побеждает та,
у которой лучшее (наибольшее) значение фитнеса. Для минимизации
значения фитнеса нужно предварительно инвертировать.
Args:
population: список особей (Population)
fitnesses: список или массив фитнесов (Fitnesses)
k: размер турнира
Returns:
Новая популяция того же размера
"""
size = len(population)
selected = []
for _ in range(size):
idxs = np.random.choice(size, size=k, replace=False)
fits = fitnesses[idxs]
winner_idx = idxs[np.argmax(fits)]
selected.append(population[winner_idx])
return selected
def stochastic_tournament_selection(
population: Population,
fitnesses: Fitnesses,
k: int = 3,
p_best: float = 0.75,
) -> Population:
"""Стохастическая турнирная селекция.
Побеждает лучший в турнире с вероятностью p_best, иначе выбирается
случайный участник турнира.
"""
size = len(population)
selected = []
for _ in range(size):
idxs = np.random.choice(size, size=k, replace=False)
fits = fitnesses[idxs]
order = np.argsort(-fits)
if np.random.random() < p_best:
winner_idx = idxs[order[0]]
else:
winner_idx = np.random.choice(idxs[1:]) if k > 1 else idxs[0]
selected.append(population[winner_idx])
return selected