Генетический Алгоритм Выбора Турнира
Если я только выбираю N / 2 лучших решений в популяции, наверняка у меня закончится население довольно быстро?
мое понимание алгоритма:
for(Member m in currentPopulation){
Member randomMember1 = random member of currentPopulation which is then removed from currentPopulation
Member randomMember2 = as above;
//Mutate and crossover
if(randomMember1.getScore() > randomMember2.getScore()){
nextGeneration.add(randomMember1);
} else {
nextGeneration.add(randomMember2);
}
}
правильно ли я это понимаю?
3 ответов
при отборе турнира выбранные лица не удаляются из популяции. Вы можете выбрать одних и тех же людей для участия в нескольких турнирах.
посмотрев на ваш код немного ближе, я вижу, что у вас есть еще одно недоразумение. Обычно вы не мутируете / не пересекаете всех участников турнира. Вместо этого вы выполняете турнир, при этом победитель этого турнира выбирается как индивидуум для прохождения мутации / кроссовера. Это означает, что для мутация ваш размер турнира должен быть не менее 2, а для кроссовера размер должен быть не менее 3 с лучшими 2 победами (или вы можете выполнить 2 отдельных турнира, чтобы выбрать каждого из родителей для кроссовера).
некоторые псевдо-код может помочь:
while (nextPopulation too small) {
Members tournament = randomly choose x members from currentPopulation
if(crossover){
Member parents = select best two members from tournament
Member children = crossover(parents)
nextPopulation.add(children);
} else {
Member parent = select best one member from tournament
Member child = mutate(parent)
nextPopulation.add(child);
}
}
Если вы выбираете n / 2 человек из вашей популяции в каждом поколении, вы в конечном итоге достигнете точки, где у вас есть популяция 1. Что вы хотите сделать в дополнение к выбору, так это создать новых членов для вашего следующего поколения, используя мутацию или кроссовер, как правило, на тех, кто был победителями в турнире.
Итак, для каждого поколения у вас есть популяция размера n-вы уменьшаете это до n/2 через свой выбор, а затем эти N / 2 членов воспроизводятся и/или мутировать, чтобы произвести примерно n / 2 больше членов для вашего следующего поколения (которые, в среднем, будут "лучше", чем те, которые не прогрессировали от предыдущего поколения).
Турнир Отбора:
- выбор турнира-это метод выбора индивидуума из популяции индивидуумов.
- выбор турнира включает в себя запуск нескольких "турниров" среди нескольких человек, выбранных случайным образом из населения.
- победитель каждого турнира (с лучшим фитнесом) выбирается для кроссовера.
- когда размер турнира меньше, выбор турнира также дает шанс для всех людей быть выбранными и, таким образом, сохраняет разнообразие, хотя сохранение разнообразия может снизить скорость конвергенции.
- но если размер турнира больше, у слабых людей меньше шансов быть выбранными, что приводит к потере разнообразия .
псевдокод:
choose k (the tournament size) individuals from the population at random
choose the best individual from pool/tournament with probability p
choose the second best individual with probability p*(1-p)
choose the third best individual with probability p*((1-p)^2)
and so on...
детерминированный выбор турнира выбирает лучшего человека (когда p = 1) в любом турнире. Турнир в одну сторону (k = 1) Выбор эквивалентен к случайному выбору. Выбранная особь может быть удалена из популяции, из которой производится отбор, если это необходимо, в противном случае особи могут быть выбраны более одного раза для следующего поколения. По сравнению с (стохастическим) методом пропорционального отбора пригодности, отбор турнира часто реализуется на практике из-за отсутствия стохастического шума.
выбор турнира в MatLab:
Matepool=randi(PopLength,PopLength,2);%%select two individuals randomly for tournament and chooose the one with best fitness value
%% number of tournament is equal to the number of population size
for i=1:PopLength
if Fitness(Matepool(i,1))>= Fitness(Matepool(i,2))
SelectedPop(i,1:IndLength)=CurrentPop(Matepool(i,1),1:IndLength);
else
SelectedPop(i,1:IndLength)=CurrentPop(Matepool(i,2),1:IndLength);
end
end