public static void SwapMutation(Solution <T> a, CreateNewSolution <T> createSolution, FitnessFunction <T> fitnessFunction, double mutationProbability) { Random r = new Random(); foreach (var c in a.Chromosomes) { for (int i = 0; i < c.GenesCount; i++) { // Probability od mutatnion / 2 - 2 genes affected for one mutation if (mutationProbability / 2 < r.NextDouble()) { continue; } int pos1 = r.Next(c.GenesCount); int pos2 = r.Next(c.GenesCount); T tmp = c.Genes[pos1]; c.Genes[pos1] = c.Genes[pos2]; c.Genes[pos2] = tmp; } } a.Fitness = fitnessFunction(a); }
public static void ReplaceMutation(Solution <T> a, CreateNewSolution <T> createSolution, FitnessFunction <T> fitnessFunction, double mutationProbability) { Random r = new Random(); Solution <T> n = createSolution(); var ae = a.Chromosomes.GetEnumerator(); var ne = n.Chromosomes.GetEnumerator(); while (ae.MoveNext() && ne.MoveNext()) { var ac = ae.Current.Genes; var nc = ne.Current.Genes; for (int i = 0; i < ac.Count; i++) { // Probability od mutatnion if (mutationProbability < r.NextDouble()) { break; } ac[i] = nc[i]; } } a.Fitness = fitnessFunction(a); }
public GeneticAlgorithm(Selection <T> selectionMethod, Crossover <T> crossoverMethod, Mutation <T> mutationMethod, FitnessFunction <T> fitnessFunction, CreateNewSolution <T> createNewSolution, AcceptResult <T> acceptResult, int population, double mutationProbability, int selectionCount, int eliteCount = 0) { if (population < 2) { throw new Exception("Population must be greater or equal 2."); } if (eliteCount >= population) { throw new Exception("EliteCount must be less than population."); } selection = selectionMethod; crossover = crossoverMethod; mutation = mutationMethod; fitness = fitnessFunction; createSolution = createNewSolution; accept = acceptResult; maxPopulation = population; this.mutationProbability = mutationProbability; this.selectionCount = selectionCount; this.eliteCount = eliteCount; }