Exemple #1
0
        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);
        }
Exemple #3
0
        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();
    }
Exemple #5
0
        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);
        }
Exemple #6
0
        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));
        }
Exemple #7
0
    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}");
        }
Exemple #9
0
        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
                });
            });
        }
Exemple #10
0
        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);
            }
        }
Exemple #13
0
        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);
        }
Exemple #16
0
    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();
    }
Exemple #17
0
        /// <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++;
        }
Exemple #19
0
        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
//            }
        }
Exemple #20
0
        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();
            });
        }
Exemple #21
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));
        }
Exemple #22
0
        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);
        }
Exemple #24
0
        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);
        }
Exemple #25
0
 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()));
        }