5

遺伝子アルゴリズムで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; 
+0

でコーディングしていますか?希望する[ディスカッション](http://stackoverflow.com/questions/10152002/building-ranking-with-genetic-algorithm)あなたを助ける。 – bonCodigo

+0

C++、これはプレーンなCの部分ですが、私はNokia QT Framework –

答えて

7

ランクの選択は、実装が容易です選択。選択を得る確率としてフィットネスを使用する代わりに、ランクを使用します。したがって、N個のソリューションの人口では、ベストソリューションはランクN、2番目に高いランクN-1などを取得します。最悪の個人はランク1になります。今度はルーレットホイールを使用して選択を開始します。

最も良い個体が選択される確率は、N /(N *(N + 1))/ 2)または約2/Nであり、最悪の個体については2 /(N * ))またはおおよそ2/N^2である。

これは、ランクが線形の進行を形成するため、線形ランク選択と呼ばれます。例えば、1/2^nのような幾何学的な進行を形成するランクについて考えることもできます。ここで、nは最善の個体の場合は1、最悪の場合はNです。これは、もちろん、最良の個体にはるかに高い確率を与える。

いくつかの選択方法の実装をHeuristicLabに見ることができます。

1

私はC++でテンプレート遺伝アルゴリズムクラスを作成しました。

私の遺伝的アルゴリズムのライブラリは、GeneticAlgorithmとGAPopulationから分離されています。これらはすべてテンプレートクラスで、APIドキュメントでその起源コードを見ることができます。

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 
関連する問題