public EvoResults Evolve(IEnumerable <double[]> initialPopulation) { EvoResults results = new EvoResults() { Generations = new GenerationResults[Generations] }; Individual[] pop = new Individual[Parents + Children]; for (int i = 0; i < initialPopulation.Count(); i++) { pop[i] = new Individual() { Fitness = 0, Genome = initialPopulation.ElementAt(i) } } ; for (int i = initialPopulation.Count(); i < pop.Length; i++) { pop[i] = new Individual() { Fitness = 0, Genome = createChild(pop[i % initialPopulation.Count()].Genome) } } ; for (int curGen = 0; curGen < Generations; curGen++) { Console.WriteLine("Generation #{0}", curGen); FitnessFunction.Evaluate(pop); Array.Sort(pop, delegate(Individual ind1, Individual ind2) { int compare = ind2.Fitness.CompareTo(ind1.Fitness); return(compare); }); if (pop[0].Fitness < pop[1].Fitness) { throw new Exception("Sorted the wrong way!"); } GenerationResults gen = new GenerationResults() { Champion = new double[pop[0].Genome.Length], Fitness = pop[0].Fitness }; pop[0].Genome.CopyTo(gen.Champion, 0); results.Generations[curGen] = gen; for (int i = Parents; i < pop.Length; i++) { createChild(pop[i % Parents].Genome, pop[i].Genome); } } return(results); }
public EvoResults Evolve(IEnumerable<double[]> initialPopulation) { EvoResults results = new EvoResults() { Generations = new GenerationResults[Generations] }; Individual[] pop = new Individual[Parents + Children]; for (int i = 0; i < initialPopulation.Count(); i++) pop[i] = new Individual() { Fitness = 0, Genome = initialPopulation.ElementAt(i) }; for (int i = initialPopulation.Count(); i < pop.Length; i++) pop[i] = new Individual() { Fitness = 0, Genome = createChild(pop[i%initialPopulation.Count()].Genome)}; for (int curGen = 0; curGen < Generations; curGen++) { Console.WriteLine("Generation #{0}", curGen); FitnessFunction.Evaluate(pop); Array.Sort(pop, delegate(Individual ind1, Individual ind2) { int compare = ind2.Fitness.CompareTo(ind1.Fitness); return compare; }); if (pop[0].Fitness < pop[1].Fitness) throw new Exception("Sorted the wrong way!"); GenerationResults gen = new GenerationResults() { Champion = new double[pop[0].Genome.Length], Fitness = pop[0].Fitness }; pop[0].Genome.CopyTo(gen.Champion, 0); results.Generations[curGen] = gen; for (int i = Parents; i < pop.Length; i++) createChild(pop[i % Parents].Genome, pop[i].Genome); } return results; }