public void Genetic_Algorithm_CrossOver() { Individual Random_individual; // Parent Generation - initial Generation Generation generation = Initialization(); Evaluate_Population(generation); GenerationCollection.Add(generation); // Childs Generation int Individual_1 = 0; int Individual_2 = 0; Individual New_Individual; Generation NewGeneration; for (int n = 0; n < NumberOfGeneration; n++) { NewGeneration = (Generation)generation.Clone(); double tempcost = 0; string msg = ""; for (int i = 0; i < generation.People.Count; i++) { tempcost += (double)(1 / generation.People[i].fitness); generation.People[i].cost = tempcost; msg += i.ToString() + generation.People[i].cost.ToString() + " " + (1 / generation.People[i].fitness).ToString() + Environment.NewLine; } for (int i = 0; i < UpdatePercentage; i++) { Individual_1 = RouletteSelection(generation); Individual_2 = RouletteSelection(generation); while (Individual_1 == Individual_2) { Individual_2 = RouletteSelection(generation); } // New_Individual = GenerationCollection[GenerationCollection.Count - 1].People.ElementAt(0); if (rand.NextDouble() < 0.5) { New_Individual = CrossOver(GenerationCollection[GenerationCollection.Count - 1].People.ElementAt(Individual_1), GenerationCollection[GenerationCollection.Count - 1].People.ElementAt(Individual_2)); } else if (rand.NextDouble() < 0.6) { New_Individual = CrossOver2(GenerationCollection[GenerationCollection.Count - 1].People.ElementAt(Individual_1), GenerationCollection[GenerationCollection.Count - 1].People.ElementAt(Individual_2)); } else { New_Individual = GenerationCollection[GenerationCollection.Count - 1].People.ElementAt(0); Random_individual = new Individual(); Random_individual.chromosome = New_Individual.chromosome.OrderBy(x => rand.Next()).ToList(); Random_individual.fitness = New_Individual.fitness; New_Individual = (Individual)Random_individual.Clone(); Random_individual = null; } NewGeneration.People.ElementAt(generation.People.Count - 1 - i).chromosome = null; NewGeneration.People.RemoveAt(generation.People.Count - 1 - i); NewGeneration.People.Insert(generation.People.Count - 1 - i, New_Individual); New_Individual.fitness = CalcFitness(New_Individual); } SortByFitness(NewGeneration); GenerationCollection.Add(NewGeneration); Crossover_Fitness.Add(NewGeneration.People[0].fitness); generation = NewGeneration; if (NewGeneration.People[0].fitness <= 0) { break; } } }
private void SortByFitness(Generation generation) { generation.People.Sort(delegate(Individual c1, Individual c2) { return(c1.fitness.CompareTo(c2.fitness)); }); }