Я пытаюсь реализовать Стохастическую универсальную выборку, которая работает следующим образом:
Пусть F - сумма значений пригодности всех хромосом в популяции.
Пусть N будет числом родителей для выбора.
- Вычислить расстояние P между последовательными точками: P = F / N.
- Создать случайное числомежду 0 и P в качестве отправной точки для линейки. Линейка имеет N точек, расположенных на одинаковом расстоянии друг от друга, на расстоянии P друг от друга.
- Назначьте каждой хромосоме диапазон, равный по длине ее пригодности и начальной точке, которая находится после конечной точки предыдущей хромосомы (например, первой хромосомы 01.53,2-я хромосома 1.54-2.26, 3-я хромосома 2.27-3.42 и т. Д.).
- Выберите хромосомы, чей диапазон содержит маркер (обратите внимание, что хромосома может иметь 2 маркера, в этом случае она выбирается дважды).
Я реализовал некоторую часть этой функциональности, но она дает ошибку
fitness_probSort = sorted(fitness_prob, key=attrgetter(fit_attr), reverse=True)
AttributeError: 'int' object has no attribute 'fitness'.
Я столкнулся с проблемой при реализации 5 и 6 шага.
selection.py
def stochasticUniversalSampling(self, N, fit_attr="fitness"):
fitnessResults = {}
fitness_prob = {}
for i in range(0, len(self.population)):
fitnessResults[i] = self.population[i].getFitness()
fitness_prob[i] = 1 / fitnessResults[i]
fitness_probSort = sorted(fitness_prob, key=attrgetter(fit_attr), reverse=True)
print(fitness_probSort)
point_distance = 1 / N
start_point = random.uniform(0, point_distance)
points = [start_point + i * point_distance for i in range(N)]
chosen = []
for p in points:
i = 0
sum_ = getattr(fitness_probSort[i], fit_attr).values[0]
while sum_ < p:
i += 1
sum_ += getattr(fitness_probSort[i], fit_attr).values[0]
chosen.append(fitness_probSort[i])
return chosen