예제 #1
0
        private void initDNA(bool[] booleanDNA)
        {
            float initialGene, a, b, var;

            bool[] bits;
            int    nVars = Fitness.nInputVars;

            if (booleanDNA == null)
            {
                for (int i = 0; i < nVars; i++)
                {
                    var         = (float)GARandomNumberGenerator.getNextfloat();
                    a           = (float)-Math.Pow(10, 1);
                    b           = (float)Math.Pow(10, 1);
                    initialGene = (b - a) * var + a;
                    DNA[i]      = initialGene;

                    //bits = float2bits(initialGene);
                    //for (int j = 0; j < 32; j++)
                    //    DNA[i * 32 + j] = bits[j];
                }
            }
            else
            {
                DNA = bits2floats(booleanDNA);
            }
        }
예제 #2
0
        public void evolve()
        {
            int i, j;
            //Individual[] children = new Individual[population.Length];

            // all population should reproduce
            Individual mom, dad, child1, child2;

            bool[] momDNA, dadDNA, child1DNA, child2DNA;
            for (i = 0; i <= population.Length - 1; i += 2)
            {
                mom    = population[i];     // clone();
                dad    = population[i + 1]; // clone();
                momDNA = mom.binaryDNA();
                dadDNA = dad.binaryDNA();

                ////////////////////////// crossover and mutation
                int crossoverPosition1, crossoverPosition2, temp;
                while (true)
                {
                    crossoverPosition1 = (int)(GARandomNumberGenerator.getNextfloat() * momDNA.Length);
                    crossoverPosition2 = (int)(GARandomNumberGenerator.getNextfloat() * momDNA.Length);
                    if (crossoverPosition1 != crossoverPosition2)
                    {
                        break;
                    }
                }
                if (crossoverPosition1 > crossoverPosition2)
                {
                    temp = crossoverPosition2;
                    crossoverPosition2 = crossoverPosition1;
                    crossoverPosition1 = temp;
                }

                child1DNA = new bool[momDNA.Length];
                child2DNA = new bool[momDNA.Length];
                for (j = 0; j < momDNA.Length; j++)
                {
                    // crossover
                    if (j >= crossoverPosition1 && j <= crossoverPosition2)
                    {
                        child1DNA[j] = dadDNA[j];
                        child2DNA[j] = momDNA[j];
                    }
                    else
                    {
                        child1DNA[j] = momDNA[j];
                        child2DNA[j] = dadDNA[j];
                    }

                    // mutation
                    if (GARandomNumberGenerator.getNextfloat() < options.MutationProbability)
                    {
                        child1DNA[j] = !child1DNA[j];
                    }
                    if (GARandomNumberGenerator.getNextfloat() < options.MutationProbability)
                    {
                        child2DNA[j] = !child2DNA[j];
                    }
                }
                child1 = new Individual(child1DNA);
                child2 = new Individual(child2DNA);
                //children[i] = child1;
                //children[i+1] = child2;
                population[i]     = child1;
                population[i + 1] = child2;
                /////////////////////////////////////
            }

            // insert the children into the population except the best individual
            //population = children;
            population[bestIndex] = bestIndividual; // clone();

            // scramble population;
            int[] scrambledIndexes = new int[population.Length];
            for (i = 0; i < population.Length; i++)
            {
                scrambledIndexes[i] = i;
            }
            scrambledIndexes = ShuffleArray(scrambledIndexes);
            Individual[] p = new Individual[population.Length];
            for (i = 0; i < population.Length; i++)
            {
                p[i] = population[scrambledIndexes[i]];
            }
            population = p;
            return;
        }