コード例 #1
0
        public override double[] Probabilities(Population <TGene, TAllele> population, int count)
        {
            var fitness = new double[population.Count];

            // Copy the fitness values to probabilities arrays.
            fitness[0] = population[0].GetFitness().ToDouble(null);

            var min = fitness[0];
            var max = fitness[0];

            for (var i = 1; i < fitness.Length; ++i)
            {
                fitness[i] = population[i].GetFitness().ToDouble(null);
                if (fitness[i] < min)
                {
                    min = fitness[i];
                }
                else if (fitness[i] > max)
                {
                    max = fitness[i];
                }
            }

            var diff = max - min;

            if (ProbabilitySelector.Eq(diff, 0.0))
            {
                // Set equal probabilities if diff (almost) zero.
                //Array.Fill(fitness, 1.0 / fitness.Length);
                for (int index = 0; index < fitness.Length; index++)
                {
                    fitness[index] = 1.0 / fitness.Length;
                }
            }
            else
            {
                // Scale fitness values to avoid overflow.
                for (var i = fitness.Length; --i >= 0;)
                {
                    fitness[i] = (fitness[i] - min) / diff;
                }

                // Apply the "Boltzmann" function.
                for (var i = fitness.Length; --i >= 0;)
                {
                    fitness[i] = Math.Exp(_b * fitness[i]);
                }
            }

            return(Arithmetics.Normalize(fitness));
        }
コード例 #2
0
 public override bool Equals(object obj)
 {
     return(obj is LinearRankSelector <TGene, TAllele> selector &&
            ProbabilitySelector.Eq(selector._nminus, _nminus) &&
            ProbabilitySelector.Eq(selector._nplus, _nplus));
 }