2015-08-11 2 views
0

я эту процедуру для турнира отбора в генетическом алгоритме:турнирный отбор генетического алгоритма

выбирают K случайных лиц из населения & выбрать один из двух лучших особей среди этих к индивидуумов быть родителями.

Правильно ли это?

+0

'выбрать двух лучших людей'? Не уверен в этом. Во-первых, ваш образец является подмножеством = 'k'. Вы должны выбирать на основе пола и лучших черт. – bozzmob

+0

Я выбираю на основе значений пригодности, –

ответ

3

Учитывая, что вы используете критерии пригодности, вот псевдокод, который может вам помочь.

func tournament_selection(pop, k): 
best = null 
for i=1 to k 
    ind = pop[random(1, N)] 
    if (best == null) or fitness(ind) > fitness(best) 
     best = ind 
return best 

Так что в основном подход, которым вы следуете, в порядке. Хотя в этом есть нечто большее, как кроссовер и прочее, я думаю, вы позаботились об этом.

Ссылка связь с большим Tournament Selection in Genetic Algorithms

раствора-

Чтобы продлить это, использовать другую переменную 'лучше'. ли что-то как-

better = best 
best = ind 

и при возвращении, возвращает объект, который представляет собой пару из этих 2-х переменных.

Или другой подход - если вы вызовите один и тот же экземпляр функции дважды, он вернет BEST и BEST-1. Для обработки образца необходимы некоторые настройки кода.

PS: Это может быть не оптимальный подход.

+0

, как вы знаете, этот псевдокод возвращает одного человека (лучший). У меня должно быть два человека, чтобы образовать родителей, чтобы получить потомство! (Я имею в виду пару человек) –

+0

Могу ли я получить двух лучших людей из этих случайных случайных людей, чтобы сформировать родителей? –

+0

Да. Вызывая тот же турнир_selection() дважды, вы получите лучшие и лучшие-1 варианты из набора параметров, которые у вас есть. Или другой подход, поддерживая другую переменную, называемую «лучше» и играя с кодом. Внутри условия if write- better = best; best = ind; Надеюсь, что это поможет :) – bozzmob

3

турнир Выбор:

  • Выбор турнира является методом выбора индивидуума из популяции особей.
  • Выбор турнира включает в себя запуск нескольких «турниров» среди нескольких лиц, выбранных случайным образом из населения.
  • Победитель каждого турнира (тот, который имеет лучший фитнес) выбран для кроссовера.
  • Когда размер турнира меньше, выбор турнира также дает возможность выбрать всех людей и, таким образом, сохраняет разнообразие, хотя сохранение разнообразия может ухудшить скорость конвергенции.
  • Но если размер турнира больше, слабый человек имеет меньший шанс быть выбранным, вызывая потерю разнообразия.

псевдокода:

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... 

Детерминированная Выбор турнира выбирает лучший индивидуальный (при р = 1) в любом турнире. Выбор из 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 
0

Выбор турнир является один из многих методов, используемых для выбора родителей для кроссовера, как при выборе колеса рулетки. Я также хотел бы отметить, что для отбора, помимо пригодности, также следует учитывать опыт/возраст классификатора. Бета будет фактором для вклада по фитнесу и 1-бета для опыта. Фрагмент кода находится в java.

ArrayList<Genotype> Crossover (ArrayList Population){ 
    ArrayList<Genotype> selected= ArrayList<Genotype>(); 
    Geneotype best=NULL, second_best=NULL; 
    for(int i=0; i<k;i++){ 
    int prob= Math.random()+Population.size(); // generate a number between 0 and last index of arraylist 
     if(best==NULL || best.fitness<Population.get(prob).fitness) 
     best= Population.get(prob); 
     else{ 
     if(second_best.fitness<Population.get(prob).fitness) 
      best= Population.get(prob); 
     } 
    Population.remove(prob); // Wil not affect the actual population because parameters are pass by value not reference 
    selected.add(best); 
    selected.add(second_best); 
    return selected; 
} 
Смежные вопросы