5

我需要遗传算法的排名选择方法的代码。我已经创建了轮盘赌和锦标赛选择方法,但现在我需要排名并且我被卡住了。

我的轮盘赌代码在这里(我将 atom struct 用于遗传原子):

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;
}

其中原子:

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

3 回答 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中查看一些选择方法的实现。

于 2012-12-04T05:59:46.397 回答
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
于 2016-01-26T13:04:44.453 回答
1

我在 C++ 中创建了一个模板遗传算法类。

我的遗传算法库与遗传算法和 GAPopulation 是分开的。这些都是模板类,因此您可以在 API 文档中查看其原始代码。

于 2015-11-03T05:17:56.640 回答