Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
0
 private void SortByFitness(Generation generation)
 {
     generation.People.Sort(delegate(Individual c1, Individual c2) { return(c1.fitness.CompareTo(c2.fitness)); });
 }