public IList <BinaryChromosome> Execute(IList <BinaryChromosome> parents) { if (parents == null) { throw new ArgumentNullException(nameof(parents)); } if (parents.Count != NumberOfParents) { throw new ArgumentException($"There must be {NumberOfParents} parents instead of {parents.Count}"); } BinaryChromosome parent1 = (BinaryChromosome)parents[0].Copy(); BinaryChromosome parent2 = (BinaryChromosome)parents[1].Copy(); IList <BinaryChromosome> result = new List <BinaryChromosome>(); if (_random.NextDouble() > _crossoverProbability) { result.Add(parent1); result.Add(parent2); return(result); } IBinaryProblem problem = (IBinaryProblem)parent1.Problem; BinaryChromosome child1 = (BinaryChromosome)parent1.Copy(); BinaryChromosome child2 = (BinaryChromosome)parent2.Copy(); for (int i = 0; i < problem.Dimension; i++) { BitArray parent1Value = parent1.GetValue(i); BitArray parent2Value = parent2.GetValue(i); int numberOfBits = problem.GetNumberOfBits(i); // If the number of specified cross points is larger than the number of bits // then use cross point for every bit var crossPointsCount = Math.Min(numberOfBits - 1, _numberOfCrossPoints); var crossPoints = _random.NextInts(0, numberOfBits, crossPointsCount); crossPoints = crossPoints.OrderBy(p => p).ToArray(); int previousCrossPoint = 0; for (int j = 0; j < crossPoints.Length; j++) { for (int k = previousCrossPoint; k < crossPoints[j]; k++) { child1[i][k] = j % 2 == 0 ? parent2Value[k] : parent1Value[k]; child2[i][k] = j % 2 == 0 ? parent1Value[k] : parent2Value[k]; } previousCrossPoint = crossPoints[j]; } } result.Add(child1); result.Add(child2); return(result); }
public BinaryChromosome(IBinaryProblem problem) : base(problem) { // Initialize randomly for (int i = 0; i < Dimension; i++) { BitArray gene = BitArrayHelper.CreateRandom(problem.GetNumberOfBits(i)); SetValue(i, gene); } }
public IList <BinaryChromosome> Execute(IList <BinaryChromosome> parents) { if (parents == null) { throw new ArgumentNullException(nameof(parents)); } if (parents.Count != NumberOfParents) { throw new ArgumentException($"There must be {NumberOfParents} parents instead of {parents.Count}"); } BinaryChromosome parent1 = (BinaryChromosome)parents[0].Copy(); BinaryChromosome parent2 = (BinaryChromosome)parents[1].Copy(); IList <BinaryChromosome> result = new List <BinaryChromosome>(); if (_random.NextDouble() > _crossoverProbability) { result.Add(parent1); result.Add(parent2); return(result); } IBinaryProblem problem = (IBinaryProblem)parent1.Problem; BinaryChromosome child = (BinaryChromosome)parent1.Copy(); for (int i = 0; i < problem.Dimension; i++) { int numberOfBits = problem.GetNumberOfBits(i); BitArray parent1Value = parent1.GetValue(i); BitArray parent2Value = parent2.GetValue(i); BitArray randomValue = BitArrayHelper.CreateRandom(numberOfBits); BitArray childValue = new BitArray(numberOfBits); for (int j = 0; j < numberOfBits; j++) { bool a = parent1Value[j]; bool b = parent2Value[j]; bool r = randomValue[j]; childValue[j] = (a & b) | (r & (a ^ b)); } child.SetValue(i, childValue); } result.Add(child); return(result); }