遗传算法中的排名选择代码

5
我需要一份关于遗传算法中排序选择方法的代码。我已经创建了轮盘和锦标赛选择方法,但现在需要排名选择方法而我卡住了。
这是我的轮盘代码(我正在使用原子结构体进行基因操作):
const int roulette (const atom *f)
{
  int i;
  double sum, sumrnd;

  sum = 0;
  for (i = 0; i < N; i++)
    sum += f[i].fitness + OFFSET;

  sumrnd = rnd () * sum;

  sum = 0;
  for (i = 0; i < N; i++) {
    sum += f[i].fitness + OFFSET;
    if (sum > sumrnd)
      break;
  }

  return i;
}

Where atom :

typedef struct atom
{
  int geno[VARS];
  double pheno[VARS];
  double fitness;
} atom;

你在用哪种编程语言进行编码?希望这个讨论能对你有所帮助。 - bonCodigo
C++,这是一个纯C部分,但我正在Nokia QT框架中开发它。 - user1797989
3个回答

8
等级选择相对于轮盘赌选择来说容易实现。不同于使用适应度作为被选择概率,你可以使用等级。对于一个由N个解决方案组成的种群,最好的解决方案得到第N的等级,第二好的解决方案得到第N-1的等级,以此类推。最差的个体得到第1的等级。现在使用轮盘赌并开始选择。
最佳个体被选择的概率是N/((N*(N+1))/2),大约是2/N;最差个体的概率是2/(N*(N+1)),大约是2/N^2。
这被称为线性等级选择,因为等级形成线性进展。你也可以认为等级形成几何进展,比如1/2^n,其中n从最好的个体的1到最差的个体的N。当然,这会给最佳个体带来更高的概率。
你可以查看一些选择方法的实现,在HeuristicLab中。

2

我在MatLab中使用的等级选择代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接