コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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;
                }
            }
        }
コード例 #3
0
        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()));
        }
コード例 #4
0
        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;
            }
        }