public IIndividual PerformMutation(IIndividual individual)
        {
            var randomMutationLimit = _random.Next(_maxNumberOfMutations);

            for (var numberOfMutations = 0; numberOfMutations < randomMutationLimit; numberOfMutations++)
            {
                // TODO: Implement infinity searching with boundary constraints

                // Find two indices at random.
                var swapIndex1 = _random.Next(individual.Chromosome.Size);
                var swapIndex2 = _random.Next(individual.Chromosome.Size);

                // Ensure indices are unique.
                while (swapIndex1 == swapIndex2)
                {
                    swapIndex2 = _random.Next(individual.Chromosome.Size);
                }

                // Store the original values.
                var swapIndex1Value = individual.GetGeneValue(swapIndex1);
                var swapIndex2Value = individual.GetGeneValue(swapIndex2);

                // Swap the index's values.
                individual.SetGeneValue(swapIndex1, swapIndex2Value);
                individual.SetGeneValue(swapIndex2, swapIndex1Value);
            }

            return(individual);
        }
示例#2
0
        public void UpdateIndividualSuitability(IIndividual individual)
        {
            var fitness    = 0;
            var multiplier = 0;

            for (var i = 0; i < individual.GeneLength; i++)
            {
                var studentIndex = individual.GetGeneValue(i) - 1;
                if (studentIndex != -1)
                {
                    var timeslotIndex = i;

                    var score = GetIndividualScore(studentIndex, timeslotIndex);

                    if (score == 10)
                    {
                        multiplier += 2;
                    }
                    else if (score == 1)
                    {
                        multiplier += 1;
                    }

                    fitness += score;
                }
            }

            individual.SuitabilityScore = fitness + 1 * multiplier;
        }
        /// <summary>
        ///     Perform a random splice of the genes from 'parent1' and 'parent2' to produce a child.
        /// </summary>
        /// <param name="parent1">The parent to take the first selection of genes from</param>
        /// <param name="parent2">The parent to take the second selection of genes from</param>
        /// <returns></returns>
        public IIndividual PerformCrossover(IIndividual parent1, IIndividual parent2)
        {
            var child = _individualFactory.CreateIndividual();

            // Select a random index for the crossover point.
            // TODO: Make this dynamic
            var minimumCrossoverLength = 1;
            var crossoverIndex         = _random.Next(0, child.GeneLength - minimumCrossoverLength);

            for (var geneIndex = 0; geneIndex < child.GeneLength; geneIndex++)
            {
                int alleleFromParent;

                // Take genes from 'parent1' if the crossover point hasn't been reached
                if (geneIndex < crossoverIndex)
                {
                    alleleFromParent = parent1.GetGeneValue(geneIndex);
                }

                // Take genes from 'parent2' if the crossover point has been reached
                else
                {
                    alleleFromParent = parent2.GetGeneValue(geneIndex);
                }

                child.SetGeneValue(geneIndex, alleleFromParent);
            }

            return(child);
        }