matlab - GA中的排名选择?

标签 matlab selection genetic-algorithm

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

我看到了这些 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



我对算法的理解有误吗??如果是,那么谁能告诉我如何修改我的轮盘以进行排名选择??

最佳答案

如果种群有 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)

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

关于matlab - GA中的排名选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34961489/

相关文章:

java - 如何表示遗传算法中时间表问题的时间表?

matlab - 将匿名函数定义为 m 文件函数的 4 个输出中的 2 个

matlab - 如何根据第四个变量的数据为 scatter3 中的点着色?

algorithm - 如何避免在我的 while 循环中不必要地检查相同的 if 语句?

javascript - 如何找到文本选择的顶部父元素?

mysql - 选择的结果是数组,我想将它用于 "where in"另一个选择

c# - 哪种交叉方法最能让我们快速改变 GA 中 TSP 的最佳值?

data-structures - 类神经网络数据结构

matlab - 在 Matlab 中缩短它

html - 将选择选项文本的一部分左对齐,一部分右对齐?