Функция выбора рулетки для генетического алгоритма - PullRequest
4 голосов
/ 29 октября 2010

Итак, я написал функцию выбора рулетки для моего генетического алгоритма:

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 ]

2 голосов
/ 29 октября 2010

Таким образом, оказывается, что функция мутации иногда обнуляла некоторые из моих битовых строк, из-за чего в населении содержались пустые строки.

Раньше это выглядело так:

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();
}

Неосторожная ошибка.

0 голосов
/ 29 октября 2010

Я думаю, проблема в том, что ваши fitness иногда меньше суммы ваших pop[i].fitness es.Попробуйте поставить строку return "ERROR: " + fitness + " / " + curFitness; после цикла for, но внутри if, или что-то в этом роде, и посмотрите, что возвращается.

...