Генетический Алгоритм Выбора Турнира

Если я только выбираю 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