0

遺伝的アルゴリズムのためのルーレットホイール選択法を実装しています。私の質問は、本質的には非常に単純ですが、頭を悩ませることはできません。私の適応度関数では、答えが極端に間違っていると、約-3000%が返される可能性があります。私の問題は、結果に確率を割り当てようとすると、間違った答えに偏ってしまうことです。

例:パーセンテージが配列内にあり、[92、68、5、-4、-3546](高いものから低いものへ)の場合、低いインデックスの数値に、数値よりも選択される可能性を高くする必要があります。より高いインデックスで。

適応度関数を無視して、大きな負の数を考慮に入れて、これに基づいて確率を作成するにはどうすればよいですか?

私がいじくり回したいくつかの基本的なコードは、別の質問で見つかりました:

public Individual rouletteWheelSelection() { 
    double randNum = m_rand.nextDouble() * this.totalFitness; 
    int idx; 
    for (idx=0; idx<POP_SIZE && randNum>0; ++idx) { 
        randNum -= m_population[idx].getFitnessValue(); 
    } 
    return m_population[idx-1]; 
} 

(元のリンクはこちら:Javaで書かれたGA

GAを別の選択方法で機能させていましたが、代わりにこれを変更して機能させようとしています。どんな助けでも大歓迎です。

***編集

次のコードは、私が変更したrouletteWheelSelectionです。

private Chromosome rouletteWheelSelection(){
    double randNum = Math.abs(rand_num.nextDouble() * totalFitness);
    int idx;
    for (idx=0;idx<NUM_CHROMOSOMES && randNum>0;++idx){
        randNum -= Math.abs(population[idx].getFitness());
    }
    return population[NUM_CHROMOSOMES-idx];
}

これが私の適応度関数です:

public double getFitness()
{
    String working = bitString;
    int x1 = Integer.parseInt(working.substring(0,6),2);
    int x2 = Integer.parseInt(working.substring(6),2);
    double result = ScratchGA.functionTest(x1,x2);
    double percentAccuracy = (1- Math.abs(((ScratchGA.getDesired() - result)/ScratchGA.getDesired())))*100;
    if (percentAccuracy <= 100)
    {
    return percentAccuracy;
    }
    else
    {
    return -percentAccuracy;
    }
}

値が必要な値と100%以上異なるという考えで、ソートされたリストの最後まで押し込むことを否定的にしました。

4

2 に答える 2

2

質問に示されている選択方法は、正またはヌルの適合度値でのみ暗黙的に機能します。

負の値の場合、totalFitnessの計算に関して最初の質問が発生します。これは、フィットネス値の代数的な合計ですか、それともその絶対値で機能する必要がありますか。

randNumが[想定される]減少した場合、より深刻な問題が発生しますが、何らかの理由で負の適合度値がRandNumの再成長をもたらします。

正の値のみを返すように適応度関数を変更することをお勧めします。

簡単なアプローチは次のようになります。

if (fitValue >= -5000)
  fitValue += 5000;
else
  fitvalue = 0;

ここで、-5000は、意味があると考える最も負の値として任意に選択されます。事実上、これは、ルーレット盤で避けようとしている、最も妥当性の低いソリューションの切り捨て選択の形式を提供しますが、現在の適応度関数は、範囲の負の側に向かって強く歪んでいるように見えます(または、マイナス面)。

問題の追加されたスニペットとコメントを考慮して編集します。Absを
使用して効果的に編集します。あなたのバージョンの値rouletteWheelSelection()は、私の最初の応答にリストされている「より深刻な」問題を処理します。
ただし、getFitness()疑わしいように、関数は負の値を優先して非常に歪んでいます。その動作範囲は[some_potentially_very_negative_value、+100]です。コードを参照してください。返される最大値は+100ですが、の値が値と大きく異なる
場合、大きな負の値が返される可能性があります。 負のリターンが100(絶対値)よりもはるかに大きくなるのを防ぐために、ある種の正規化が必要であるように思われます。 このところで、ScratchGA.functionTest(x1,x2)ScratchGA.getDesired()


このような適応度関数を使用すると、rouletteWheelSelection()がパフォーマンスの低い染色体を優先する理由をよく説明します

たとえば、それぞれの適応度の値が80、70、30、20、および-250の5番染色体の母集団があるとします。合計は450で、4つの染色体すべてが正の適合度で200、1つの染色体が負の適合度で250です。この例の例では、より悪い染色体を選ぶチャンスよりも良いです!
ルーレットホイールの選択の背後にある考え方は、可能性を提供することです最適な適合度に満たない染色体を選択する可能性がありますが、任意の染色体を選択する確率は、染色体が適合度値の全体的な合計に寄与する量に比例する必要があります。あなたが持っている実装はこれを効果的に行いますが、問題は、負のフィットネスの合計に寄与する値が、正のフィットネス値が提供するものに不釣り合いに見えることです。

于 2012-10-08T01:09:54.617 に答える
0

常に母集団の最悪の適応度を加算または減算するという点で、ウィンドウ処理を使用できます。選択範囲が0から正の値に拡大するようにします。最悪の個人が選ばれる可能性は決してありません(トーナメントの選択と同様)。なぜなら、値をウィンドウ化しない場合、フィットネス98の個人は、95および96の個人とほぼ同じ選択圧を持ちます。母集団に低品質のソリューションが含まれている限り、それは問題ありませんが、すべてのソリューションが90年代にある場合選択圧は大幅に低下します。母集団が最適なソリューションに収束するにつれて、ランダム検索のように振る舞うことがますます増えます。あなたの母集団のより細かい詳細(違い)を考慮した場合にのみ、指示された探索を行うことができます。

于 2012-10-09T05:58:38.193 に答える