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

时间:2012-12-01 13:17:53

标签: algorithm artificial-intelligence selection genetic-algorithm

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

我的轮盘赌代码在这里(我正在使用原子结构用于遗传原子):

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;

3 个答案:

答案 0 :(得分:8)

当你已经知道轮盘选择时,排名选择很容易实现。不使用适合度作为获得选择的概率,而是使用等级。因此,对于N个解决方案的群体,最佳解决方案获得等级N,第二最佳等级N-1等。最差的个体具有等级1.现在使用轮盘赌轮并开始选择。

选择最佳个体的概率是N /((N *(N + 1))/ 2)或大约2 / N,对于最差个体,它是2 /(N *(N + 1) )或大约2 / N ^ 2.

这称为线性等级选择,因为等级形成线性进展。您还可以考虑形成几何级数的等级,例如,例如,对于最佳个体,n的范围从1到最差个体的N.这当然会给最好的个体带来更高的概率。

您可以在HeuristicLab中查看一些选择方法的实现。

答案 1 :(得分: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

答案 2 :(得分:1)

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

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