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