Функция выбора рулетки для генетического алгоритма
Итак, я написал функцию выбора рулетки для моего генетического алгоритма:
public String tournament(float fitness, Chromosome pop[], int selection)
{
// roulette
if (selection == 1)
{
Random random = new Random();
float slice = random.nextFloat() * fitness;
float curFitness = 0.0f;
for (int i = 0; i < initialPopulation; i++)
{
curFitness += pop[i].fitness;
if (curFitness >= slice)
return pop[i].bits;
}
}
return "";
}
Проблема в том, что он иногда возвращает пустую строку, которая была помещена только для удовлетворения условия возврата. Как правило, это не проблема, но во время некоторых прогонов это приводит к завершению GA, так как следующий шаг включает стадию кроссовера. Есть идеи?
2 ответа
Таким образом, оказывается, что функция мутации иногда обнуляла некоторые из моих битовых строк, в результате чего в популяции содержались пустые строки.
Раньше это выглядело так:
public String mutate(String bits)
{
Random random = new Random();
StringBuffer buf = new StringBuffer(bits);
for (int i = 0; i < bits.length(); i++)
{
if (random.nextFloat() < mutationRate)
{
if (bits.charAt(i) == '1')
{
buf.setCharAt(i, '0');
return buf.toString();
}
else
{
buf.setCharAt(i, '1');
return buf.toString();
}
}
}
return "";
}
И я изменил это на это:
public String mutate(String bits)
{
Random random = new Random();
StringBuffer buf = new StringBuffer(bits);
for (int i = 0; i < bits.length(); i++)
{
if (random.nextFloat() < mutationRate)
{
if (bits.charAt(i) == '1')
{
buf.setCharAt(i, '0');
}
else
{
buf.setCharAt(i, '1');
}
}
}
return buf.toString();
}
Неосторожная ошибка.
Я думаю, что проблема в том, что ваш fitness
иногда меньше, чем сумма вашего pop[i].fitness
эс. Попробуйте положить return "ERROR: " + fitness + " / " + curFitness;
линия после for
цикл, но в пределах if
или что-то в этом роде, и посмотрим, что возвращается.