public void Evolve_ManyGenerations_Fast() { var selection = new EliteSelection(); var crossover = new UniformCrossover(); var mutation = new UniformMutation(true); var chromosome = new AutoConfigChromosome(); var targetChromosome = new TspChromosome(10); var targetFitness = new TspFitness(10, 0, 100, 0, 100); var fitness = new AutoConfigFitness(targetFitness, targetChromosome); fitness.PopulationMinSize = 20; fitness.PopulationMaxSize = 20; fitness.Termination = new TimeEvolvingTermination(TimeSpan.FromSeconds(5)); var population = new Population(10, 10, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); ga.TaskExecutor = new SmartThreadPoolTaskExecutor() { MinThreads = 10, MaxThreads = 20 }; ga.Termination = new GenerationNumberTermination(2); ga.Start(); Assert.NotNull(ga.BestChromosome); }
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 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); }
/// <summary> /// Creates the fitness. /// </summary> /// <returns>The fitness.</returns> public override IFitness CreateFitness() { var r = Context.DrawingArea; m_fitness = new TspFitness(m_numberOfCities, r.Left, r.Right, r.Top, r.Bottom); return(m_fitness); }
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 Evaluate_ChromosomeWithLowerCities_FitnessDividedByDiff() { var target = new TspFitness(10, 0, 10, 0, 10); var chromosome = new TspChromosome(9); var actual = target.Evaluate(chromosome); Assert.AreNotEqual(0, actual); }
public void Evaluate_FitnessLowerThanZero_Zero() { var target = new TspFitness(10, 0, 10000000, 0, 10000000); var chromosome = new TspChromosome(10); var actual = target.Evaluate(chromosome); Assert.AreEqual(0, actual); }
public override IFitness CreateFitness() { var targetChromosome = new TspChromosome(10); var targetFitness = new TspFitness(10, 0, 100, 0, 100); var fitness = new AutoConfigFitness(targetFitness, targetChromosome); fitness.Termination = new FitnessStagnationTermination(500); fitness.PopulationMinSize = 20; fitness.PopulationMaxSize = 20; return(fitness); }
public void Evaluate_StartFailed_ZeroFitness() { var chromosome = new AutoConfigChromosome(); var targetChromosome = Substitute.For <IChromosome>(); targetChromosome.CreateNew().Returns(x => throw new Exception("TEST")); var targetFitness = new TspFitness(10, 0, 100, 0, 100); var target = new AutoConfigFitness(targetFitness, targetChromosome); var actual = target.Evaluate(chromosome); Assert.AreEqual(0, actual); }
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 Evaluate_StartOk_Fitness() { var chromosome = new AutoConfigChromosome(); var targetChromosome = new TspChromosome(10); var targetFitness = new TspFitness(10, 0, 100, 0, 100); var target = new AutoConfigFitness(targetFitness, targetChromosome); target.PopulationMinSize = 20; target.PopulationMaxSize = 20; target.Termination = new FitnessThresholdTermination(0.1f); var actual = target.Evaluate(chromosome); Assert.AreNotEqual(0, actual); }
public void Evolve_CompareToSingleChromosome_Evolved() { int numberOfCities = 30; var selection = new EliteSelection(); var crossover = new UniformCrossover(); var mutation = new TworsMutation(); // Given enough generations, the Multiple Chromosome should start exhibiting convergence // we compare TSP /25 gen with 3*TSP / 500 gen IChromosome chromosome = new TspChromosome(numberOfCities); IFitness fitness = new TspFitness(numberOfCities, 0, 1000, 0, 1000); var population = new Population(30, 30, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation) { Termination = new GenerationNumberTermination(26) }; ga.Start(); var simpleChromosomeDistance = ((TspChromosome)ga.Population.BestChromosome).Distance; chromosome = new MultipleChromosome((i) => new TspChromosome(numberOfCities), 3); //MultiChromosome should create 3 TSP chromosomes and store them in the corresponding property Assert.AreEqual(((MultipleChromosome)chromosome).Chromosomes.Count, 3); var tempMultiFitness = ((MultipleChromosome)chromosome).Chromosomes.Sum(c => fitness.Evaluate(c)); fitness = new MultipleFitness(fitness); //Multi fitness should sum over the fitnesses of individual chromosomes Assert.AreEqual(tempMultiFitness, fitness.Evaluate(chromosome)); population = new Population(30, 30, chromosome); ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation) { Termination = new GenerationNumberTermination(501) }; ga.Start(); var bestTSPChromosome = (TspChromosome)((MultipleChromosome)ga.Population.BestChromosome).Chromosomes .OrderByDescending(c => c.Fitness).First(); var multiChromosomesDistance = bestTSPChromosome.Distance; Assert.Less(multiChromosomesDistance, simpleChromosomeDistance); }
public void GA_WithAlternatingPositionCrossover_Evolve() { var chromosome = new TspChromosome(50); var population = new Population(50, 50, chromosome) { GenerationStrategy = new TrackingGenerationStrategy() }; var fitness = new TspFitness(chromosome.Length, 0, 1000, 0, 1000); var crossover = new AlternatingPositionCrossover(); var ga = new GeneticAlgorithm(population, fitness, new EliteSelection(), crossover, new ReverseSequenceMutation()) { Termination = new GenerationNumberTermination(100) }; ga.Start(); Assert.Less( population.Generations.First().BestChromosome.Fitness.Value, population.Generations.Last().BestChromosome.Fitness.Value); }
static void Main(string[] args) { 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 GeneticSharp.Domain.Crossovers.OrderedCrossover(); var mutation = new GeneticSharp.Domain.Mutations.ReverseSequenceMutation(); var selection = new GeneticSharp.Domain.Selections.RouletteWheelSelection(); var population = new GeneticSharp.Domain.Populations.Population(500, 1000, chromosome); m_ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); m_ga.Termination = new GeneticSharp.Domain.Terminations.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 }; // Every time a generation ends, we log the best solution. m_ga.GenerationRan += delegate { var distance = ((TspChromosome)m_ga.BestChromosome).Distance; Console.WriteLine($"Generation: {m_ga.GenerationsNumber} - Distance: ${distance}"); }; // Starts the genetic algorithm in a separate thread. m_gaThread = new Thread(() => m_ga.Start()); m_gaThread.Start(); Console.ReadLine(); // When the script is destroyed we stop the genetic algorithm and abort its thread too. m_ga.Stop(); m_gaThread.Abort(); }
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); }
/// <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 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(); }
public IFitness CreateFitness() { m_fitness = new TspFitness(m_numberOfCities, 0, 1000, 0, 1000); return(m_fitness); }