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

どこ原子:

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

3 に答える 3

8

ランクの選択は、ルーレットのホイールの選択を知っていれば簡単に実装できます。選択される確率として適合度を使用する代わりに、ランクを使用します。したがって、N 個のソリューションの母集団の場合、最良のソリューションはランク N、2 番目に優れたランクは 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 に答える