2011-02-02 283 views
8

我在写一个遗传算法,我打算从轮盘选择转移到锦标赛选择,但我怀疑我的理解可能有缺陷。遗传算法锦标赛选择

如果我只是在人群中选择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); 
    } 
} 

我是否理解正确吗?

+0

请相应地格式化你的代码。 http://stackoverflow.com/editing-help – bdhar 2011-02-02 10:22:07

+0

哦,对不起! 看起来像别人已经有了,我会记住下次。 – Reu 2011-02-02 10:25:13

回答

9

在锦标赛选择中,选定的个人不会从人口中移除。您可以选择同一个人参加多个锦标赛。

看着你的代码更接近一点,我发现你还有另一个误解。你通常不会改变/交叉比赛的所有成员。相反,你进行一场比赛,选择该比赛的胜者作为个体进行突变/交叉。这意味着对于突变,你的锦标赛尺寸必须至少为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); 
    } 
} 
1

如果你在每一代中选择从人口N/2个人,你最终会达到一个点,你必须为1的人群,你什么除了选择之外,还想要为下一代使用变异或交叉来创造新成员,通常是那些在锦标赛中获胜的人。

因此,对于每一代人,您都有一个大小为n的人口 - 通过您的选择将其减少到n/2,然后这些n/2成员重现和/或变异以产生大约n/2个成员你的下一代(平均而言,这将比那些没有从上一代进步的人更加'更健康')。

0

锦标赛选择:

  • 锦标赛选择是从个体的群体中选择的个体的方法。
  • 锦标赛选择包括在从群体中随机选择的几个人中进行几次“锦标赛”。
  • 每个锦标赛的胜者(具有最佳身体素质的)被选为交叉。
  • 当锦标赛规模较小时,锦标赛选择也给所有人选择机会,因此它保留了多样性,但保持多样性可能会降低收敛速度。
  • 但是,如果锦标赛规模较大,弱个体选择机会较小会导致多样性的丧失。

伪代码:

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