public void CreateNewGeneration() { mGenerationCount++; mCurrentGeneration.Sort(); mNewGeneration = new List <IndividualDNA>(); mReproducers = new List <IndividualDNA>(); //Select individuals with best fitness for reproduction for (int i = 0; i < NumberOfReproducers; i++) { mReproducers.Add(mCurrentGeneration[i]); } mReproducers.Sort(); //Create Mother and Father sets of individuals List <IndividualDNA> Mothers = new List <IndividualDNA>(); List <IndividualDNA> Fathers = new List <IndividualDNA>(); CreateNewGeneration1(Mothers, Fathers); //Check for new Bestfit individual mCurrentGeneration.Sort(); if (Math.Abs(mCurrentGeneration[0].Fitness) < Math.Abs(mBestFitness.Fitness)) { mBestFitness = mCurrentGeneration[0]; } SaveReproducers(); Save(); }
public string ToEquation(IndividualDNA individual) { string equation = String.Empty; int exponent = 0; string op = String.Empty; foreach (double gene in individual.Genes) { if (gene >= 0) { op = " + "; } else { op = ""; } if (equation.Equals(String.Empty)) { op = ""; } equation = equation + op + gene.ToString() + "x^" + exponent.ToString() + " "; exponent++; } return(equation); }
private void CreateNewGeneration1(List <IndividualDNA> Mothers, List <IndividualDNA> Fathers) { Mothers = mReproducers; Fathers = mReproducers; IndividualDNA child = new IndividualDNA(); //Add the top n to the new generation mNewGeneration.Add(mCurrentGeneration[0]); mNewGeneration.Add(mCurrentGeneration[1]); //Perform cartesian product of Mothers and Fathers for reproduction foreach (IndividualDNA mother in Mothers) { foreach (IndividualDNA father in Fathers) { if (!father.Equals(mother)) { child = Reproduce(mother, father); child.Generation = GenerationCount; mNewGeneration.Add(child); } } } //if mNewGeneration is too small, fill it up with the //best from mCurrentGeneration int currentcount = 0; while (mNewGeneration.Count < mPopulationSize) { mNewGeneration.Add(mCurrentGeneration[currentcount % 50]); currentcount++; } //Calculate fitness of mNewGeneration EvaluateIndividuals(mNewGeneration); mNewGeneration.Sort(); //Make mNewGeneration the mCurrentGeneration mCurrentGeneration.Clear(); for (int i = 0; i < mPopulationSize; i++) { if (!mCurrentGeneration.Contains(mNewGeneration[i])) { mCurrentGeneration.Add(mNewGeneration[i]); } } currentcount = 0; while (mCurrentGeneration.Count < mPopulationSize) { mCurrentGeneration.Add(mNewGeneration[currentcount % 50]); currentcount++; } }
public IndividualDNA Crossover1(IndividualDNA _mother, IndividualDNA _father) { IndividualDNA child = new IndividualDNA(_mother.Terms); child = _mother; for (int i = 0; i < mCrossoverPoint; i++) { child.Genes[i] = _father.Genes[i]; } return(child); }
public int CompareTo(object obj) { int result = 1; if (obj != null && obj is IndividualDNA) { IndividualDNA w = obj as IndividualDNA; double comparex = Math.Abs(this.Fitness); double comparey = Math.Abs(w.Fitness); result = comparex.CompareTo(comparey); } return(result); }
static public int Compare(IndividualDNA x, IndividualDNA y) { int result = 1; double comparex = 0; double comparey = 0; if (x != null && y != null) { comparex = Math.Abs(x.Fitness); comparey = Math.Abs(y.Fitness); result = comparex.CompareTo(comparey); } return(result); }
public IndividualDNA RandomMutation(IndividualDNA _individual) { IndividualDNA MutatedDNA = new IndividualDNA(); MutatedDNA = _individual; Random rand = new Random(DateTime.Now.Millisecond); Random rand2 = new Random(Convert.ToInt32(10000 * rand.Next(-100, 100))); if (rand2.NextDouble() <= mChanceOfMutation) { MutatedDNA.Genes[rand2.Next(Terms / 2, Terms - 1)] = rand2.Next(-100, 100); } return(MutatedDNA); }
public void CreateInitialRandomGeneration() { IndividualDNA individual; for (int i = 0; i < mPopulationSize; i++) { individual = new IndividualDNA(mTerms, MinMaxFunctionValueY(FunctionValues)); individual.CreateInitialRandomGeneration(mCurrentGeneration.Count); mCurrentGeneration.Add(individual); } EvaluateIndividuals(mCurrentGeneration); mCurrentGeneration.Sort(); mBestFitness = mCurrentGeneration[0]; Save(); }
public IndividualDNA Crossover3(IndividualDNA _mother, IndividualDNA _father) { IndividualDNA child = new IndividualDNA(_mother.Terms); for (int i = 0; i < Terms; i++) { if (i % 2 == 0) { child.Genes[i] = _mother.Genes[i]; } else { child.Genes[i] = _father.Genes[i]; } } return(RandomMutation(child)); }
public IndividualDNA Crossover1(IndividualDNA _mother, IndividualDNA _father) { IndividualDNA child = new IndividualDNA(_mother.Terms); child = _mother; for (int i = 0; i < mCrossoverPoint; i++) { child.Genes[i] = _father.Genes[i]; } return child; }
public IndividualDNA Crossover3(IndividualDNA _mother, IndividualDNA _father) { IndividualDNA child = new IndividualDNA(_mother.Terms); for (int i = 0; i < Terms; i++) { if (i % 2 == 0) { child.Genes[i] = _mother.Genes[i]; } else { child.Genes[i] = _father.Genes[i]; } } return RandomMutation(child); }
public IndividualDNA Reproduce(IndividualDNA _mother, IndividualDNA _father) { return(Crossover3(_mother, _father)); }
public IndividualDNA RandomMutation(IndividualDNA _individual) { IndividualDNA MutatedDNA = new IndividualDNA(); MutatedDNA = _individual; Random rand = new Random(DateTime.Now.Millisecond); Random rand2 = new Random(Convert.ToInt32(10000 * rand.Next(-100, 100))); if (rand2.NextDouble() <= mChanceOfMutation) { MutatedDNA.Genes[rand2.Next(Terms/2, Terms - 1)] = rand2.Next(-100, 100); } return MutatedDNA; }
public IndividualDNA Reproduce(IndividualDNA _mother, IndividualDNA _father) { return Crossover3(_mother, _father); }
public void CreateNewGeneration() { mGenerationCount++; mCurrentGeneration.Sort(); mNewGeneration = new List<IndividualDNA>(); mReproducers = new List<IndividualDNA>(); //Select individuals with best fitness for reproduction for (int i = 0; i < NumberOfReproducers; i++) { mReproducers.Add(mCurrentGeneration[i]); } mReproducers.Sort(); //Create Mother and Father sets of individuals List<IndividualDNA> Mothers = new List<IndividualDNA>(); List<IndividualDNA> Fathers = new List<IndividualDNA>(); CreateNewGeneration1(Mothers, Fathers); //Check for new Bestfit individual mCurrentGeneration.Sort(); if (Math.Abs(mCurrentGeneration[0].Fitness) < Math.Abs(mBestFitness.Fitness)) mBestFitness = mCurrentGeneration[0]; SaveReproducers(); Save(); }
public IndividualDNAEnum(IndividualDNA[] list) { _DNA = list; }
public static int Compare(IndividualDNA x, IndividualDNA y) { int result = 1; double comparex = 0; double comparey = 0; if (x != null && y != null) { comparex = Math.Abs(x.Fitness); comparey = Math.Abs(y.Fitness); result = comparex.CompareTo(comparey); } return result; }
private void CreateNewGeneration1(List<IndividualDNA> Mothers, List<IndividualDNA> Fathers) { Mothers = mReproducers; Fathers = mReproducers; IndividualDNA child = new IndividualDNA(); //Add the top n to the new generation mNewGeneration.Add(mCurrentGeneration[0]); mNewGeneration.Add(mCurrentGeneration[1]); //Perform cartesian product of Mothers and Fathers for reproduction foreach (IndividualDNA mother in Mothers) { foreach (IndividualDNA father in Fathers) { if (!father.Equals(mother)) { child = Reproduce(mother, father); child.Generation = GenerationCount; mNewGeneration.Add(child); } } } //if mNewGeneration is too small, fill it up with the //best from mCurrentGeneration int currentcount = 0; while (mNewGeneration.Count < mPopulationSize) { mNewGeneration.Add(mCurrentGeneration[currentcount%50]); currentcount++; } //Calculate fitness of mNewGeneration EvaluateIndividuals(mNewGeneration); mNewGeneration.Sort(); //Make mNewGeneration the mCurrentGeneration mCurrentGeneration.Clear(); for (int i = 0; i < mPopulationSize; i++) { if (!mCurrentGeneration.Contains(mNewGeneration[i])) { mCurrentGeneration.Add(mNewGeneration[i]); } } currentcount = 0; while (mCurrentGeneration.Count < mPopulationSize) { mCurrentGeneration.Add(mNewGeneration[currentcount%50]); currentcount++; } }
public string ToEquation(IndividualDNA individual) { string equation = String.Empty; int exponent = 0; string op = String.Empty; foreach (double gene in individual.Genes) { if (gene >= 0) { op = " + "; } else { op = ""; } if (equation.Equals(String.Empty)) op = ""; equation = equation + op + gene.ToString() + "x^" + exponent.ToString() + " "; exponent++; } return equation; }