0

遺伝的アルゴリズムのルーレット ホイールのコードがあります。反復回数が 1000 回を超えるとプログラムにエラーが表示されますが、反復回数が 1000 回未満の場合は非常にうまく機能します。これが私のコードです。

private double[] roulleteWheel(double[] nilaiFitnessRil)
    {
        double[] resultRW = new double[nilaiFitnessRil.GetLength(0)];
        double[] probKromosom = new double[nilaiFitnessRil.GetLength(0)];
        double[] probKumulatif = new double[nilaiFitnessRil.GetLength(0)];
        double pilih=0;
        Random random = new Random();
        double rnd;
        double total = 0;
        double temp = 0;
        //count total fitness
        for (int i = 0; i < nilaiFitnessRil.Length; i++)
        {
            total += nilaiFitnessRil[i];

        }
        listBox1.Items.Add(string.Format("total fitness adalah {0}",total));
        //count probability for each chromosome
        listBox1.Items.Add("result of probabilty for each chromosome");
        for (int i = 0; i < nilaiFitnessRil.Length; i++)
        {
            probKromosom[i] = Math.Round(nilaiFitnessRil[i] / total, 4);
            listBox1.Items.Add(probKromosom[i].ToString());
        }
        //count cumulative probability
        listBox1.Items.Add("result of cumulative probabilty ");
        for (int i = 0; i < probKromosom.Length; i++)
        {
            temp += probKromosom[i];
            probKumulatif[i] = temp;
            listBox1.Items.Add(probKumulatif[i].ToString());
        }
        //selecting a chromosome by its cumulative probability with a random value

        listBox1.Items.Add(" roullete wheel");
        for (int n = 0; n < resultRil.Length; n++)
        {
            rnd = random.NextDouble() * 1.0 - 0.0;
            //listBox1.Items.Add(rnd.ToString());
            for (int i = 0; i < probKumulatif.Length; i++)
            {
           //this is where the Index was outside the bounds of the array appear 
                if (probKumulatif[i] <= rnd && probKumulatif[i + 1] > rnd ) 
                {
                    pilih = resultRil[i + 1];
                }
                else if ( rnd <= probKumulatif[0])
                {
                    pilih = resultRil[0];
                }


            }
            resultRil[n] = pilih;
            resultRW[n] = resultRil[n];
        }
        PrintArray(resultRW, listBox1);
            return resultRW;
    }

これは、インデックスが配列の境界外にあったため、プログラムが終了した場所です

 if (probKumulatif[i] <= rnd && probKumulatif[i + 1] > rnd ) 
                {
                    pilih = resultRil[i + 1];
                }
                else if ( rnd <= probKumulatif[0])
                {
                    pilih = resultRil[0];
                }
4

4 に答える 4

0

単純。ループの最後の実行で、probKumulatif[i + 1] が許可されていない probKumulatif[probKumulatif.Length] に到達しようとするためです。到達できる最大インデックスは probKumulatif[probKumulatif.Length-1] です。投稿する前にコードをデバッグしてみてください。

于 2013-04-23T03:42:28.123 に答える