Example #1
0
        /// <summary>
        /// Execute single-point crossover.
        /// </summary>
        /// <param name="parentGene1">parent gene</param>
        /// <param name="parentGene2">another parent gene</param>
        public static void SingleCrossOver(ref FixedBinaryGene parentGene1, ref FixedBinaryGene parentGene2)
        {
            Random      rdn = new Random();
            List <bool> gene1First, gene1Second, gene2First, gene2Second;
            int         crossPoint = rdn.Next(parentGene1.Length);

            gene1First  = parentGene1.GetFromTo(0, crossPoint);
            gene1Second = parentGene1.GetFromTo(crossPoint, parentGene1.Length);
            gene2First  = parentGene2.GetFromTo(0, crossPoint);
            gene2Second = parentGene2.GetFromTo(crossPoint, parentGene2.Length);

            parentGene1 = new FixedBinaryGene(gene1First, gene2Second);
            parentGene2 = new FixedBinaryGene(gene2First, gene1Second);
        }
Example #2
0
        public static void MultipleCrossOver(ref FixedBinaryGene parentGene1, ref FixedBinaryGene parentGene2, int pointNum = 1)
        {
            if (pointNum == 1)
            {
                SingleCrossOver(ref parentGene1, ref parentGene2);
            }
            else
            {
                Random      rdn        = new Random();
                List <int>  crossPoint = new List <int>();
                List <bool> result1    = new List <bool>();
                List <bool> result2    = new List <bool>();
                int         lastValue  = 0;
                int         lastPoint  = 0;
                int         i;

                for (i = 0; i < pointNum; i++)
                {
                    if (i == 0)
                    {
                        lastValue = rdn.Next(parentGene1.Length - pointNum);
                        crossPoint.Add(lastValue);
                    }
                    else
                    {
                        lastValue = rdn.Next(lastValue, parentGene1.Length - pointNum + i);
                        crossPoint.Add(lastValue);
                    }
                }

                for (i = 0; i < pointNum; i++)
                {
                    if (i % 2 == 0)
                    {
                        result1.AddRange(parentGene1.GetFromTo(lastPoint, crossPoint[i]));
                        result2.AddRange(parentGene2.GetFromTo(lastPoint, crossPoint[i]));
                    }
                    else
                    {
                        result1.AddRange(parentGene2.GetFromTo(lastPoint, crossPoint[i]));
                        result2.AddRange(parentGene1.GetFromTo(lastPoint, crossPoint[i]));
                    }
                    lastPoint = crossPoint[i];
                }

                parentGene1 = new FixedBinaryGene(result1);
                parentGene2 = new FixedBinaryGene(result2);
            }
        }