Пример #1
0
        public void Start()
        {
            var fitness = new StringFitness(targetString);
            var chromosome = new StringChromosome(targetString.Length);
            var crossover = new UniformCrossover(0.5f);
            var mutation = new UniformMutation();
            var selection = new EliteSelection();
            var population = new Population(1000, 1000, chromosome);
            var termination = new FitnessThresholdTermination(1.00);

            ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
            ga.Termination = termination;

            var latestFitness = 0.0;

            ga.GenerationRan += (sender, e) =>
            {
                var bestChromosome = ga.BestChromosome as StringChromosome;
                var bestFitness = bestChromosome.Fitness.Value;

                Console.WriteLine(
                        "Generation {0}: \n{1} \nFitness: {2}",
                        ga.GenerationsNumber,
                        bestChromosome.Sentence,
                        bestFitness
                    );

                if (bestFitness > latestFitness)
                {
                    latestFitness = bestFitness;
                }
            };

            ga.Start();
        }
        public ITermination FitnessThreshold()
        {
            var target = new FitnessThresholdTermination(1d);
            var ga     = Substitute.For <IGeneticAlgorithm>();

            ga.BestChromosome.Returns(new TspChromosome(10)
            {
                Fitness = 1d
            });
            target.HasReached(ga);

            return(target);
        }
        public void HasReached_BestChromosomeHasLowerFitness_False()
        {
            var repository = new MockRepository();
            var ga = repository.StrictMock<IGeneticAlgorithm>();

            using (repository.Ordered())
            {
                ga.Expect(g => g.BestChromosome).Return(new ChromosomeStub() { Fitness = 0.4 });
                ga.Expect(g => g.BestChromosome).Return(new ChromosomeStub() { Fitness = 0.499 });
            }
            repository.ReplayAll();

            var target = new FitnessThresholdTermination(0.5);
            Assert.IsFalse(target.HasReached(ga));
            Assert.IsFalse(target.HasReached(ga));
        }
        public void HasReached_BestChromosomeHasGreaterOrEqualFitness_True()
        {
            var ga = Substitute.For <IGeneticAlgorithm>();

            ga.BestChromosome.Returns(new ChromosomeStub()
            {
                Fitness = 0.4
            },
                                      new ChromosomeStub()
            {
                Fitness = 0.8
            });

            var target = new FitnessThresholdTermination(0.8);

            Assert.IsFalse(target.HasReached(ga));
            Assert.IsTrue(target.HasReached(ga));
        }
Пример #5
0
        public static FloatingPointChromosome EvolveGeneticAlgorithm(FloatingPointChromosome chromosome, IOthelloAgent agent, string chromosomeLabel = "")
        {
            IPopulation population = new TplPopulation(30, 60, chromosome);
            IFitness    fitness    = new EvaluationFitness(agent);
            ISelection  selection  = new RouletteWheelSelection(); //Guess
            ICrossover  crossover  = new UniformCrossover();       //Guess
            IMutation   mutation   = new UniformMutation();        //Guess


            ITermination stagnation = new FitnessStagnationTermination(500);
            ITermination threshold  = new FitnessThresholdTermination(.9);

            ITaskExecutor taskExecutor = new ParallelTaskExecutor()
            {
                MaxThreads = Environment.ProcessorCount,
                MinThreads = Environment.ProcessorCount / 2
            };


            GeneticAlgorithm algorithm = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                TaskExecutor        = new TplTaskExecutor(),
                MutationProbability = .2f
            };

            algorithm.TaskExecutor = taskExecutor;
            algorithm.Termination  = stagnation;

            algorithm.Start();

            SaveChromosome((FloatingPointChromosome)algorithm.BestChromosome, chromosomeLabel);

            Debug.WriteLine("finished Training, with {0} time spent on evolving", algorithm.TimeEvolving);
            Debug.WriteLine("fitness of this generation vs the last : {0}", algorithm.Fitness);

            return((FloatingPointChromosome)algorithm.BestChromosome);
        }
Пример #6
0
        private static IAlgoritmo CriaAlgoritmoGenetico(Dictionary <string, string[]> dict, List <string> flat, Problema problema)
        {
            int         populacaoMin, populacaoMax;
            IPopulation population;

            ISelection   selection;
            ICrossover   crossover;
            IMutation    mutation;
            ITermination termination;
            IReinsertion reinsertion;
            float        crossoverProbability, mutationProbability;



            var p = dict.ValueOrDefault("p", "50,100").Split(new[] { ',' });

            if (p.Length != 2 || !int.TryParse(p[0], out populacaoMin) || !int.TryParse(p[1], out populacaoMax))
            {
                throw new ArgumentException("Faixa de população inválida.");
            }

            population = new Population(populacaoMin, populacaoMax, new CromossomoViajante(problema.Mapa.Locais.Count));

            switch (dict.ValueOrDefault("s", "t"))
            {
            case "e":
                selection = new EliteSelection();
                break;

            case "r":
                selection = new RouletteWheelSelection();
                break;

            case "s":
                selection = new StochasticUniversalSamplingSelection();
                break;

            case "t":
                selection = new TournamentSelection();
                break;

            default:
                throw new ArgumentException("Seleção inválida.");
            }

            switch (dict.ValueOrDefault("c", "o"))
            {
            case "s":
                crossover = new CutAndSpliceCrossover();
                break;

            case "c":
                crossover = new CycleCrossover();
                break;

            case "o":
                crossover = new OrderedCrossover();
                break;

            case "ob":
                crossover = new OrderBasedCrossover();
                break;

            case "op":
                crossover = new OnePointCrossover();
                break;

            case "pm":
                crossover = new PartiallyMappedCrossover();
                break;

            case "p":
                crossover = new PositionBasedCrossover();
                break;

            case "tpa":
                crossover = new ThreeParentCrossover();
                break;

            case "tp":
                crossover = new TwoPointCrossover();
                break;

            case "u":
                crossover = new UniformCrossover();
                break;

            default:
                throw new ArgumentException("Crossover inválido.");
            }

            switch (dict.ValueOrDefault("m", "r"))
            {
            case "d":
                mutation = new DisplacementMutation();
                break;

            case "f":
                mutation = new FlipBitMutation();
                break;

            case "i":
                mutation = new InsertionMutation();
                break;

            case "s":
                mutation = new PartialShuffleMutation();
                break;

            case "r":
                mutation = new ReverseSequenceMutation();
                break;

            case "t":
                mutation = new TworsMutation();
                break;

            case "u":
                mutation = new UniformMutation();
                break;

            default:
                throw new ArgumentException("Mutação inválida.");
            }

            switch (dict.ValueOrDefault("t", "s"))
            {
            case "s":
                termination = new FitnessStagnationTermination();
                break;

            case "t":
                termination = new FitnessThresholdTermination();
                break;

            case "g":
                termination = new GenerationNumberTermination();
                break;

            default:
                throw new ArgumentException("Terminação inválida.");
            }

            switch (dict.ValueOrDefault("e", "e"))
            {
            case "e":
                reinsertion = new ElitistReinsertion();
                break;

            case "p":
                reinsertion = new PureReinsertion();
                break;

            case "u":
                reinsertion = new UniformReinsertion();
                break;

            default:
                throw new ArgumentException("Reinserção inválida.");
            }

            if (!float.TryParse(dict.ValueOrDefault("cp", "0,75"), out crossoverProbability))
            {
                throw new ArgumentException("Probabilidade de crossover inválida.");
            }

            if (!float.TryParse(dict.ValueOrDefault("mp", "0,25"), out mutationProbability))
            {
                throw new ArgumentException("Probabilidade de mutação inválida.");
            }


            return(new AlgoritmoGenetico(problema, population, selection, crossover, crossoverProbability, mutation, mutationProbability, termination, reinsertion));
        }
Пример #7
0
        public static void Main(string[] args)
        {
            //represents a sample in the population
            var chromosome = new FloatingPointChromosome(
                //min values array
                Enumerable.Repeat(0.0, GoalString.Length).ToArray(),
                //max values array
                Enumerable.Repeat(25.0, GoalString.Length).ToArray(),
                //bits nneded array
                Enumerable.Repeat(5, GoalString.Length).ToArray(),
                //decimals required array
                Enumerable.Repeat(0, GoalString.Length).ToArray()
                );

            //create the population
            var population = new Population(4, 8, chromosome);

            //define a fitness function
            var fitness = new FuncFitness((c) =>
            {
                var fc = c as FloatingPointChromosome;

                var values = fc.ToFloatingPoints();

                var numCorrect = 0;
                for (int i = 0; i < GoalString.Length; i++)
                {
                    var intVersion = Convert.ToInt32(values[i]);
                    if (intVersion == GoalString[i] - 'a')
                    {
                        numCorrect++;
                    }
                }

                return(Convert.ToInt64(Math.Pow(2, numCorrect)));
            });

            //select the top performers for reproduction
            var selection = new EliteSelection();

            //get half of genetic material from each parent
            var crossover = new UniformCrossover(.5f);

            //our numbers are internally represented as binary strings, randomly flip those bits
            var mutation = new FlipBitMutation();

            //stop mutating when there the goal is met (paried definition with fitness function)
            var termination = new FitnessThresholdTermination(Math.Pow(2, GoalString.Length));

            //put the genetic algorithm together
            var ga = new GeneticAlgorithm(
                population,
                fitness,
                selection,
                crossover,
                mutation);

            ga.Termination = termination;

            //print out the top performer of the population
            ga.GenerationRan += (sender, e) =>
            {
                var bestChromosome = ga.BestChromosome as FloatingPointChromosome;
                var bestFitness    = Convert.ToInt32(bestChromosome.Fitness.Value);

                if (bestFitness != HighestFitness)
                {
                    HighestFitness = bestFitness;
                }
                var phenotype = bestChromosome.ToFloatingPoints();

                var ints = phenotype.Select(Convert.ToInt32).ToArray();

                var bestString = ConvertIntArrayToString(ints);

                Console.WriteLine($"Best string: {bestString}");
            };

            ga.TerminationReached += (sender, eventArgs) => { Console.WriteLine("Finished Evolving"); };

            ga.Start();

            Console.ReadKey();
        }
Пример #8
0
        public GeneticOptimizer(GeneticOptimizerConfiguration configuration, Func <double[], double> objectiveFunction, Action <string> generationRanCallback = null)
        {
            //store configuration
            _configuration         = configuration;
            _generationRanCallback = generationRanCallback;

            //set min/max/precision of input variables
            var minValues      = new double[_configuration.Variables.Count];
            var maxValues      = new double[_configuration.Variables.Count];
            var fractionDigits = new int[_configuration.Variables.Count];

            for (int index = 0; index < _configuration.Variables.Count; index++)
            {
                minValues[index]      = _configuration.Variables[index].MinimumValue;
                maxValues[index]      = _configuration.Variables[index].MaximumValue;
                fractionDigits[index] = _configuration.Variables[index].NumberDigitsPrecision;
            }

            //total bits
            var totalBits = new int[] { 64 };

            //chromosome
            var chromosome = new FloatingPointChromosome(minValues, maxValues, totalBits, fractionDigits);

            //population
            var population = new Population(MinimumNumberPopulation, MaximumNumberPopulation, chromosome);

            //set fitness function
            var fitnessFunction = new FuncFitness(c =>
            {
                var fc     = c as FloatingPointChromosome;
                var inputs = fc.ToFloatingPoints();
                var result = objectiveFunction(inputs);

                //add to results
                if (!Double.IsNaN(result))
                {
                    var list = inputs.ToList();
                    list.Add(result);

                    _result.IterationArray.Add(string.Join(",", list));
                }

                return(result);
            });

            //other variables
            var selection   = new EliteSelection();
            var crossover   = new UniformCrossover(0.5f);
            var mutation    = new FlipBitMutation();
            var termination = new FitnessThresholdTermination();

            _algorithm = new GeneticAlgorithm(population, fitnessFunction, selection, crossover, mutation)
            {
                Termination = termination,
            };

            //task parallelism
            var taskExecutor = new ParallelTaskExecutor();

            taskExecutor.MinThreads = 1;
            taskExecutor.MaxThreads = _configuration.NumberThreadsToUse;
            _algorithm.TaskExecutor = taskExecutor;

            //if (_configuration.NumberThreadsToUse > 1)
            //{
            //    var taskExecutor = new ParallelTaskExecutor();
            //    taskExecutor.MinThreads = 1;
            //    taskExecutor.MaxThreads = _configuration.NumberThreadsToUse;
            //    _algorithm.TaskExecutor = taskExecutor;
            //}

            //register generation ran callback
            _algorithm.GenerationRan += AlgorithmOnGenerationRan;
        }