public BinaryChromosome Execute(BinaryChromosome chromosome)
        {
            if (chromosome == null)
            {
                throw new ArgumentNullException(nameof(chromosome));
            }

            BinaryChromosome mutant  = (BinaryChromosome)chromosome.Copy();
            IBinaryProblem   problem = (IBinaryProblem)mutant.Problem;

            int totalBits = mutant.GetValues().Sum(gene => gene.Length);

            if (_random.NextDouble() <= 1 - Math.Pow(1 - _mutationProbability, totalBits))
            {
                for (int i = 0; i < mutant.Dimension; i++)
                {
                    BitArray gene        = mutant.GetValue(i);
                    int      chosenIndex = _random.Next(0, gene.Length);
                    gene[chosenIndex] = !gene[chosenIndex];
                    mutant.SetValue(i, gene);
                }
            }

            return(mutant);
        }
Example #2
0
        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);
        }
Example #3
0
 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);
        }