GA中的排名选择?

时间:2016-01-23 08:50:29

标签: matlab selection genetic-algorithm

我已在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

现在我尝试在rank selection中实施GA。我了解到:

  • 排名选择首先对人口进行排名,然后每个染色体从该排名中获得适应度。

  • 最差的将是健身1,第二差2等等,最好的将具有适应度N(人口中的染色体数量)。

我看到了这些link1link2,我理解的是:

  1. 首先,我将对人口的健身价值进行排序。

  2. 然后,如果人口数是10,那么我将给人口选择的概率如0.1,0.2,0.3,......,1.0。

  3. 然后我会计算轮盘赌的累积健身。
  4. 接下来的步骤和轮盘赌一样。
  5. 我的实施:

      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
    



    我理解算法错了吗?如果是,那么任何人都可以告诉我如何修改我的轮盘赌排名选择??

1 个答案:

答案 0 :(得分:6)

如果人口中有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)

这是线性排名选择:排名呈线性增长。还有其他等级选择方案(例如指数)。