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