public void Evolve_ManyGenerations_Fast() { int numberOfCities = 40; var selection = new EliteSelection(); var crossover = new OrderedCrossover(); var mutation = new TworsMutation(); var chromosome = new TspChromosome(numberOfCities); var fitness = new TspFitness(numberOfCities, 0, 1000, 0, 1000); var population = new Population(40, 40, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); ga.Start(); var firstDistance = ((TspChromosome)ga.Population.BestChromosome).Distance; ga.Termination = new GenerationNumberTermination(1001); TimeAssert.LessThan(100000, () => { ga.Start(); }); var lastDistance = ((TspChromosome)ga.Population.BestChromosome).Distance; Assert.Less(lastDistance, firstDistance); }
private void Optimize_Load(object sender, EventArgs e) { var selection = new EliteSelection(); var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var fitness = new TrajectoryFitness(); var chromosome = new TrajectoryChromosome(TrajectoryChromosome.ChromosomeLength(3), 3); var population = new Population(35, 40, chromosome); //72 (6) //67 (2) //49 (3) //102 (1) var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); var executor = new SmartThreadPoolTaskExecutor(); executor.MinThreads = 1; executor.MaxThreads = 1; ga.TaskExecutor = executor; ga.Termination = new GenerationNumberTermination(10); Console.WriteLine("GA running..."); var t = DateTime.Now; ga.Start(); Console.WriteLine("Time:" + DateTime.Now.Subtract(t).TotalSeconds); Console.WriteLine("Best solution found has {0} fitness.", int.MaxValue - ga.BestChromosome.Fitness); Console.WriteLine(ga.BestChromosome.GetGene(0).Value + " " + ga.BestChromosome.GetGene(1).Value + " " + ga.BestChromosome.GetGene(2).Value); }
public static void ga() { AlgorithmList.loadformnistfsgm(); var selection = new EliteSelection(); var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var fitness = new MyProblemFitness(); var chromosome = new MyChromosome(); var population = new Population(4, 6, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); ga.Termination = new GenerationNumberTermination(4); Console.WriteLine("GA running..."); ga.Start(); Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness); var a = ga.BestChromosome.GetGenes(); string s = ""; foreach (var b in a) { s = s + b.Value.ToString(); } Console.WriteLine("Best solution found has {0} ", s); }
private void Start() { var fitness = new TspFitness(m_numberOfCities); var chromosome = new TspChromosome(m_numberOfCities); // This operators are classic genetic algorithm operators that lead to a good solution on TSP, // but you can try others combinations and see what result you get. var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var selection = new RouletteWheelSelection(); var population = new Population(50, 100, chromosome); m_ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); m_ga.Termination = new TimeEvolvingTermination(System.TimeSpan.FromHours(1)); // The fitness evaluation of whole population will be running on parallel. m_ga.TaskExecutor = new ParallelTaskExecutor { MinThreads = 100, MaxThreads = 200 }; // Everty time a generation ends, we log the best solution. m_ga.GenerationRan += delegate { var distance = ((TspChromosome)m_ga.BestChromosome).Distance; Debug.Log($"Generation: {m_ga.GenerationsNumber} - Distance: ${distance}"); }; DrawCities(); // Starts the genetic algorithm in a separate thread. m_gaThread = new Thread(() => m_ga.Start()); m_gaThread.Start(); }
public void Evolve_ManyGenerations_Fast() { int movesAhead = 10; int boardSize = 10; var selection = new EliteSelection(); var crossover = new OrderedCrossover(); var mutation = new TworsMutation(); var chromosome = new CheckersChromosome(movesAhead, boardSize); var fitness = new CheckersFitness(new CheckersBoard(boardSize)); var population = new Population(40, 40, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); ga.GenerationRan += delegate { if (ga.Population.GenerationsNumber % 100 == 0) { fitness.Update(ga.Population.BestChromosome as CheckersChromosome); } }; ga.Start(); var firstFitness = ((CheckersChromosome)ga.Population.BestChromosome).Fitness; ga.Termination = new GenerationNumberTermination(2001); ga.Start(); var lastFitness = ((CheckersChromosome)ga.Population.BestChromosome).Fitness; Assert.LessOrEqual(firstFitness, lastFitness); }
static GeneticAlgorithm CreateGA(IPopulation population) { var selection = new EliteSelection(); var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var fitness = new TspFitness(100, 0, 1000, 0, 1000); return(new GeneticAlgorithm(population, fitness, selection, crossover, mutation)); }
public void Initialize(int numberOfCities, int areaWidth, int areaHeight) { Stop(); Fitness = new TspFitness(numberOfCities, areaWidth, areaHeight); var chromosome = new TspChromosome(numberOfCities); // This operators are classic genetic algorithm operators that lead to a good solution on TSP, // but you can try others combinations and see what result you get. var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var selection = new RouletteWheelSelection(); var population = new Population(50, 100, chromosome); _ga = new GeneticAlgorithm(population, Fitness, selection, crossover, mutation); }
public void LinesOfCode() { const string source = @" using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; namespace ConsoleApplication1 { class Calculations { double CalculateTotal(int quantity, int itemPrice) { double basePrice = quantity * itemPrice; if (basePrice > 1000) { return basePrice * 0.95; } else { return basePrice * 0.98; } } } }"; var selection = new EliteSelection(); var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var fitness = new MetricsFitness <LinesOfCodeMetrics>(); var chromosome = new RefactoringChromosome(3, source); var population = new Population(20, 30, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation) { Termination = new GenerationNumberTermination(50) }; ga.Start(); Assert.IsNotNull(ga.BestChromosome.Fitness); TestContext.WriteLine($"Best fitness is {ga.BestChromosome.Fitness} and source looks like: \n {ga.BestChromosome}"); }
public void Cross_ParentWithNoOrderedGenes_Exception() { var target = new OrderedCrossover(); var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(10); chromosome1.ReplaceGenes(0, new Gene[] { new Gene(8), new Gene(4), new Gene(7), new Gene(3), new Gene(6), new Gene(2), new Gene(5), new Gene(1), new Gene(9), new Gene(0) }); chromosome1.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(10)); var chromosome2 = MockRepository.GenerateStub <ChromosomeBase>(10); chromosome2.ReplaceGenes(0, new Gene[] { new Gene(0), new Gene(1), new Gene(2), new Gene(3), new Gene(5), new Gene(5), new Gene(6), new Gene(7), new Gene(8), new Gene(9), }); chromosome2.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(10)); ExceptionAssert.IsThrowing(new CrossoverException(target, "The Ordered Crossover (OX1) can be only used with ordered chromosomes. The specified chromosome has repeated genes."), () => { target.Cross(new List <IChromosome>() { chromosome1, chromosome2 }); }); }
private static void TestCrossoverVsMutation() { List <double> b = new List <double>(); List <double> w = new List <double>(); List <double> a = new List <double>(); var evaluation = new TspEvaluation(@"C:\Users\jbelter\source\repos\machine-learning-cvrp\data\A-n46-k7.vrp"); double[] px = { 0, .1, .8, 1, 0, 0, 0 }; double[] pw = { 0, 0, 0, 0, .2, .5, 1 }; for (int j = 0; j < 7; j++) { for (int i = 0; i < 20; i++) { var stopCondition = new IterationsStopCondition(200); //var optimizer = new TspRandomSearch(evaluation, stopCondition); var generator = new TspGenerator(new Random()); ASelection selection = new TournamentSelection(Convert.ToInt32(5)); var crossover = new OrderedCrossover(px[j]); var mutation = new SwapMutation(pw[j]); var optimizer = new GeneticAlgorithm <int>(evaluation, stopCondition, generator, selection, crossover, mutation, 100); optimizer.Run(); b.Add(optimizer.bestSolutions.Last()); w.Add(optimizer.worstValues.Last()); a.Add(optimizer.averageValues.Last()); } double avgB = 0.0, avgA = 0.0, avgW = 0.0; for (int i = 0; i < b.Count; i++) { avgB += b[i]; avgA += a[i]; avgW += w[i]; } avgB /= b.Count; avgA /= b.Count; avgW /= b.Count; Console.WriteLine("avg(best value): " + avgB.ToString() + " avg(average value): " + avgA.ToString() + " avg(worst value): " + avgW.ToString()); } }
public void Cross_ParentWithNoOrderedGenes_Exception() { var target = new OrderedCrossover(); var chromosome1 = Substitute.For <ChromosomeBase>(10); chromosome1.ReplaceGenes(0, new Gene[] { new Gene(8), new Gene(4), new Gene(7), new Gene(3), new Gene(6), new Gene(2), new Gene(5), new Gene(1), new Gene(9), new Gene(0) }); chromosome1.CreateNew().Returns(Substitute.For <ChromosomeBase>(10)); var chromosome2 = Substitute.For <ChromosomeBase>(10); chromosome2.ReplaceGenes(0, new Gene[] { new Gene(0), new Gene(1), new Gene(2), new Gene(3), new Gene(5), new Gene(5), new Gene(6), new Gene(7), new Gene(8), new Gene(9), }); chromosome2.CreateNew().Returns(Substitute.For <ChromosomeBase>(10)); Assert.Catch <CrossoverException>(() => { target.Cross(new List <IChromosome>() { chromosome1, chromosome2 }); }, "The Ordered Crossover (OX1) can be only used with ordered chromosomes. The specified chromosome has repeated genes."); }
protected void RunGeneticAlgorithm() { try { var referencePoint = new ReferencePoint(new GeoPoint3D(_view.StartLongitude, _view.StartLatitude), new Point3D(0, 0)); TrajectoryFitness.ReferencePoint = referencePoint; TrajectoryFitness.GeoEndPoint = new GeoPoint3D(_view.EndLongitude, _view.EndLatitude); TrajectoryFitness.OptimiseFuel = !_view.MinimiseNoise; TrajectoryFitness.TakeoffHeading = _view.TakeoffHeading; TrajectoryFitness.TakeoffSpeed = _view.TakeoffSpeed; TrajectoryFitness.trajectories = null; TrajectoryFitness.Best = int.MinValue; TrajectoryFitness.PopulationData = new PopulationData2("population.dat", referencePoint); var selection = new EliteSelection(); var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var fitness = new TrajectoryFitness(); var chromosome = new TrajectoryChromosome(TrajectoryChromosome.ChromosomeLength(_view.NumberOfSegments), _view.NumberOfSegments); var population = new Population(_view.PopulationSize, _view.PopulationSize, chromosome); ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); var executor = new SmartThreadPoolTaskExecutor(); executor.MinThreads = 1; executor.MaxThreads = 1; ga.TaskExecutor = executor; ga.Termination = new GenerationNumberTermination(_view.NumberOfGenerations); startTime = DateTime.Now; ga.TerminationReached += OptimisationCompleted; ga.GenerationRan += UpdatePercentage; ga.Start(); } catch (ThreadAbortException) { // ignore it } catch (Exception ex) { MessageBox.Show(ex.Message); } }
static void Main(string[] args) { Console.WriteLine("Hello World!"); var selection = new GeneticSharp.Domain.Selections.RouletteWheelSelection(); var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var fitness = new MyProblemFitness(); var chromosome = new MyProblemChromosome(); var population = new Population(50, 70, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); ga.Termination = new GenerationNumberTermination(100); Console.WriteLine("GA running..."); ga.Start(); Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness); }
protected override GeneticAlgorithm CreateGA() { var size = (int)Camera.main.orthographicSize - 1; m_fitness = new TspFitness(m_numberOfCities, -size, size, -size, size); var chromosome = new TspChromosome(m_numberOfCities); var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var selection = new RouletteWheelSelection(); var population = new Population(50, 100, chromosome); var ga = new GeneticAlgorithm(population, m_fitness, selection, crossover, mutation); ga.Termination = new TimeEvolvingTermination(System.TimeSpan.FromDays(1)); ga.TaskExecutor = new ParallelTaskExecutor { MinThreads = 100, MaxThreads = 200 }; return(ga); }
private GeneticAlgorithm CreateGA(Func <TspChromosome, Population> createPopulation = null) { var selection = new EliteSelection(); var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var chromosome = new TspChromosome(_numberOfCities); var fitness = new TspFitness(_numberOfCities, 0, 1000, 0, 1000); var population = createPopulation == null ? new Population(_minPopulationSize, _minPopulationSize, chromosome) : createPopulation(chromosome); population.GenerationStrategy = new PerformanceGenerationStrategy(); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation) { Termination = new GenerationNumberTermination(_generations) }; return(ga); }
public void TSPSolve(int numberOfPoints, List <Point> stationList) { var fitness = new TspFitness(stationList); var chromosome = new TspChromosome(numberOfPoints); var crossover = new OrderedCrossover(); var mutation = new ReverseSequenceMutation(); var selection = new RouletteWheelSelection(); var population = new Population(50, 100, chromosome); m_ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); m_ga.Termination = new FitnessStagnationTermination(100); m_ga.TaskExecutor = new ParallelTaskExecutor { MinThreads = 100, MaxThreads = 200 }; m_ga.GenerationRan += delegate { var distance = ((TspChromosome)m_ga.BestChromosome).Distance; }; m_ga.TerminationReached += delegate { var c = m_ga.Population.CurrentGeneration.BestChromosome as TspChromosome; var genes = c.GetGenes(); var points = ((TspFitness)m_ga.Fitness).Points; finalPoints = new List <Point>(); for (int i = 0; i < genes.Length; i++) { finalPoints.Add(points[(int)genes[i].Value]); } tspSolved(); }; m_gaThread = new Thread(() => m_ga.Start()); m_gaThread.Start(); }
/// <summary> /// GeneticSharp TSP Console Application template. /// <see href="https://github.com/giacomelli/GeneticSharp"/> /// </summary> static void Main(string[] args) { var selection = new EliteSelection(); var crossover = new OrderedCrossover(); var mutation = new TworsMutation(); var fitness = new TspFitness(20, 0, 1000, 0, 1000); var chromosome = new TspChromosome(fitness.Cities.Count); var population = new Population(50, 70, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation) { Termination = new FitnessStagnationTermination(100) }; ga.GenerationRan += (s, e) => { Console.Clear(); Console.WriteLine($"Generation: {ga.GenerationsNumber}"); var c = ga.BestChromosome as TspChromosome; Console.WriteLine("Cities: {0:n0}", c.Length); Console.WriteLine("Distance: {0:n2}", c.Distance); var cities = c.GetGenes().Select(g => g.Value.ToString()).ToArray(); Console.WriteLine("City tour: {0}", string.Join(", ", cities)); }; Console.WriteLine("GA running..."); ga.Start(); Console.WriteLine(); Console.WriteLine($"Elapsed time: {ga.TimeEvolving}"); Console.WriteLine("Done."); Console.ReadKey(); }
public void NextGeneration(ISelection selectionScheme) { var selected = selectionScheme.Select(Chromosomes, 5).OrderByDescending(s => s.Cost).ToList(); Chromosomes.Remove(selected[0]); Chromosomes.Remove(selected[1]); // fill the remaining empty space with children generated from selected chromosomes Chromosome parent1 = selected[3]; Chromosome parent2 = selected[4]; Chromosome child1 = OrderedCrossover.MakeChild(parent1, parent2); Chromosome child2 = OrderedCrossover.MakeChild(parent2, parent1); if (ThreadSafeRandom.CurrentThreadRandom.Next(100) < 3) { child1.Mutate(); } if (ThreadSafeRandom.CurrentThreadRandom.Next(100) < 3) { child2.Mutate(); } Chromosomes.Add(child1); Chromosomes.Add(child2); double currentTour = Chromosomes.Where(c => c.Cost > 0).Min(c => c.Cost); if (currentTour < BestTour) { BestTour = currentTour; Console.WriteLine("Generation " + currentGeneration + " Best: " + BestTour); } currentGeneration++; }
private void StartEvolution() { SetupSourceColorMatrix(); if (currentDrawing == null) { currentDrawing = GetNewInitializedDrawing(); } lastSelected = 0; var selection = new EliteSelection(); // var selection = new CustomSelection(20); var crossover = new OrderedCrossover(); // var crossover = new CycleCrossover(); // var crossover = new CutAndSpliceCrossover(); // var crossover = new OnePointCrossover(2); var mutation = new CustomMutation(); // var mutation = new UniformMutation(true); var fitness = new DrawingFitness(sourceColors); var chromosome = new PolygonChromosome(); var population = new Population(10, 100, chromosome); _ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); _ga.Termination = new TimeEvolvingTermination(TimeSpan.FromHours(4)); // _ga.GenerationRan += (sender, args) => { generation++; var best = _ga.Population.CurrentGeneration.Chromosomes.OrderBy(c => c.Fitness).First() as PolygonChromosome; var drawing = new DnaDrawing(best); if (best.Fitness.Value <= errorLevel) { errorLevel = best.Fitness.Value; lock (currentDrawing) { currentDrawing = drawing; } selected++; } }; _ga.Stopped += (sender, args) => { Stop(); }; _ga.Start(); // while (isRunning) // { // DnaDrawing newDrawing; // lock (currentDrawing) // { // newDrawing = currentDrawing.Clone(); // } // newDrawing.Mutate(); // // if (newDrawing.IsDirty) // { // generation++; // // double newErrorLevel = FitnessCalculator.GetDrawingFitness( // newDrawing, // sourceColors); // // if (newErrorLevel <= errorLevel) // { // selected++; // lock (currentDrawing) // { // currentDrawing = newDrawing; // } // errorLevel = newErrorLevel; // } // } // //else, discard new drawing // } }
private void EvolveGeneticStrategyButton_Click(object sender, RoutedEventArgs e) { OutputTextBlock.Text = "Evolving..."; Task.Run(() => { var chromosome = new BlackjackChromosome(); var fitness = new BlackjackFitness(); var population = new Population(Settings.GeneticSettings.MinPopulationSize, Settings.GeneticSettings.MaxPopulationSize, chromosome); ISelection selection; switch (Settings.GeneticSettings.SelectionType) { case SelectionType.Elite: selection = new EliteSelection(); break; case SelectionType.RouletteWheel: selection = new RouletteWheelSelection(); break; case SelectionType.StochasticUniversalSampling: selection = new StochasticUniversalSamplingSelection(); break; case SelectionType.Tournament: selection = new TournamentSelection(Settings.GeneticSettings.TournamentSize); break; default: throw new InvalidOperationException(); } ICrossover crossover; switch (Settings.GeneticSettings.CrossoverType) { case CrossoverType.AlternatingPosition: crossover = new AlternatingPositionCrossover(); break; case CrossoverType.CutAndSplice: crossover = new CutAndSpliceCrossover(); break; case CrossoverType.Cycle: crossover = new CycleCrossover(); break; case CrossoverType.OnePoint: crossover = new OnePointCrossover(); break; case CrossoverType.TwoPoint: crossover = new TwoPointCrossover(); break; case CrossoverType.OrderBased: crossover = new OrderBasedCrossover(); break; case CrossoverType.Ordered: crossover = new OrderedCrossover(); break; case CrossoverType.PartiallyMapped: crossover = new PartiallyMappedCrossover(); break; case CrossoverType.PositionBased: crossover = new PositionBasedCrossover(); break; case CrossoverType.ThreeParent: crossover = new ThreeParentCrossover(); break; case CrossoverType.Uniform: crossover = new UniformCrossover(Settings.Current.GeneticSettings.MixProbability); break; case CrossoverType.VotingRecombination: crossover = new VotingRecombinationCrossover(); break; default: throw new InvalidOperationException(); } var mutation = new UniformMutation(); var termination = new FitnessStagnationTermination(Settings.Current.GeneticSettings.NumStagnantGenerations); var taskExecutor = new ParallelTaskExecutor(); var ga = new GeneticAlgorithm( population, fitness, selection, crossover, mutation); ga.Termination = termination; ga.TaskExecutor = taskExecutor; ga.MutationProbability = Settings.GeneticSettings.MutationProbability; ga.CrossoverProbability = Settings.GeneticSettings.CrossoverProbability; var latestFitness = double.MinValue; ga.GenerationRan += (s, o) => { geneticStrategy = (IStrategy)ga.BestChromosome; var generationNumber = ga.GenerationsNumber; var bestFitness = ga.BestChromosome.Fitness.Value; var avgFitness = ga.Population.CurrentGeneration.Chromosomes.Average(c => c.Fitness.Value); Dispatcher.Invoke(() => { if (generationNumber == 1) { OutputTextBlock.Text = string.Empty; } OutputTextBlock.Text = $"Gen: {generationNumber}\tFit: {bestFitness}\tAvg: {avgFitness.ToString("0")}\n" + OutputTextBlock.Text; if (bestFitness != latestFitness) { latestFitness = bestFitness; var savedImageName = Settings.Current.GeneticSettings.SaveImagePerGeneration ? "gen" + generationNumber : null; StrategyViewer.Draw(GeneticStrategyCanvas, geneticStrategy, $"Best from generation {generationNumber}", savedImageName); } }, DispatcherPriority.Background); }; ga.TerminationReached += (s, o) => { Dispatcher.Invoke(() => { OutputTextBlock.Text = "Termination reached.\n" + OutputTextBlock.Text; TestGeneticStrategyButton.IsEnabled = true; }, DispatcherPriority.Background); }; ga.Start(); }); }
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 void Cross_ParentsWith10Genes_Cross() { var target = new OrderedCrossover(); // 8 4 7 3 6 2 5 1 9 0 var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(10); chromosome1.ReplaceGenes(0, new Gene[] { new Gene(8), new Gene(4), new Gene(7), new Gene(3), new Gene(6), new Gene(2), new Gene(5), new Gene(1), new Gene(9), new Gene(0) }); chromosome1.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(10)); // 0 1 2 3 4 5 6 7 8 9 var chromosome2 = MockRepository.GenerateStub <ChromosomeBase>(10); chromosome2.ReplaceGenes(0, new Gene[] { new Gene(0), new Gene(1), new Gene(2), new Gene(3), new Gene(4), new Gene(5), new Gene(6), new Gene(7), new Gene(8), new Gene(9), }); chromosome2.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(10)); // Child one: 0 4 7 3 6 2 5 1 8 9 // Child two: 8 2 1 3 4 5 6 7 9 0 var rnd = MockRepository.GenerateMock <IRandomization>(); rnd.Expect(r => r.GetUniqueInts(2, 0, 10)).Return(new int[] { 7, 3 }); RandomizationProvider.Current = rnd; IList <IChromosome> actual = null;; TimeAssert.LessThan(30, () => { actual = target.Cross(new List <IChromosome> () { chromosome1, chromosome2 }); }); Assert.AreEqual(2, actual.Count); Assert.AreEqual(10, actual[0].Length); Assert.AreEqual(10, actual[1].Length); Assert.AreEqual(10, actual[0].GetGenes().Distinct().Count()); Assert.AreEqual(10, actual[1].GetGenes().Distinct().Count()); Assert.AreEqual(0, actual[0].GetGene(0).Value); Assert.AreEqual(4, actual[0].GetGene(1).Value); Assert.AreEqual(7, actual[0].GetGene(2).Value); Assert.AreEqual(3, actual[0].GetGene(3).Value); Assert.AreEqual(6, actual[0].GetGene(4).Value); Assert.AreEqual(2, actual[0].GetGene(5).Value); Assert.AreEqual(5, actual[0].GetGene(6).Value); Assert.AreEqual(1, actual[0].GetGene(7).Value); Assert.AreEqual(8, actual[0].GetGene(8).Value); Assert.AreEqual(9, actual[0].GetGene(9).Value); Assert.AreEqual(8, actual[1].GetGene(0).Value); Assert.AreEqual(2, actual[1].GetGene(1).Value); Assert.AreEqual(1, actual[1].GetGene(2).Value); Assert.AreEqual(3, actual[1].GetGene(3).Value); Assert.AreEqual(4, actual[1].GetGene(4).Value); Assert.AreEqual(5, actual[1].GetGene(5).Value); Assert.AreEqual(6, actual[1].GetGene(6).Value); Assert.AreEqual(7, actual[1].GetGene(7).Value); Assert.AreEqual(9, actual[1].GetGene(8).Value); Assert.AreEqual(0, actual[1].GetGene(9).Value); }
public void Cross_ParentsWith10Genes_Cross() { var target = new OrderedCrossover(); // 8 4 7 3 6 2 5 1 9 0 var chromosome1 = Substitute.For <ChromosomeBase>(10); chromosome1.ReplaceGenes(0, new Gene[] { new Gene(8), new Gene(4), new Gene(7), new Gene(3), new Gene(6), new Gene(2), new Gene(5), new Gene(1), new Gene(9), new Gene(0) }); chromosome1.CreateNew().Returns(Substitute.For <ChromosomeBase>(10)); // 0 1 2 3 4 5 6 7 8 9 var chromosome2 = Substitute.For <ChromosomeBase>(10); chromosome2.ReplaceGenes(0, new Gene[] { new Gene(0), new Gene(1), new Gene(2), new Gene(3), new Gene(4), new Gene(5), new Gene(6), new Gene(7), new Gene(8), new Gene(9), }); chromosome2.CreateNew().Returns(Substitute.For <ChromosomeBase>(10)); // Child one: 0 4 7 3 6 2 5 1 8 9 // Child two: 8 2 1 3 4 5 6 7 9 0 var rnd = Substitute.For <IRandomization>(); rnd.GetUniqueInts(2, 0, 10).Returns(new int[] { 7, 3 }); RandomizationProvider.Current = rnd; var actual = target.Cross(new List <IChromosome>() { chromosome1, chromosome2 }); Assert.AreEqual(2, actual.Count); Assert.AreEqual(10, actual[0].Length); Assert.AreEqual(10, actual[1].Length); Assert.AreEqual(10, actual[0].GetGenes().Distinct().Count()); Assert.AreEqual(10, actual[1].GetGenes().Distinct().Count()); Assert.AreEqual(0, actual[0].GetGene(0).Value); Assert.AreEqual(4, actual[0].GetGene(1).Value); Assert.AreEqual(7, actual[0].GetGene(2).Value); Assert.AreEqual(3, actual[0].GetGene(3).Value); Assert.AreEqual(6, actual[0].GetGene(4).Value); Assert.AreEqual(2, actual[0].GetGene(5).Value); Assert.AreEqual(5, actual[0].GetGene(6).Value); Assert.AreEqual(1, actual[0].GetGene(7).Value); Assert.AreEqual(8, actual[0].GetGene(8).Value); Assert.AreEqual(9, actual[0].GetGene(9).Value); Assert.AreEqual(8, actual[1].GetGene(0).Value); Assert.AreEqual(2, actual[1].GetGene(1).Value); Assert.AreEqual(1, actual[1].GetGene(2).Value); Assert.AreEqual(3, actual[1].GetGene(3).Value); Assert.AreEqual(4, actual[1].GetGene(4).Value); Assert.AreEqual(5, actual[1].GetGene(5).Value); Assert.AreEqual(6, actual[1].GetGene(6).Value); Assert.AreEqual(7, actual[1].GetGene(7).Value); Assert.AreEqual(9, actual[1].GetGene(8).Value); Assert.AreEqual(0, actual[1].GetGene(9).Value); }
private static void TestGA(AEvaluation <int> problem, double probCrossover, double probMutation, int population, int iterations, double tournament) { List <String> results = new List <String>(); List <String> learningProgress = new List <String>(); int savedRun = new Random().Next(0, 10); for (int i = 0; i < 10; i++) { //var evaluation = new TspEvaluation(@"C:\Users\jbelter\source\repos\machine-learning-cvrp\data\A-n32-k5.vrp"); var evaluation = problem; var stopCondition = new IterationsStopCondition(iterations); //var optimizer = new TspRandomSearch(evaluation, stopCondition); var generator = new TspGenerator(new Random()); ASelection selection; if (tournament > 1 && tournament <= population) { selection = new TournamentSelection(Convert.ToInt32(tournament)); } else if (tournament > 0 && tournament <= 1) { selection = new TournamentSelection(tournament); } else { selection = new TournamentSelection(5); } var crossover = new OrderedCrossover(probCrossover); var mutation = new SwapMutation(probMutation); var optimizer = new GeneticAlgorithm <int>(evaluation, stopCondition, generator, selection, crossover, mutation, population); optimizer.Run(); if (i == savedRun) { learningProgress = formatLearning(optimizer.worstValues, optimizer.averageValues, optimizer.bestSolutions); } //ReportOptimizationResult(optimizer.Result); results.Add(String.Join(", ", problem.iSize.ToString(), optimizer.timeTaken.ToString(), optimizer.bestSolutions.Last().ToString(), optimizer.averageValues.Last().ToString(), optimizer.worstValues.Last().ToString(), probCrossover.ToString(), probMutation.ToString(), population.ToString(), iterations.ToString(), tournament.ToString() )); } SaveToFile(@"C:\Users\jbelter\source\repos\machine-learning-cvrp\resultsGA.txt", results); SaveToFile((@"C:\Users\jbelter\source\repos\machine-learning-cvrp\progress\GA" + "-" + problem.iSize.ToString() + "-" + probCrossover.ToString() + "-" + probMutation.ToString() + "-" + population.ToString() + "-" + iterations.ToString() + "-" + tournament.ToString()) .Replace(".", "") + ".txt", learningProgress); }
static void Main(string[] args) { var selection = new EliteSelection(); var crossover = new OrderedCrossover(); }
public IList <IChromosome> OrderedCrossover() { var target = new OrderedCrossover(); return(target.Cross(CreateTwoParents())); }