我在GA
中實施了Roulette wheel selection
。
GA中的排名選擇?
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(人口中的染色體數量)。
首先,我要排序的人口的健身價值。
那麼如果人口數量是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
我是理解錯誤算法中?如果是的話,任何人都可以給我任何想法如何修改我的輪盤賭輪以選擇等級?
我已經實現了代碼,並且實現了像pop0ength = 10時給出0.1,0.2,0.3,... 1.0的功能。但是你告訴我給1/55,2/55,3/55 ...就像所以最後的候選人會得到10/55。是嗎? –
正確(答案已經寫在你編輯之前)。關鍵是,分配給每個人的「健身」只取決於**的位置,而不取決於實際的健身。與等級相關的值(.1,2或1/55,2/55 ...)與選擇壓力有關,這對於算法的性能非常重要,但不是主要方面。主要方面是基於等級的選擇在進化搜索 中保持不受「超個人」影響的恆定壓力。 – manlio