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; }
/// <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); }
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); }
public CustomCrossover(double crossOverProbability, bool allowDuplicates, Crossover2DShape crossoverShape) : this(crossOverProbability, allowDuplicates, crossoverShape, ReplacementMethod.GenerationalReplacement) { }