我需要遗传算法ranking selection method的代码。 我已经创建了轮盘赌和锦标赛选择方法,但现在我需要排名而且我被卡住了。
我的轮盘赌代码在这里(我正在使用原子结构用于遗传原子):
const int roulette (const atom *f)
{
int i;
double sum, sumrnd;
sum = 0;
for (i = 0; i < N; i++)
sum += f[i].fitness + OFFSET;
sumrnd = rnd () * sum;
sum = 0;
for (i = 0; i < N; i++) {
sum += f[i].fitness + OFFSET;
if (sum > sumrnd)
break;
}
return i;
}
原子:
typedef struct atom
{
int geno[VARS];
double pheno[VARS];
double fitness;
} atom;
答案 0 :(得分:8)
当你已经知道轮盘选择时,排名选择很容易实现。不使用适合度作为获得选择的概率,而是使用等级。因此,对于N个解决方案的群体,最佳解决方案获得等级N,第二最佳等级N-1等。最差的个体具有等级1.现在使用轮盘赌轮并开始选择。
选择最佳个体的概率是N /((N *(N + 1))/ 2)或大约2 / N,对于最差个体,它是2 /(N *(N + 1) )或大约2 / N ^ 2.
这称为线性等级选择,因为等级形成线性进展。您还可以考虑形成几何级数的等级,例如,例如,对于最佳个体,n的范围从1到最差个体的N.这当然会给最好的个体带来更高的概率。
您可以在HeuristicLab中查看一些选择方法的实现。
答案 1 :(得分:2)
我在MatLab中的排名选择代码:
NewFitness=sort(Fitness);
NewPop=round(rand(PopLength,IndLength));
for i=1:PopLength
for j=1:PopLength
if(NewFitness(i)==Fitness(j))
NewPop(i,1:IndLength)=CurrentPop(j,1:IndLength);
break;
end
end
end
CurrentPop=NewPop;
ProbSelection=zeros(PopLength,1);
CumProb=zeros(PopLength,1);
for i=1:PopLength
ProbSelection(i)=i/PopLength;
if i==1
CumProb(i)=ProbSelection(i);
else
CumProb(i)=CumProb(i-1)+ProbSelection(i);
end
end
SelectInd=rand(PopLength,1);
for i=1:PopLength
flag=0;
for j=1:PopLength
if(CumProb(j)<SelectInd(i) && CumProb(j+1)>=SelectInd(i))
SelectedPop(i,1:IndLength)=CurrentPop(j+1,1:IndLength);
flag=1;
break;
end
end
if(flag==0)
SelectedPop(i,1:IndLength)=CurrentPop(1,1:IndLength);
end
end
答案 2 :(得分:1)
我在C ++中制作了一个模板遗传算法类。
我的遗传算法库与GeneticAlgorithm和GAPopulation分开。这些都是模板类,因此您可以在API文档中查看其原始代码。