遗传算法中的锦标赛选择

时间:2015-08-11 05:23:10

标签: genetic-algorithm

我在遗传算法中进行锦标赛选择的程序:

  

从人口中选择k个随机个体&选择这些k个人中最好的两个人作为父母。

是正确的吗?

3 个答案:

答案 0 :(得分:5)

考虑到您使用的是健身标准,这里有一个可以帮助您的伪代码。

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

并在返回时返回一个对象,这是一对这两个变量。

或者另一种方法是 - 两次调用相同的函数实例,它将返回BEST和BEST-1。代码中需要进行一些调整才能处理Sample。

PS:这可能不是最佳方法。

答案 1 :(得分:4)

锦标赛选择:

  • 比赛选择是一种从个人群体中选择个人的方法。
  • 锦标赛选择涉及在从人群中随机选择的少数人中进行几次“锦标赛”。
  • 选择每场锦标赛的冠军(健身最佳的冠军)进行交叉。
  • 当锦标赛规模较小时,锦标赛选择也为所有人提供了选择机会,因此保留了多样性,但保持多样性可能会降低收敛速度。
  • 但如果锦标赛规模较大,那么弱势群体被选中的机会较小会导致失去多样性。

<强>伪代码:

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

答案 2 :(得分:1)

锦标赛选择是用于选择父母进行交叉选择的众多技巧之一,如轮盘赌选择。我还想指出,除了健身之外,选择经验/年龄也应该考虑选择。 Beta是健身贡献的因素,1-beta是体验。代码片段在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;  
}