Example #1
0
        private static void Solve(string[] operations, Dictionary <string, OperationDelegate> prioritizedOperations,
                                  List <string> optimalLengthSolution)
        {
            var numbers = new List <string> {
                "1", "2", "3", "4", "5", "6", "7"
            };
            var expectedTotal = Evaluate(optimalLengthSolution, prioritizedOperations);
            var minNumbers    = (1 + optimalLengthSolution.Count) / 2;
            var maxNumbers    = 6 * minNumbers;
            var watch         = Stopwatch.StartNew();

            void FnDisplay(Chromosome <string, int> candidate) =>
            Display(candidate, watch);

            int FnEvaluate(IReadOnlyList <string> genes) =>
            Evaluate(genes, prioritizedOperations);

            int FnGetFitness(IReadOnlyList <string> genes) =>
            GetFitness(genes, expectedTotal, FnEvaluate);

            List <string> FnCreate() =>
            Create(numbers, operations, minNumbers, maxNumbers);

            void FnMutate(List <string> child) =>
            Mutate(child, numbers, operations, minNumbers, maxNumbers, FnGetFitness);

            var optimalFitness = FnGetFitness(optimalLengthSolution);
            var best           = Genetic <string, int> .GetBest(FnGetFitness, 0, optimalFitness, null, FnDisplay, FnMutate, FnCreate, 50);

            Assert.IsTrue(optimalFitness.CompareTo(best.Fitness) <= 0);
        }
Example #2
0
        private static void Color(string file, string[] colors)
        {
            var data            = LoadData(file);
            var rules           = data.Item1;
            var nodes           = data.Item2;
            var optimalValue    = rules.Count;
            var colorLookup     = colors.ToDictionary(k => k[0], v => v);
            var geneSet         = colorLookup.Keys.ToArray();
            var watch           = Stopwatch.StartNew();
            var count           = 0;
            var nodeIndexLookup = nodes.OrderBy(s => s).ToDictionary(k => k, v => count++);

            void FnDisplay(Chromosome <char, int> candidate) => Display(candidate, watch);

            int FnGetFitness(IReadOnlyList <char> genes) => GetFitness(genes, rules, nodeIndexLookup);

            var best = Genetic <char, int> .GetBest(FnGetFitness, nodes.Count, optimalValue, geneSet, FnDisplay);

            Assert.IsTrue(optimalValue.CompareTo(best.Fitness) <= 0);

            var keys = nodes.OrderBy(c => c).ToArray();

            for (var index = 0; index < nodes.Count; index++)
            {
                Console.WriteLine("{0} is {1}", keys[index], colorLookup[best.Genes[index]]);
            }
        }
        public void SudokuTest()
        {
            var geneSet      = Enumerable.Range(1, 9).ToArray();
            var watch        = Stopwatch.StartNew();
            var optimalValue = 100;

            void FnDisplay(Chromosome <int, int> candidate) =>
            Display(candidate, watch);

            var validationRules = BuildValidationRules();

            int FnGetFitness(IReadOnlyList <int> genes) =>
            GetFitness(genes, validationRules);

            List <int> FnCreate() =>
            Rand.RandomSample(geneSet, 81);

            void FnMutate(List <int> genes) =>
            Mutate(genes, validationRules);

            var best = Genetic <int, int> .GetBest(FnGetFitness, 0, optimalValue, null, FnDisplay, FnMutate, FnCreate,
                                                   50);

            Assert.AreEqual(optimalValue, best.Fitness);
        }
Example #4
0
        private static Chromosome <string, Fitness> FindRegex(string[] wanted, string[] unwanted, int expectedLength,
                                                              FnMutateDelegate[] customOperators = null)
        {
            var watch = Stopwatch.StartNew();

            // var set = new HashSet<char>(wanted.SelectMany(mo => mo.ToCharArray()));
            var set         = wanted.SelectMany(s => s.ToCharArray()).Distinct().Select(cp => cp.ToString());
            var textGenes   = wanted.ToList().Concat(set).ToArray();
            var fullGeneSet = AllMetas.Concat(textGenes).ToArray();

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

            Fitness FnGetFitness(List <string> genes) =>
            GetFitness(genes, wanted.ToList(), unwanted.ToList());

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

            var mutationOperators = new List <FnMutateDelegate>
            {
                genes => MutateAdd(genes, fullGeneSet),
                genes => MutateReplace(genes, fullGeneSet),
                MutateRemove,
                MutateSwap,
                MutateMove,
            };

            if (customOperators != null)
            {
                mutationOperators.AddRange(customOperators);
            }

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

            var optimalFitness = new Fitness(wanted.Length, wanted.Length, 0, expectedLength);

            var best = Genetic <string, Fitness> .GetBest(FnGetFitness, textGenes.Max(i => i.Length), optimalFitness,
                                                          fullGeneSet, FnDisplay, FnMutate, null, null, 10);

            Assert.IsTrue(optimalFitness.CompareTo(best.Fitness) <= 0);

            if (!RegexErrorsSeen.Any())
            {
                return(best);
            }

            Console.WriteLine();
            Console.WriteLine("Errors:");
            foreach (var error in RegexErrorsSeen)
            {
                Console.WriteLine("  {0}", error.Message);
            }

            return(best);
        }
        private static void Test(int size)
        {
            var geneSet = Enumerable.Range(0, size).ToArray();
            var watch   = Stopwatch.StartNew();

            void DisplayFun(Chromosome <int, Fitness> candidate) => Display(candidate, watch, geneSet.Length);
            Fitness FitnessFun(IReadOnlyList <int> genes) => Fitness(genes, size);

            var optimalFitness = new Fitness(0);
            var best           = Genetic <int, Fitness> .GetBest(FitnessFun, 2 *size, optimalFitness, geneSet, DisplayFun);

            Assert.IsTrue(optimalFitness.CompareTo(best.Fitness) <= 0);
        }
        private static void FillKnapsack(IReadOnlyCollection <Resource> items, double maxWeight,
                                         double maxVolume, Fitness optimalFitness)
        {
            var watch       = Stopwatch.StartNew();
            var window      = new Window(1, Math.Max(1, items.Count / 3), items.Count / 2);
            var sortedItems = items.OrderBy(i => i.Value).ToList();

            void FnDisplay(Chromosome <ItemQuantity, Fitness> candidate) => Display(candidate, watch);
            Fitness FnGetFitness(IReadOnlyList <ItemQuantity> genes) => GetFitness(genes);
            List <ItemQuantity> FnCreate() => Create(items, maxWeight, maxVolume);
            void FnMutate(List <ItemQuantity> genes) => Mutate(genes, sortedItems, maxWeight, maxVolume, window);

            var best = Genetic <ItemQuantity, Fitness> .GetBest(FnGetFitness, 0, optimalFitness, null, FnDisplay, FnMutate, FnCreate, 50);

            Assert.IsTrue(optimalFitness.CompareTo(best.Fitness) <= 0);
        }
Example #7
0
        private static void RunWith(FnCreateGeneDelegate[] geneSet, int width, int height, int minGenes, int maxGenes,
                                    int expectedNumberOfInstructions, int maxMutationRounds, FnCreateFieldDelegate fnCreateField,
                                    int expectedNumberOfSteps)
        {
            var mowerStartLocation  = new Location(width / 2, height / 2);
            var mowerStartDirection = Directions.South;

            List <INode> FnCreate() =>
            Create(geneSet, 1, height);

            Tuple <Field, Mower, Program> FnEvaluate(IReadOnlyList <INode> instructions)
            {
                var program = new Program(instructions);
                var mower   = new Mower(mowerStartLocation, mowerStartDirection);
                var field   = fnCreateField();

                try
                {
                    program.Evaluate(mower, field, 0);
                }
                catch (Exception)
                {
                    // pass
                }
                return(new Tuple <Field, Mower, Program>(field, mower, program));
            }

            Fitness FnGetFitness(IReadOnlyList <INode> genes) =>
            GetFitness(genes, FnEvaluate);

            var watch = Stopwatch.StartNew();

            void FnDisplay(Chromosome <INode, Fitness> candidate) =>
            Display(candidate, watch, FnEvaluate);

            void FnMutate(List <INode> child) =>
            Mutate(child, geneSet, minGenes, maxGenes, FnGetFitness, maxMutationRounds);

            var optimalFitness = new Fitness(width * height, expectedNumberOfInstructions, expectedNumberOfSteps);

            var best = Genetic <INode, Fitness> .GetBest(FnGetFitness, 0, optimalFitness, null, FnDisplay, FnMutate,
                                                         FnCreate, null, 10, Crossover);

            Assert.IsTrue(optimalFitness.CompareTo(best.Fitness) <= 0);
        }
        private static void SolveUnknown(int numUnknowns, Fraction[] geneSet, FnEquationDelegate[] equations,
                                         FnGenesToImputsDelegate fnGenesToImputs)
        {
            var watch  = Stopwatch.StartNew();
            var maxAge = 50;
            var window = new Window(Math.Max(1, geneSet.Length / (2 * maxAge)),
                                    Math.Max(1, geneSet.Length / 3),
                                    geneSet.Length / 2);
            var geneIndexes   = Enumerable.Range(0, numUnknowns).ToArray();
            var sortedGeneSet = geneSet.OrderBy(gene => gene).ToList();

            void FnDispaly(Chromosome <Fraction, Fitness> candidate) => Display(candidate, watch, fnGenesToImputs);
            Fitness FnGetFitness(IReadOnlyList <Fraction> genes) => GetFitness(genes, equations);
            void FnMutate(List <Fraction> genes) => Mutate(genes, sortedGeneSet, window, geneIndexes);

            var optimalFitness = new Fitness(new Fraction(0));
            var best           = Genetic <Fraction, Fitness> .GetBest(FnGetFitness, numUnknowns, optimalFitness, geneSet, FnDispaly, FnMutate,
                                                                      null, maxAge);

            Assert.IsTrue(optimalFitness.CompareTo(best.Fitness) <= 0);
            Assert.AreEqual(0.0, (float)best.Fitness.TotalDifference, 0.0001);
        }