遺伝的アルゴリズムのためのルーレットホイール選択法を実装しています。私の質問は、本質的には非常に単純ですが、頭を悩ませることはできません。私の適応度関数では、答えが極端に間違っていると、約-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%以上異なるという考えで、ソートされたリストの最後まで押し込むことを否定的にしました。