【问题标题】:Rank Selection in GA?GA中的排名选择?
【发布时间】:2016-04-29 22:13:22
【问题描述】:

我在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(种群中的染色体数)。

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

  1. 首先我将对人口的适应度值进行排序。

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

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

我的实现:

  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



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

【问题讨论】:

    标签: matlab selection genetic-algorithm


    【解决方案1】:

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

    这是一个线性排名选择:排名是线性的。还有其他排名选择方案(例如指数)。

    【讨论】:

    • 我已经实现了代码,我实现了当popLength=10时给出0.1,0.2,0.3,...1.0。但是你告诉我给出1/55,2/55,3/55 ...这样。所以最后一个候选人将获得 10/55。是吗??
    • 正确(答案已在您编辑之前写好)。关键是分配给每个个体的“适应度”取决于其位置,而不取决于实际适应度。与等级相关的值(.1、.2 或 1/55、2/55...)与 选择压力 有关,这对算法的性能非常重要,但不是主要方面。主要方面是基于等级的选择在进化搜索中保持恒定的压力,不受“超级个体”的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2014-12-25
    • 2014-12-23
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多