Я реализую метод выбора колеса рулетки для генетического алгоритма. Мой вопрос, по сути, довольно простой, но я не могу осмыслить его. В моей фитнес-функции, если ответ крайне неправильный, он может вернуть около -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];
}
(исходная ссылка здесь: GA, написанная на Java)
У меня мой 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% отличается от того, что мне нужно, я сделал его отрицательным, чтобы вставить его в конец отсортированного списка.