Beispiel #1
0
 public CustomCrossover(double crossOverProbability, bool allowDuplicates, Crossover2DShape crossoverShape, ReplacementMethod replacementMethod)
 {
     this.CrossoverProbability = crossOverProbability;
     this.AllowDuplicates      = allowDuplicates;
     this.ReplacementMethod    = replacementMethod;
     this.CrossoverShape       = crossoverShape;
     this.Enabled = true;
 }
Beispiel #2
0
        /// <summary>
        /// Crossover data represents the points (int) where the crossover will be performed, in this case, we want to switch several points between parents
        /// </summary>
        /// <param name="chromosomeLength"></param>
        /// <param name="crossoverShape"></param>
        /// <returns></returns>
        internal CrossoverData CreateCrossoverData(int chromosomeLength, Crossover2DShape crossoverShape)
        {
            CrossoverData crossoverData = new CrossoverData();

            switch (crossoverShape)
            {
            case Crossover2DShape.TwoByTwoSquare:
            {
                int rx, ry;
                //do
                //{
                rx = RandomProvider.GetThreadRandom().Next(0, MAP_WIDTH - 1 - 2);
                ry = RandomProvider.GetThreadRandom().Next(0, MAP_HEIGHT - 1 - 2);
                //}
                //while (rx > 30 || ry > 30);

                for (int yOffset = 0; yOffset < 2; yOffset++)
                {
                    for (int xOffset = 0; xOffset < 2; xOffset++)
                    {
                        crossoverData.Points.Add((MAP_HEIGHT * (ry + yOffset) + (rx + xOffset)));
                    }
                }
            }
            break;

            case Crossover2DShape.ThreeByThreeSquare:
            {
                int rx, ry;
                //do
                //{
                rx = RandomProvider.GetThreadRandom().Next(0, MAP_WIDTH - 1 - 3);
                ry = RandomProvider.GetThreadRandom().Next(0, MAP_HEIGHT - 1 - 3);
                //}
                //while (rx > 29 || ry > 29);

                for (int yOffset = 0; yOffset < 3; yOffset++)
                {
                    for (int xOffset = 0; xOffset < 3; xOffset++)
                    {
                        crossoverData.Points.Add((MAP_HEIGHT * (ry + yOffset) + (rx + xOffset)));
                    }
                }
            }
            break;

            case Crossover2DShape.FourByFourSquare:
            {
                int rx, ry;
                //do
                //{
                rx = RandomProvider.GetThreadRandom().Next(0, MAP_WIDTH - 1 - 4);
                ry = RandomProvider.GetThreadRandom().Next(0, MAP_HEIGHT - 1 - 4);
                //}
                //while (rx > 28 || ry > 28);

                for (int yOffset = 0; yOffset < 4; yOffset++)
                {
                    for (int xOffset = 0; xOffset < 4; xOffset++)
                    {
                        crossoverData.Points.Add((MAP_HEIGHT * (ry + yOffset) + (rx + xOffset)));
                    }
                }
            }
            break;

            case Crossover2DShape.FourByFourCircle:
            {
                int rx, ry;
                do
                {
                    rx = RandomProvider.GetThreadRandom().Next(0, MAP_WIDTH - 1);
                    ry = RandomProvider.GetThreadRandom().Next(1, MAP_HEIGHT - 1);
                }while (rx > 28 || ry > 28);

                for (int yOffset = 0; yOffset < 4; yOffset++)
                {
                    for (int xOffset = 0; xOffset < 4; xOffset++)
                    {
                        if ((yOffset == 0 && xOffset == 0) || (yOffset == 0 && xOffset == 3) || (yOffset == 3 && xOffset == 0) || (yOffset == 3 && xOffset == 3))
                        {
                            continue;
                        }
                        else
                        {
                            crossoverData.Points.Add((MAP_HEIGHT * (ry + yOffset) + (rx + xOffset)));
                        }
                    }
                }
            }
            break;

            case Crossover2DShape.Triangle:     //size??

                break;

            case Crossover2DShape.Dispersion:

                break;

            default:
            {
                int rx, ry;
                //do
                //{
                rx = RandomProvider.GetThreadRandom().Next(0, MAP_WIDTH - 1 - 4);
                ry = RandomProvider.GetThreadRandom().Next(0, MAP_HEIGHT - 1 - 4);
                //}
                //while (rx > 28 || ry > 28);

                for (int yOffset = 0; yOffset < 4; yOffset++)
                {
                    for (int xOffset = 0; xOffset < 4; xOffset++)
                    {
                        crossoverData.Points.Add((MAP_HEIGHT * (ry + yOffset) + (rx + xOffset)));
                    }
                }
            }
            break;
            }


            return(crossoverData);
        }
Beispiel #3
0
        internal CrossoverData PerformCrossover(Chromosome p1, Chromosome p2, double crossoverProbability, Crossover2DShape crossoverShape, CrossoverData crossoverData, out Chromosome c1, out Chromosome c2)
        {
            CrossoverData crossoverData1 = new CrossoverData();
            int           count1         = p1.Genes.Count;

            if (count1 != p2.Genes.Count)
            {
                throw new ArgumentException("Parent chromosomes are not the same length.");
            }
            if (crossoverData == null)
            {
                throw new ArgumentException("The CrossoverData parameter is null.");
            }
            List <Gene> source1 = ListClone(p1.Genes); // new List<Gene>();
            List <Gene> source2 = ListClone(p2.Genes); // new List<Gene>();

            if (RandomProvider.GetThreadRandom().NextDouble() <= crossoverProbability)
            {
                //iterate all the replacement points
                foreach (int point in crossoverData.Points)
                {
                    var tmpG = source1[point].DeepClone();
                    source1[point] = source2[point].DeepClone();
                    source2[point] = tmpG;
                }

                //APIClass.CountNeighbours(source1);
                //APIClass.CountNeighbours(source2);
            }

            if (source1.Count != count1 || source1.Count != count1)
            {
                throw new ChromosomeCorruptException("Chromosome is corrupt!");
            }
            c1 = new Chromosome((IEnumerable <Gene>)source1);
            c2 = new Chromosome((IEnumerable <Gene>)source2);
            return(crossoverData1);
        }
Beispiel #4
0
 public CustomCrossover(double crossOverProbability, bool allowDuplicates, Crossover2DShape crossoverShape)
     : this(crossOverProbability, allowDuplicates, crossoverShape, ReplacementMethod.GenerationalReplacement)
 {
 }