4

そこで、遺伝的アルゴリズムのルーレット選択関数を次のように記述しました。

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 が終了することがあります。何か案は?

4

2 に答える 2

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

うっかりミス。

于 2010-10-28T23:22:34.410 に答える
0

私の推測では、問題はあなたが時々あなたのesfitnessの合計よりも少ないということです。ループの後に、またはその性質の何かの中に行pop[i].fitnessを入れてみて、何が返されるかを確認してください。return "ERROR: " + fitness + " / " + curFitness;forif

于 2010-10-28T22:51:58.963 に答える