我在遗传算法中进行锦标赛选择的程序:
从人口中选择k个随机个体&选择这些k个人中最好的两个人作为父母。
是正确的吗?
答案 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;
}