Ejemplo n.º 1
0
        public void Test50StateCodes()
        {
            Fitness.UseRegexLength = true;
            var wanted = new[]
            {
                "AL", "AK", "AZ", "AR", "CA",
                "CO", "CT", "DE", "FL", "GA",
                "HI", "ID", "IL", "IN", "IA",
                "KS", "KY", "LA", "ME", "MD",
                "MA", "MI", "MN", "MS", "MO",
                "MT", "NE", "NV", "NH", "NJ",
                "NM", "NY", "NC", "ND", "OH",
                "OK", "OR", "PA", "RI", "SC",
                "SD", "TN", "TX", "UT", "VT",
                "VA", "WA", "WV", "WI", "WY"
            };
            const string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            var          unwanted = (from a in alphabet
                                     from b in alphabet
                                     where !wanted.Contains($"{a}{b}")
                                     select $"{a}{b}").Concat(
                from i in alphabet select $"{i}").ToArray();
            var customOperators = new FnMutateDelegate[]
            {
                genes => MutateToCharacterSetLeft(genes, wanted),
                MutateToCharacterSet,
                genes => MutateAddWanted(genes, wanted)
            };

            FindRegex(wanted, unwanted, 120, customOperators);
        }
Ejemplo n.º 2
0
        public void TestStateCodes()
        {
            Fitness.UseRegexLength = true;
            var wanted   = new[] { "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND" };
            var unwanted = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Select(v => $"N{v}").Where(st => !wanted.Contains(st))
                           .ToArray();
            var customOperators = new FnMutateDelegate[]
            {
                genes => MutateToCharacterSetLeft(genes, wanted)
            };

            FindRegex(wanted, unwanted, 11, customOperators);
        }
        public void TornamentTest()
        {
            var minGenes = 10;
            var maxGenes = 20;
            var geneset  = CreateGeneSet();
            var watch    = Stopwatch.StartNew();

            void FnDisplay(List <Rule> genes, int wins, int ties, int losses, int generation)
            {
                Console.WriteLine("-- generation {0} --", generation);
                Display(
                    new Chromosome <Rule, Fitness>(genes, new Fitness(wins, ties, losses, genes.Count), Strategy.None),
                    watch);
            }

            var mutationRoundCounts = new List <int> {
                1
            };

            var mutationOperators = new FnMutateDelegate[]
            {
                genes => MutateAdd(genes, geneset),
                genes => MutateReplace(genes, geneset),
                MutateRemove,
                MutateSwapAdjacent,
                MutateMove,
            };

            void FnMutate(List <Rule> genes) =>
            Mutate(genes, x => new Fitness(0, 0, 0, 0), mutationOperators, mutationRoundCounts);

            List <Rule> FnCrossover(IReadOnlyList <Rule> parent, IReadOnlyList <Rule> doner)
            {
                var child = parent.Take(parent.Count / 2).Concat(doner.Skip(doner.Count / 2)).ToList();

                FnMutate(child);
                return(child);
            }

            List <Rule> FnCreate() =>
            Rand.RandomSample(geneset, Rand.Random.Next(minGenes, maxGenes));

            int FnSortKey(List <Rule> genes, int wins, int ties, int losses) => - 1000 * losses - ties + 1 / genes.Count;

            var unused =
                Genetic <Rule, Fitness> .Tournament(FnCreate, FnCrossover, PlayOneOnOne, FnDisplay, FnSortKey, 13);
        }
        public void PerfectKnowledgeTest()
        {
            var minGenes = 10;
            var maxGenes = 20;
            var geneset  = CreateGeneSet();
            var watch    = Stopwatch.StartNew();

            void FnDisplay(Chromosome <Rule, Fitness> candidate, int?length) =>
            Display(candidate, watch);

            Fitness FnGetFitness(IReadOnlyList <Rule> genes) =>
            GetFitness(genes);

            var mutationRoundCounts = new List <int> {
                1
            };

            var mutationOperators = new FnMutateDelegate[]
            {
                genes => MutateAdd(genes, geneset),
                genes => MutateReplace(genes, geneset),
                MutateRemove,
                MutateSwapAdjacent,
                MutateMove,
            };

            void FnMutate(List <Rule> genes) =>
            Mutate(genes, FnGetFitness, mutationOperators, mutationRoundCounts);

            List <Rule> FnCrossover(IReadOnlyList <Rule> parent, IReadOnlyList <Rule> doner)
            {
                var child = parent.Take(parent.Count / 2).Concat(doner.Skip(doner.Count / 2)).ToList();

                FnMutate(child);
                return(child);
            }

            List <Rule> FnCreate() =>
            Rand.RandomSample(geneset, Rand.Random.Next(minGenes, maxGenes));

            var optimalFitness = new Fitness(620, 120, 0, 11);

            var best = Genetic <Rule, Fitness> .GetBest(FnGetFitness, minGenes, optimalFitness, null, FnDisplay, FnMutate,
                                                        FnCreate, 500, 20, FnCrossover);

            Assert.IsTrue(optimalFitness.CompareTo(best.Fitness) <= 0);
        }
Ejemplo n.º 5
0
        public void TestEvenLength()
        {
            var wanted = new[]
            {
                "00", "01", "10", "11", "0000", "0001", "0010", "0011",
                "0100", "0101", "0110", "0111", "1000", "1001", "1010",
                "1011", "1100", "1101", "1110", "1111"
            };
            var unwanted = new[]
            {
                "0", "1", "000", "001", "010", "011", "100", "101",
                "110", "111", ""
            };
            var customOperators = new FnMutateDelegate[]
            {
                MutateToCharacterSet
            };

            FindRegex(wanted, unwanted, 10, customOperators);
        }