private static void Mutate(List <INode> genes, IReadOnlyList <FnCreateGeneDelegate> geneSet, int minGenes, int maxGenes, FnGetFitnessDelegate fnGetFitness, int maxRounds) { var count = Rand.Random.Next(1, maxRounds + 1); var initialFitness = fnGetFitness(genes); while (count-- > 0) { if (fnGetFitness(genes).CompareTo(initialFitness) > 0) { return; } var adding = genes.Count == 0 || genes.Count < maxGenes - 1 && Rand.PercentChance(20); if (adding) { var gene1 = Rand.SelectItem(geneSet)(); genes.Add(gene1); continue; } var removing = genes.Count > minGenes && Rand.PercentChance(2); if (removing) { var index1 = Rand.Random.Next(genes.Count); genes.RemoveAt(index1); continue; } // Replace gene var gene = Rand.SelectItem(geneSet)(); var index = Rand.Random.Next(genes.Count); genes[index] = gene; } }
private static void Mutate(List <Node> childGenes, CreateGeneDelegate fnCreateGene, FnGetFitnessDelegate fnGetFitness, int sourceCount) { if (childGenes.Count <= sourceCount) { throw new Exception("Not enough genes."); } var initialFitness = fnGetFitness(childGenes); var count = Rand.Random.Next(1, 6); while (count-- > 0) { //var gatesUsed = NodesToCircuit(childGenes).Item2.Where(s => s >= sourceCount).ToArray(); //if (!gatesUsed.Any()) // return; //var index = Rand.SelectItem(gatesUsed); var index = Rand.Random.Next(childGenes.Count - sourceCount) + sourceCount; childGenes[index] = fnCreateGene(index); if (fnGetFitness(childGenes).CompareTo(initialFitness) > 0) { return; } } }
private static void Mutate(List <Rule> genes, FnGetFitnessDelegate fnGetFitness, IReadOnlyList <FnMutateDelegate> mutationOperators, List <int> mutationRoundCounts) { var initialFitness = fnGetFitness(genes); var count = Rand.SelectItem(mutationRoundCounts); for (var i = 1; i < count + 2; i++) { foreach (var mutate in mutationOperators.OrderBy(o => Rand.Random.Next())) { var mutated = mutate(genes); if (mutated) { break; } } if (fnGetFitness(genes).CompareTo(initialFitness) <= 0) { continue; } mutationRoundCounts.Add(i); break; } // Is it worth it to remove duplicate genes? //var seen = new HashSet<string>(); //genes.RemoveAll(x => !seen.Add(x.ToString())); }
private static void Mutate(List <string> genes, FnGetFitnessDelegate fnGetFitness, IReadOnlyCollection <FnMutateDelegate> mutationOperators, List <int> mutationRoundCounts) { var initialFitness = fnGetFitness(genes); var count = Rand.SelectItem(mutationRoundCounts); for (var i = 1; i < count + 3; i++) { var copy = mutationOperators.ToList(); var func = Rand.SelectItem(copy); while (!func(genes)) { copy.Remove(func); func = Rand.SelectItem(copy); } if (fnGetFitness(genes).CompareTo(initialFitness) <= 0) { continue; } mutationRoundCounts.Add(i); break; } }