GA中的排名选择?
Rank Selection in GA?
我在GA
中实现了Roulette wheel selection
。
TotalFitness=sum(Fitness);
ProbSelection=zeros(PopLength,1);
CumProb=zeros(PopLength,1);
for i=1:PopLength
ProbSelection(i)=Fitness(i)/TotalFitness;
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
现在我试图在 GA
中实现 rank selection
。我了解到:
排名选择首先对种群进行排名,然后每条染色体从该排名中获得适应度。
最差的适应度为 1,第二差的为 2,依此类推,最好的适应度为 N(种群中的染色体数)。
我看到了这些 link1 and link2 我的理解是:
首先我将对种群的适应度值进行排序。
然后如果人口数是 10 那么我会给人口选择概率 0.1,0.2,0.3,...,1.0 .
- 然后我会像轮盘一样计算累积健身。
- 接下来的步骤与轮盘相同。
我的实现:
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
我对算法的理解有误吗??如果是那么谁能告诉我如何修改我的轮盘以进行排名选择?
如果种群有 N
个个体,最好的个体获得排名 N
,最差的 1
然后
TotalFitness = sum(Fitness);
应更改为:
TotalFitness = (N + 1) * N / 2;
(可能 TotalFitness
不再是变量的正确名称,但随它去吧)
(N + 1) * N / 2
只是行列之和:
1 + 2 + ... + N = (N + 1) * N / 2
选择的概率应更改为:
ProbSelection(i) = Fitness(i) / TotalFitness;
到
ProbSelection(i) = i / TotalFitness;
这里使用排名而不是适应度,并假设种群中第一个个体最差,最后一个个体最好(排序种群)。
因此排名选择算法的复杂度主要取决于排序的复杂度(O(N * log(N)
)。
可以看到最差个体被选中的概率为:
1 / ((N + 1) * N / 2) = 2 / ((N + 1) * N)
最佳个人的概率是:
N / (((N + 1) * N / 2)) = 2 * (N + 1)
这是一个线性排名选择:排名呈线性递增。还有其他排名选择方案(例如指数)。
我在GA
中实现了Roulette wheel selection
。
TotalFitness=sum(Fitness);
ProbSelection=zeros(PopLength,1);
CumProb=zeros(PopLength,1);
for i=1:PopLength
ProbSelection(i)=Fitness(i)/TotalFitness;
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
现在我试图在 GA
中实现 rank selection
。我了解到:
排名选择首先对种群进行排名,然后每条染色体从该排名中获得适应度。
最差的适应度为 1,第二差的为 2,依此类推,最好的适应度为 N(种群中的染色体数)。
我看到了这些 link1 and link2 我的理解是:
首先我将对种群的适应度值进行排序。
然后如果人口数是 10 那么我会给人口选择概率 0.1,0.2,0.3,...,1.0 .
- 然后我会像轮盘一样计算累积健身。
- 接下来的步骤与轮盘相同。
我的实现:
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
我对算法的理解有误吗??如果是那么谁能告诉我如何修改我的轮盘以进行排名选择?
如果种群有 N
个个体,最好的个体获得排名 N
,最差的 1
然后
TotalFitness = sum(Fitness);
应更改为:
TotalFitness = (N + 1) * N / 2;
(可能 TotalFitness
不再是变量的正确名称,但随它去吧)
(N + 1) * N / 2
只是行列之和:
1 + 2 + ... + N = (N + 1) * N / 2
选择的概率应更改为:
ProbSelection(i) = Fitness(i) / TotalFitness;
到
ProbSelection(i) = i / TotalFitness;
这里使用排名而不是适应度,并假设种群中第一个个体最差,最后一个个体最好(排序种群)。
因此排名选择算法的复杂度主要取决于排序的复杂度(O(N * log(N)
)。
可以看到最差个体被选中的概率为:
1 / ((N + 1) * N / 2) = 2 / ((N + 1) * N)
最佳个人的概率是:
N / (((N + 1) * N / 2)) = 2 * (N + 1)
这是一个线性排名选择:排名呈线性递增。还有其他排名选择方案(例如指数)。