/// <summary> /// Takes 2 parent gene vectors, selects a midpoint and then swaps the ends /// of each genome creating 2 new genomes which are stored in baby1 and /// baby2. /// </summary> /// <param name="mum"></param> /// <param name="dad"></param> /// <param name="baby1"></param> /// <param name="baby2"></param> private void Crossover(List <Gene> mum, List <Gene> dad, ref List <Gene> baby1, ref List <Gene> baby2) { //just return parents as offspring dependent on the rate //or if parents are the same if ((GAUtils.RandDouble() > CrossoverRate) || (mum == dad)) { baby1 = mum; baby2 = dad; return; } //determine a crossover point int crossOverPoint = GAUtils.RandInt(0, mum.Count - 1); // = 29 for (int i = 0; i < mum.Count; i++) { var crossed = Gene.Cross(mum[i], dad[i], i < crossOverPoint); baby1.Add(crossed[0]); baby2.Add(crossed[1]); } // swap the bits // for (int i = 0; i < crossOverPoint; ++i) // { // baby1.Add(mum[i]); // baby2.Add(dad[i]); // } // for (int i = crossOverPoint; i < mum.Count; ++i) // { // baby1.Add(dad[i]); // baby2.Add(mum[i]); // } }
public Gene(int numberOfBits) { Bits = new List <int>(); // create a random bit string (random genes) for (int i = 0; i < numberOfBits; ++i) { Bits.Add(GAUtils.RandInt(0, 1)); } }