コード例 #1
0
        public void Evolve_ManyGenerations_Fast()
        {
            var selection = new EliteSelection();
            var crossover = new ThreeParentCrossover();
            var mutation  = new UniformMutation(true);

            var fitness = new FunctionBuilderFitness(
                new FunctionBuilderInput(
                    new double[] { 1, 2 },
                    3)
                ,
                new FunctionBuilderInput(
                    new double[] { 2, 3 },
                    5)
                );
            var chromosome = new FunctionBuilderChromosome(fitness.AvailableOperations, 3);

            var population = new Population(100, 200, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.Termination = new OrTermination(new FitnessThresholdTermination(0), new TimeEvolvingTermination(TimeSpan.FromSeconds(15)));
            ga.Start();
            var bestChromosome = ga.BestChromosome as FunctionBuilderChromosome;

            Assert.AreEqual(0.0, bestChromosome.Fitness.Value);
            var actual = fitness.GetFunctionResult(
                bestChromosome.BuildFunction(),
                new FunctionBuilderInput(new double[] { 3, 4 }, 7)
                );

            Assert.AreEqual(7, actual);
        }
コード例 #2
0
        public void Cross_ThreeParents_OneChildren()
        {
            var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(4);

            chromosome1.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
            });
            chromosome1.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(4));

            var chromosome2 = MockRepository.GenerateStub <ChromosomeBase>(4);

            chromosome2.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(5),
                new Gene(6),
                new Gene(4)
            });
            chromosome2.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(4));

            var chromosome3 = MockRepository.GenerateStub <ChromosomeBase>(4);

            chromosome3.ReplaceGenes(0, new Gene[]
            {
                new Gene(10),
                new Gene(11),
                new Gene(12),
                new Gene(13)
            });
            chromosome3.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(4));

            var parents = new List <IChromosome>()
            {
                chromosome1, chromosome2, chromosome3
            };

            var target = new ThreeParentCrossover();

            var actual = target.Cross(parents);

            Assert.AreEqual(1, actual.Count);
            Assert.AreEqual(4, actual[0].Length);

            Assert.AreEqual(1, actual[0].GetGene(0).Value);
            Assert.AreEqual(11, actual[0].GetGene(1).Value);
            Assert.AreEqual(12, actual[0].GetGene(2).Value);
            Assert.AreEqual(4, actual[0].GetGene(3).Value);
        }
コード例 #3
0
        public void Cross_ThreeParents_OneChildren()
        {
            var chromosome1 = Substitute.For <ChromosomeBase>(4);

            chromosome1.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
            });
            chromosome1.CreateNew().Returns(Substitute.For <ChromosomeBase>(4));

            var chromosome2 = Substitute.For <ChromosomeBase>(4);

            chromosome2.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(5),
                new Gene(6),
                new Gene(4)
            });
            chromosome2.CreateNew().Returns(Substitute.For <ChromosomeBase>(4));

            var chromosome3 = Substitute.For <ChromosomeBase>(4);

            chromosome3.ReplaceGenes(0, new Gene[]
            {
                new Gene(10),
                new Gene(11),
                new Gene(12),
                new Gene(13)
            });
            chromosome3.CreateNew().Returns(Substitute.For <ChromosomeBase>(4));

            var parents = new List <IChromosome>()
            {
                chromosome1, chromosome2, chromosome3
            };

            var target = new ThreeParentCrossover();

            var actual = target.Cross(parents);

            Assert.AreEqual(1, actual.Count);
            Assert.AreEqual(4, actual[0].Length);

            Assert.AreEqual(1, actual[0].GetGene(0).Value);
            Assert.AreEqual(11, actual[0].GetGene(1).Value);
            Assert.AreEqual(12, actual[0].GetGene(2).Value);
            Assert.AreEqual(4, actual[0].GetGene(3).Value);
        }
コード例 #4
0
        static void Main(string[] args)
        {
            // Problem: Simple addition
            // 1 + 1 = 2
            // 2 + 2 = 4
            // 3 + 2 = 5
            var myInputs = new List <FunctionBuilderInput>
            {
                new FunctionBuilderInput(new List <double> {
                    1, 1
                }, 2),
                new FunctionBuilderInput(new List <double> {
                    2, 2
                }, 4),
                new FunctionBuilderInput(new List <double> {
                    3, 2
                }, 5)
            };
            var myFitness    = new FunctionBuilderFitness(myInputs.ToArray());
            var myChromosome = new FunctionBuilderChromosome(myFitness.AvailableOperations, 5);
            var selection    = new EliteSelection();
            var crossover    = new ThreeParentCrossover();
            var mutation     = new UniformMutation(true);
            var fitness      = myFitness;
            var chromosome   = myChromosome;
            var population   = new Population(100, 200, chromosome)
            {
                GenerationStrategy = new PerformanceGenerationStrategy()
            };
            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new FitnessThresholdTermination(0)
            };

            ga.GenerationRan += delegate
            {
                Console.Clear();
                var bestChromosome = ga.Population.BestChromosome;
                Console.WriteLine("Generations: {0}", ga.Population.GenerationsNumber);
                Console.WriteLine("Fitness: {0,10}", bestChromosome.Fitness);
                Console.WriteLine("Time: {0}", ga.TimeEvolving);
                Console.WriteLine("Speed (gen/sec): {0:0.0000}", ga.Population.GenerationsNumber / ga.TimeEvolving.TotalSeconds);
                var best = bestChromosome as FunctionBuilderChromosome;
                Console.WriteLine("Function: {0}", best.BuildFunction());
            };
            ga.Start();
            Console.WriteLine("Evolved.");
            Console.ReadKey();
        }
コード例 #5
0
        public void StartGeneticAlgo(string target)
        {
            var selection = new EliteSelection();
            var crossover = new ThreeParentCrossover();
            var mutation  = new ReverseSequenceMutation();
            var fitness   = new MyFitness {
                Target = target
            };
            var chromosome = new Chromosome(target);
            var population = new Population(500, 1000, chromosome);

            _stopwatch = Stopwatch.StartNew();

            _ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination         = new GenerationNumberTermination(300),
                MutationProbability = float.MaxValue
            };
            _timer = new Timer(new TimerCallback(_ =>
            {
                _ga.Termination = new GenerationNumberTermination(_ga.GenerationsNumber + 1);
                if (_ga.GenerationsNumber > 0)
                {
                    _ga.Resume();
                }
                else
                {
                    _ga.Start();
                }

                var teste = string.Empty;
                for (var i = 0; i < _ga.BestChromosome.GetGenes().Length; i++)
                {
                    teste += _ga.BestChromosome.GetGenes()[i].Value;
                    if (teste == target)
                    {
                        Stop();
                        _stopwatch.Stop();
                    }
                }
                StateHasChanged?.Invoke();
            }), null, 0, 1);
        }
コード例 #6
0
        public void Start_ThreeParentCrossover_KeepsMinSizePopulation()
        {
            var selection  = new EliteSelection();
            var crossover  = new ThreeParentCrossover();
            var mutation   = new UniformMutation();
            var chromosome = new ChromosomeStub();
            var target     = new GeneticAlgorithm(new Population(100, 199, chromosome),
                                                  new FitnessStub()
            {
                SupportsParallel = false
            }, selection, crossover, mutation);

            target.Termination = new GenerationNumberTermination(100);

            target.Start();

            Assert.AreEqual(100, target.Population.Generations.Count);

            Assert.IsTrue(target.Population.Generations.All(g => g.Chromosomes.Count >= 100));
        }
コード例 #7
0
ファイル: Test.cs プロジェクト: mihaistancu/HC2K18
        public OutputData DoIt(InputData inputData)
        {
            var selection  = new EliteSelection();
            var crossover  = new ThreeParentCrossover();;;  //OnePointCrossover
            var mutation   = new ReverseSequenceMutation(); //DisplacementMutation ReverseSequenceMutation
            var fitness    = new MyProblemFitness(inputData);
            var chromosome = new MyProblemChromosome(inputData.F, inputData.N);
            var population = new Population(100, 1000, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.Termination = new FitnessStagnationTermination(10000);
            ga.Population.GenerationStrategy = new TrackingGenerationStrategy();
            Console.WriteLine("GA running...");

            double currentFitness = 0;

            ga.GenerationRan += delegate(object obj, EventArgs eventArgs)
            {
                var outputx = new MyProblemFitness(inputData);
                var re      = outputx.Evaluate(((GeneticAlgorithm)obj).BestChromosome);
                if (re != currentFitness)
                {
                    currentFitness = re;
                    Console.WriteLine("Fitness..." + re);
                }
            };

            ga.Start();

            var x      = ga.BestChromosome;
            var output = new MyProblemFitness(inputData);
            var res    = output.Evaluate(ga.BestChromosome);

            Console.WriteLine("Done...fitness..." + res);
            return(output.OutputData);
        }
コード例 #8
0
        public void functionOptimizationWithGeneticsharp()
        {
            /* example from
             * http://diegogiacomelli.com.br/function-optimization-with-geneticsharp/
             */
            float maxWidth  = 998f;
            float maxHeight = 680f;

            var chromosome = new FloatingPointChromosome(
                new double[] { 0, 0, 0, 0 },
                new double[] { maxWidth, maxHeight, maxWidth, maxHeight },
                new int[] { 12, 12, 12, 12 },
                new int[] { 0, 0, 0, 0 });

            var population = new Population(50, 100, chromosome);

            var fitness = new FuncFitness((c) =>
            {
                var fc = c as FloatingPointChromosome;

                var values = fc.ToFloatingPoints();
                var x1     = values[0];
                var y1     = values[1];
                var x2     = values[2];
                var y2     = values[3];

                return(Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)));
            });

            var selection   = new RouletteWheelSelection();
            var crossover   = new ThreeParentCrossover();
            var mutation    = new PartialShuffleMutation();
            var termination = new FitnessStagnationTermination(100);

            var ga = new GeneticAlgorithm(
                population,
                fitness,
                selection,
                crossover,
                mutation);

            ga.Termination = termination;

            Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");

            var latestFitness = 0.0;

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

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.ToFloatingPoints();
                    var s         = string.Format("Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
                                                  ga.GenerationsNumber,
                                                  phenotype[0],
                                                  phenotype[1],
                                                  phenotype[2],
                                                  phenotype[3],
                                                  bestFitness);
                    Console.WriteLine(
                        s
                        );
                }
            };

            ga.Start();
        }
コード例 #9
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();
            });
        }
コード例 #10
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));
        }
コード例 #11
0
        private void submitButton_Click(object sender, RoutedEventArgs ev)
        {
            resultBox.Text = "";
            if (string.IsNullOrEmpty(textBox.Text))
            {
                resultBox.Text = "Wybierz plik z danymi...";
                return;
            }
            string[]    lines           = File.ReadAllLines(textBox.Text);
            int         edgesNumber     = lines.Count();
            List <Edge> edges           = new List <Edge>();
            int         edgeIndex       = 0;
            string      stringSeparator = " ";

            foreach (string l in lines)
            {
                int[] values = l.Split(stringSeparator.ToCharArray(), StringSplitOptions.None).Select(s => int.Parse(s)).ToArray();

                // Krawędź może być przechodzona w obu kierunkach
                edges.Add(new Edge(values[0], values[1], values[2], edgeIndex));

                // Ddodawana jest także w odwróconej wersji
                edges.Add(new Edge(values[1], values[0], values[2], edgeIndex));

                //Krawędź i jej odwrócona wersja mają ten sam indeks(dla łatwiejszego odnajdowania)
                edgeIndex++;
            }

            EliteSelection       selection = new EliteSelection();
            ThreeParentCrossover crossover = new ThreeParentCrossover();
            TworsMutation        mutation  = new TworsMutation();
            Fitness    fitness             = new Fitness(edges);
            Chromosome chromosome          = new Chromosome(4 * edgesNumber, edges);
            Population population          = new Population(200, 400, chromosome);

            GeneticAlgorithm ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new GenerationNumberTermination(400)
            };

            Stopwatch timer = new Stopwatch();

            timer.Start();
            ga.Start();
            timer.Stop();

            Chromosome bestChromosome   = ga.BestChromosome as Chromosome;
            int        currentEdgeIndex = int.Parse(bestChromosome.GetGene(0).Value.ToString());
            Edge       currentEdge      = edges[currentEdgeIndex];
            int        startVertex      = currentEdge.VertexA;
            int        totalCost        = currentEdge.Cost;
            string     verticesSequence = currentEdge.VertexA + "-" + currentEdge.VertexB;

            resultBox.Text += $"Funkcja dopasowania najlepszego rozwiązania wynosi: {bestChromosome.Fitness}\n";
            for (int i = 1; i < bestChromosome.Length; i++)
            {
                currentEdgeIndex    = int.Parse(bestChromosome.GetGene(i).Value.ToString());
                currentEdge         = edges[currentEdgeIndex];
                currentEdge.Visited = true;
                edges.SingleOrDefault(e => e.VertexA == currentEdge.VertexB && e.VertexB == currentEdge.VertexA).Visited = true;
                totalCost        += currentEdge.Cost;
                verticesSequence += "-" + currentEdge.VertexB;

                if (Fitness.AllEdgesVisited(edges))
                {
                    if (currentEdge.VertexB == startVertex)
                    {
                        break;
                    }

                    Edge possibleEdge = edges.SingleOrDefault(e => e.VertexA == currentEdge.VertexB && e.VertexB == startVertex);
                    if (possibleEdge != null)
                    {
                        totalCost        += possibleEdge.Cost;
                        verticesSequence += "-" + possibleEdge.VertexB;
                        break;
                    }
                }
            }

            resultBox.Text += $"Ścieżka: {verticesSequence}\n";
            resultBox.Text += $"Koszt najlepszego rozwiązania: {totalCost}\n";
            resultBox.Text += $"Czas wykonania: {timer.Elapsed.ToString(@"hh\:mm\:ss\.ff")}\n";
        }
コード例 #12
0
        static void Main(string[] args)
        {
            // grafy o różnej liczbie wierzchołków h7 h9 h20 h23 h25 h47
            string loc = Directory.GetCurrentDirectory() + "\\Grafy\\h7.txt";

            int[,] data = LoadData.FromFile(loc);
            drogi       = new List <Droga>();


            for (int i = 0; i < data.GetLength(0); i++)
            {
                Droga nowaDroga = new Droga(data[i, 0], data[i, 1], data[i, 2]);
                drogi.Add(nowaDroga);
                Droga powrotnaDroga = new Droga(data[i, 1], data[i, 0], data[i, 2]);
                drogi.Add(powrotnaDroga);
            }

            System.Console.WriteLine("Lista drog :");

            foreach (Droga droga in drogi)
            {
                System.Console.WriteLine(droga.pktPoczatkowy + " " + droga.pktNastepny + " " + droga.koszt);
            }

            Console.WriteLine("liczba dróg : " + drogi.Count);
            Console.WriteLine();

            var selection  = new EliteSelection();
            var crossover  = new ThreeParentCrossover(); //dwóch rodziców dwojka dzieci TwoPointCrossover();//
            var mutation   = new TworsMutation();        // zmiana pozycji dwóch genów bybranych losowo
            var fitness    = new PostmanFitness();
            var chromosome = new PostmanChromosome(3 * drogi.Count);
            var population = new Population(30, 30, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.CrossoverProbability = 0.90F;
            ga.MutationProbability  = 0.05F;
            ga.Termination          = new GenerationNumberTermination(800);

            Console.WriteLine("Prawdopodobieństwo krzyżowania: " + ga.CrossoverProbability);
            Console.WriteLine("Prawdopodobieństwo mutacji: " + ga.MutationProbability);

            Stopwatch timer = new Stopwatch();

            timer.Start();

            Console.WriteLine("Obliczanie...");
            ga.Start();
            Console.WriteLine("Koniec obliczeń");

            timer.Stop();

            bool pierwszy            = true;
            int  miastoStartoweIndex = Convert.ToInt32(ga.BestChromosome.GetGenes()[0].Value);
            int  miastoStartowe      = drogi[miastoStartoweIndex].pktPoczatkowy;
            int  kosztCalkowity      = 0;

            foreach (Gene gene in ga.BestChromosome.GetGenes())
            {
                int index = Convert.ToInt32(gene.Value);
                kosztCalkowity += drogi[index].koszt;
                if (PostmanFitness.czyKazdaDrogaZostalaPokonana(drogi) && drogi[index].pktNastepny == miastoStartowe)
                {
                    Console.Write("-" + drogi[index].pktNastepny.ToString());
                    break;
                }
                else
                {
                    if (pierwszy)
                    {
                        Console.Write(drogi[index].pktPoczatkowy.ToString() + "-" + drogi[index].pktNastepny.ToString());
                        pierwszy = false;
                    }
                    else
                    {
                        Console.Write("-" + drogi[index].pktNastepny.ToString());
                    }
                    drogi[index].czyDotarl = true;
                    Droga drogaPowrotna = drogi.Find(a => (a.pktPoczatkowy.ToString() + "-" + a.pktNastepny.ToString()).Equals(drogi[index].pktNastepny.ToString() + "-" + drogi[index].pktPoczatkowy.ToString()));
                    drogaPowrotna.czyDotarl = true;
                }
            }

            TimeSpan ts = timer.Elapsed;

            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);

            Console.WriteLine();

            Console.WriteLine("Czas obliczeń : {0}", elapsedTime);
            Console.WriteLine("Całkowity koszt przebytej trasy : {0}", kosztCalkowity);

            Console.ReadKey();
        }
コード例 #13
0
ファイル: Program.cs プロジェクト: fendeda/ChinesePostman
        static void Main(string[] args)
        {
            #region Loading data from File

            string location = Directory.GetCurrentDirectory() + "\\Data\\graf4_kod.txt";

            int[,] data = LoadDataFromFile(location);
            roads       = new List <Road>();
            for (int i = 0; i < data.GetLength(0); i++)
            {
                Road newRoad = new Road(data[i, 0], data[i, 1], data[i, 2]);     // one direction cost
                roads.Add(newRoad);
                Road reverseRoad = new Road(data[i, 1], data[i, 0], data[i, 3]); // read reverse road
                roads.Add(reverseRoad);
            }

            #endregion
            var selection  = new EliteSelection();
            var crossover  = new ThreeParentCrossover();
            var mutation   = new TworsMutation();
            var fitness    = new CPFitness();
            var chromosome = new CPChromosome(3 * roads.Count);
            var population = new Population(200, 400, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
            ga.Termination = new GenerationNumberTermination(400);
            Stopwatch timer = new Stopwatch();
            timer.Start();
            Console.WriteLine("GA running...");
            ga.Start();
            Console.WriteLine();
            timer.Stop();
            bool first          = true;
            int  startCityIndex = Convert.ToInt32(ga.BestChromosome.GetGenes()[0].Value, CultureInfo.InvariantCulture);
            int  startCity      = roads[startCityIndex].cityFrom;
            int  totalCost      = 0;
            foreach (Gene gene in ga.BestChromosome.GetGenes())
            {
                int ind = Convert.ToInt32(gene.Value, CultureInfo.InvariantCulture);
                totalCost += roads[ind].cost;
                if (CPFitness.everyRoadIsTraveled(roads) && roads[ind].cityTo == startCity)
                {
                    Console.Write("-" + roads[ind].cityTo.ToString());
                    break;
                }
                else
                {
                    if (first)
                    {
                        Console.Write(roads[ind].cityFrom.ToString() + "-" + roads[ind].cityTo.ToString());
                        first = false;
                    }
                    else
                    {
                        Console.Write("-" + roads[ind].cityTo.ToString());
                    }
                    roads[ind].isTravelled = true;
                    Road returnRoad = roads.Find(e => e.index.Equals(roads[ind].cityTo.ToString() + "-" + roads[ind].cityFrom.ToString()));
                    returnRoad.isTravelled = true;
                }
            }
            TimeSpan ts          = timer.Elapsed;
            string   elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
            Console.WriteLine();
            Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness);
            Console.WriteLine("Best solution has total cost: {0}", totalCost);
            Console.WriteLine("Time running: {0}", elapsedTime);
            Console.ReadKey();
        }
コード例 #14
0
        /// <summary>
        /// Loads presetsProfile into service.
        /// </summary>
        /// <exception cref="T:System.InvalidOperationException">Thrown when an attempt to load presetsProfile twice is made.</exception>
        public void AddGeneticAlgorithm(GADefinition definition, Guid Key)
        {
            var chromosome = new FloatingPointChromosome(
                minValue: new double[] { 0, 0, 0, 0 },
                maxValue: new double[] { _maxWidth, _maxHeight, _maxWidth, _maxHeight },
                totalBits: new int[] { 20, 20, 20, 20 },
                fractionDigits: new int[] { 0, 0, 0, 0 }, geneValues: _geneValues);

            ICrossover gaCrossover = default;

            switch (definition.Crossover)
            {
            case Crossovers.Uniform:
                gaCrossover = new UniformCrossover(mixProbability: 0.5f);
                break;

            case Crossovers.OnePoint:
                gaCrossover = new OnePointCrossover(swapPointIndex: 40);
                break;

            case Crossovers.ThreeParent:
                gaCrossover = new ThreeParentCrossover();
                break;

            default:
                throw new ArgumentOutOfRangeException(paramName: nameof(definition.Crossover),
                                                      actualValue: definition.Crossover, message: "Crossover has wrong value");
            }

            ISelection gaSelection = default;

            switch (definition.Selection)
            {
            case Selections.Elite:
                gaSelection = new EliteSelection();
                break;

            case Selections.Roulette:
                gaSelection = new RouletteWheelSelection();
                break;

            case Selections.Tournament:
                gaSelection = new TournamentSelection(
                    size: decimal.ToInt32(d: decimal.Multiply(definition.Population, new decimal(0.2f))));
                break;

            case Selections.StohasticUniversalSampling:
                gaSelection = new StochasticUniversalSamplingSelection();
                break;

            default:
                throw new ArgumentOutOfRangeException(paramName: nameof(definition.Selection),
                                                      actualValue: definition.Selection, message: "Selection has wrong value");
            }

            var gaMutation = new UniformMutation(true);


            var gaPopulation = new Population(minSize: definition.Population,
                                              maxSize: definition.Population, adamChromosome: chromosome);

            var ga = new GeneticAlgorithm(population: gaPopulation,
                                          fitness: new EuclideanDistanceFitness(), selection: gaSelection,
                                          crossover: gaCrossover, mutation: gaMutation);

            ga.MutationProbability = (float)definition.Mutation;
            ga.GenerationRan      += GeneticAlgorithmOnGenerationRan;
            ga.Termination         =
                new FitnessStagnationTermination(expectedStagnantGenerationsNumber: 5);

            _geneticAlgorithms.Add(key: Key, value: ga);
        }
コード例 #15
0
        public IList <IChromosome> ThreeParentCrossover()
        {
            var target = new ThreeParentCrossover();

            return(target.Cross(CreateThreeParents()));
        }
コード例 #16
0
ファイル: Program.cs プロジェクト: Bloooo8/GeneticApp
        private static void Main(string[] args)
        {
            Console.WriteLine("Podaj nazwę plkiu z danymi(bez rozszerzenia)");
            string fileName = Console.ReadLine();

            string[]    lines           = File.ReadAllLines(Directory.GetCurrentDirectory() + "\\" + fileName + ".txt");
            int         edgesNumber     = lines.Count();
            List <Edge> edges           = new List <Edge>();
            int         edgeIndex       = 0;
            string      stringSeparator = " ";

            foreach (string l in lines)
            {
                int[] values = l.Split(stringSeparator.ToCharArray(), StringSplitOptions.None).Select(s => int.Parse(s)).ToArray();

                // Krawędź może być przechodzona w obu kierunkach
                edges.Add(new Edge(values[0], values[1], values[2], edgeIndex));

                // Ddodawana jest także w odwróconej wersji
                edges.Add(new Edge(values[1], values[0], values[2], edgeIndex));

                //Krawędź i jej odwrócona wersja mają ten sam indeks(dla łatwiejszego odnajdowania)
                edgeIndex++;
            }

            EliteSelection       selection  = new EliteSelection();
            ThreeParentCrossover crossover  = new ThreeParentCrossover();
            TworsMutation        mutation   = new TworsMutation();
            FitnessFunction      fitness    = new FitnessFunction(edges);
            Chromosome           chromosome = new Chromosome(4 * edgesNumber, edges);
            Population           population = new Population(200, 400, chromosome);

            GeneticAlgorithm ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new GenerationNumberTermination(400)
            };

            Stopwatch timer = new Stopwatch();

            timer.Start();
            Console.WriteLine("START!");
            ga.Start();
            timer.Stop();

            Chromosome bestChromosome   = ga.BestChromosome as Chromosome;
            int        currentEdgeIndex = int.Parse(bestChromosome.GetGene(0).Value.ToString());
            Edge       currentEdge      = edges[currentEdgeIndex];
            int        startVertex      = currentEdge.VertexA;
            int        totalCost        = currentEdge.Cost;
            string     verticesSequence = currentEdge.VertexA + "-" + currentEdge.VertexB;

            Console.WriteLine("Funkcja dopasowania najlepszego rozwiązania wynosi: {0}", bestChromosome.Fitness);
            for (int i = 1; i < bestChromosome.Length; i++)
            {
                currentEdgeIndex    = int.Parse(bestChromosome.GetGene(i).Value.ToString());
                currentEdge         = edges[currentEdgeIndex];
                currentEdge.Visited = true;
                edges.SingleOrDefault(e => e.VertexA == currentEdge.VertexB && e.VertexB == currentEdge.VertexA).Visited = true;
                totalCost        += currentEdge.Cost;
                verticesSequence += "-" + currentEdge.VertexB;

                if (FitnessFunction.AllEdgesVisited(edges))
                {
                    if (currentEdge.VertexB == startVertex)
                    {
                        break;
                    }

                    Edge possibleEdge = edges.SingleOrDefault(e => e.VertexA == currentEdge.VertexB && e.VertexB == startVertex);
                    if (possibleEdge != null)
                    {
                        totalCost        += possibleEdge.Cost;
                        verticesSequence += "-" + possibleEdge.VertexB;
                        break;
                    }
                }
            }

            Console.WriteLine("Ścieżka: {0}", verticesSequence);
            Console.WriteLine("Koszt najlepszego rozwiązania: {0}", totalCost);
            Console.WriteLine("Czas wykonania: {0}", timer.Elapsed.ToString(@"hh\:mm\:ss\:ff"));
            Console.ReadKey();
        }