遗传算法中的锦标赛选择
tournament selection in genetic algorithm
我在遗传算法中执行以下程序来选择锦标赛:
choose k random individuals from population & select two best individuals among these k individuals to be parents.
正确吗?
考虑到您正在使用健身标准,这里有一个伪代码可以帮助您。
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
所以基本上你所遵循的方法是好的。虽然还有很多东西,比如交叉之类的,但我想你已经处理好了。
参考 link 有很好的解决方案- Tournament Selection in Genetic Algorithms
要扩展这个,
使用另一个变量 'better'。
做一些像-
better = best
best = ind
并且在 returning 时,return 一个对象是这两个变量的一对。
或者另一种方法是 - 调用同一个函数实例两次,它将 return BEST 和 BEST-1。需要对代码进行一些调整才能处理示例。
PS:这可能不是最佳方法。
锦标赛选择:
- 锦标赛选择是一种从个体群体中选择个体的方法。
- 锦标赛选择涉及 运行 几个 "tournaments" 从人群中随机选择的几个人。
- 选择每场比赛的获胜者(最适合的那个)进行交叉。
- 当锦标赛规模较小时,锦标赛选择也给了所有个体被选中的机会,因此它保留了多样性,尽管保持多样性可能会降低收敛速度。
- 但如果锦标赛规模较大,弱个体被选中的机会较小,导致多样性损失。
伪代码:
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
锦标赛选择是用于选择 parents 交叉的众多技术之一,就像轮盘赌选择一样。我还要指出的是,对于选择,除了适应度之外,还应该考虑分类器的experience/age来进行选择。 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;
}
我在遗传算法中执行以下程序来选择锦标赛:
choose k random individuals from population & select two best individuals among these k individuals to be parents.
正确吗?
考虑到您正在使用健身标准,这里有一个伪代码可以帮助您。
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
所以基本上你所遵循的方法是好的。虽然还有很多东西,比如交叉之类的,但我想你已经处理好了。
参考 link 有很好的解决方案- Tournament Selection in Genetic Algorithms
要扩展这个, 使用另一个变量 'better'。 做一些像-
better = best
best = ind
并且在 returning 时,return 一个对象是这两个变量的一对。
或者另一种方法是 - 调用同一个函数实例两次,它将 return BEST 和 BEST-1。需要对代码进行一些调整才能处理示例。
PS:这可能不是最佳方法。
锦标赛选择:
- 锦标赛选择是一种从个体群体中选择个体的方法。
- 锦标赛选择涉及 运行 几个 "tournaments" 从人群中随机选择的几个人。
- 选择每场比赛的获胜者(最适合的那个)进行交叉。
- 当锦标赛规模较小时,锦标赛选择也给了所有个体被选中的机会,因此它保留了多样性,尽管保持多样性可能会降低收敛速度。
- 但如果锦标赛规模较大,弱个体被选中的机会较小,导致多样性损失。
伪代码:
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
锦标赛选择是用于选择 parents 交叉的众多技术之一,就像轮盘赌选择一样。我还要指出的是,对于选择,除了适应度之外,还应该考虑分类器的experience/age来进行选择。 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;
}