Пример #1
0
        public static IIndividual CrossOver(List <IIndividual> parents, Random random)
        {
            var newInd = new GotchaIndividual();

            for (var ii = 0; ii < 4; ++ii)
            {
                for (var jj = 0; jj < 4; ++jj)
                {
                    //33% chance of taking single random parent gene, 66% chance of taking average of all parents
                    var dice = random.Next(0, 3);
                    if (dice < 1)
                    {
                        //Take average of parents respective alleles
                        var tot = 0.0f;
                        for (var kk = 0; kk < parents.Count; ++kk)
                        {
                            var par = (GotchaIndividual)parents[kk];
                            tot += par.mGradient[ii][jj];
                        }
                        tot = tot / parents.Count;
                        newInd.mGradient[ii][jj] = tot;
                    }
                    else //Take single parent gene randomly
                    {
                        newInd.mGradient[ii][jj] = ((GotchaIndividual)parents[random.Next(0, parents.Count)]).mGradient[ii][jj];
                    }
                }
            }

            return(newInd);
        }
Пример #2
0
 public GotchaIndividual(GotchaIndividual other)
 {
     mGradient = new float[4][];
     for (var ii = 0; ii < 4; ++ii)
     {
         mGradient[ii] = new float[4];
         for (var jj = 0; jj < 4; ++jj)
         {
             mGradient[ii][jj] = other.mGradient[ii][jj];
         }
     }
     mName = IndividualTools.CreateName();
 }
Пример #3
0
        public IIndividual Mutate(float probability, float sigma, Random rng)
        {
            var newInd = new GotchaIndividual(this);

            for (var ii = 0; ii < 4; ++ii)
            {
                for (var jj = 0; jj < 4; ++jj)
                {
                    if (rng.ProbabilityPass(probability))
                    {
                        newInd.mGradient[ii][jj] = (float)(mGradient[ii][jj] + rng.GausianNoise(sigma));
                    }
                }
            }
            return(newInd);
        }