Пример #1
0
        public ChromosomePair CrossOver()
        {
            Int32 chromoLen = Individual1.Route.Count;

            Int32 lcp = RandomExtension.Instance.Next(chromoLen - 2);      //left crossover point
            Int32 rcp = RandomExtension.Instance.Next(lcp, chromoLen - 1); //right crossover point

            Chromosome offspring1 = new Chromosome(Individual1, isShuffled: false);
            Chromosome offspring2 = new Chromosome(Individual2, isShuffled: false);

            #region DebugWriteLines
            //    Console.WriteLine("parent1");
            //    Individual1.PrintRoute();
            //    Console.WriteLine("parent2");
            //    Individual2.PrintRoute();
            //    Console.WriteLine("child1");
            //    offspring1.PrintRoute();
            //    Console.WriteLine("child2");
            //    offspring2.PrintRoute();

            //Console.WriteLine();
            //Console.WriteLine($"LeftPoint: {lcp}, Right point: {rcp}");
            #endregion

            IDictionary <City, City> matches = new Dictionary <City, City>();

            List <City> keys   = new List <City>();
            List <City> values = new List <City>();

            for (Int32 i = lcp; i <= rcp; ++i)
            {
                keys.Add(offspring1.Route[i]);
                values.Add(offspring2.Route[i]);
            }

            for (Int32 i = 0; i < rcp - lcp + 1; ++i)
            {
                Int32 j = i;

                if (!values.Any(x => x.Id == keys[i].Id))
                {
                    while (keys.Any(k => k.Id == values[j].Id))
                    {
                        j = keys.FindIndex(k => k.Id == values[j].Id);
                    }

                    matches.Add(keys[i], values[j]);
                    //Console.WriteLine($"{keys[i].Id} : {values[j].Id}");
                }
            }

            offspring1.Route.ExchangeParts(offspring2.Route, lcp, rcp); // swap centrals

            CrossTails(offspring1, matches, 0, lcp);
            CrossTails(offspring1, matches, rcp + 1, chromoLen);

            CrossTails(offspring2, matches, 0, lcp);
            CrossTails(offspring2, matches, rcp + 1, chromoLen);

            #region DebugWriteLines

            //Console.WriteLine();
            //Console.WriteLine("Childs after crossing");
            //Console.WriteLine("child1");
            //offspring1.PrintRoute();
            //Console.WriteLine("child2");
            //offspring2.PrintRoute();

            #endregion

            ChromosomePair offspring = new ChromosomePair
            {
                Individual1 = offspring1,
                Individual2 = offspring2
            };

            return(offspring);
        }
 public void AddToNextGeneration(ChromosomePair pair)
 {
     _chromosomes.Add(pair.Individual1);
     _chromosomes.Add(pair.Individual2);
 }