예제 #1
0
        /// <summary>
        /// Initializes this instance.
        /// </summary>
        public override void Initialize()
        {
            Console.WriteLine("Function arguments and expected result: arg1,arg2=expected result.");
            Console.WriteLine("Sample1: 1,2,3=6");
            Console.WriteLine("Sample2: 2,3,4=24");
            Console.WriteLine("When finish, type ENTER to start the GA.");

            m_inputs = new List <FunctionBuilderInput>();
            do
            {
                var parts = Console.ReadLine().Split('=');

                if (parts.Length != 2)
                {
                    Console.WriteLine("Max number of operations?");
                    m_maxOperations = Convert.ToInt32(Console.ReadLine());

                    break;
                }

                var arguments = parts[0].Split(',');

                var input = new FunctionBuilderInput(
                    arguments.Select(a => Convert.ToDouble(a)).ToList(),
                    Convert.ToDouble(parts[1]));

                m_inputs.Add(input);
            }while (true);

            m_fitness = new FunctionBuilderFitness(m_inputs.ToArray());
        }
예제 #2
0
        public void Evolve_ManyGenerations_Fast()
        {
            var selection = new EliteSelection();
            var crossover = new ThreeParentCrossover();
            var mutation  = new UniformMutation(true);

            var fitness = new FunctionBuilderFitness(
                new FunctionBuilderInput(
                    new double[] { 1, 2 },
                    3)
                ,
                new FunctionBuilderInput(
                    new double[] { 2, 3 },
                    5)
                );
            var chromosome = new FunctionBuilderChromosome(fitness.AvailableOperations, 3);

            var population = new Population(100, 200, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.Termination = new OrTermination(new FitnessThresholdTermination(0), new TimeEvolvingTermination(TimeSpan.FromSeconds(15)));
            ga.Start();
            var bestChromosome = ga.BestChromosome as FunctionBuilderChromosome;

            Assert.AreEqual(0.0, bestChromosome.Fitness.Value);
            var actual = fitness.GetFunctionResult(
                bestChromosome.BuildFunction(),
                new FunctionBuilderInput(new double[] { 3, 4 }, 7)
                );

            Assert.AreEqual(7, actual);
        }
예제 #3
0
        static void Main(string[] args)
        {
            // Problem: Simple addition
            // 1 + 1 = 2
            // 2 + 2 = 4
            // 3 + 2 = 5
            var myInputs = new List <FunctionBuilderInput>
            {
                new FunctionBuilderInput(new List <double> {
                    1, 1
                }, 2),
                new FunctionBuilderInput(new List <double> {
                    2, 2
                }, 4),
                new FunctionBuilderInput(new List <double> {
                    3, 2
                }, 5)
            };
            var myFitness    = new FunctionBuilderFitness(myInputs.ToArray());
            var myChromosome = new FunctionBuilderChromosome(myFitness.AvailableOperations, 5);
            var selection    = new EliteSelection();
            var crossover    = new ThreeParentCrossover();
            var mutation     = new UniformMutation(true);
            var fitness      = myFitness;
            var chromosome   = myChromosome;
            var population   = new Population(100, 200, chromosome)
            {
                GenerationStrategy = new PerformanceGenerationStrategy()
            };
            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new FitnessThresholdTermination(0)
            };

            ga.GenerationRan += delegate
            {
                Console.Clear();
                var bestChromosome = ga.Population.BestChromosome;
                Console.WriteLine("Generations: {0}", ga.Population.GenerationsNumber);
                Console.WriteLine("Fitness: {0,10}", bestChromosome.Fitness);
                Console.WriteLine("Time: {0}", ga.TimeEvolving);
                Console.WriteLine("Speed (gen/sec): {0:0.0000}", ga.Population.GenerationsNumber / ga.TimeEvolving.TotalSeconds);
                var best = bestChromosome as FunctionBuilderChromosome;
                Console.WriteLine("Function: {0}", best.BuildFunction());
            };
            ga.Start();
            Console.WriteLine("Evolved.");
            Console.ReadKey();
        }
        public void Evaluate_AllResultsEquals_MaxFitness()
        {
            var target = new FunctionBuilderFitness(
                new FunctionBuilderInput(new double[] { 1 }, 1),
                new FunctionBuilderInput(new double[] { 2 }, 2));

            var c = new FunctionBuilderChromosome(target.AvailableOperations, 2);

            c.ReplaceGene(0, new Gene("A"));
            c.ReplaceGene(1, new Gene(""));

            var actual = target.Evaluate(c);

            Assert.AreEqual(0, actual);
        }
        public void Evaluate_InvalidFunction_WorstFitness()
        {
            var target = new FunctionBuilderFitness(
                new FunctionBuilderInput(new double[] { 1 }, 2),
                new FunctionBuilderInput(new double[] { 1 }, 3));

            var c = new FunctionBuilderChromosome(target.AvailableOperations, 2);

            c.ReplaceGene(0, new Gene("-"));
            c.ReplaceGene(1, new Gene(""));

            var actual = target.Evaluate(c);

            Assert.AreEqual(double.MinValue, actual);
        }