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