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); }
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); }