Esempio n. 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);
        }
        public void Mutate_ValidChromosome_ExchangeGenes()
        {
            var target     = new TworsMutation();
            var chromosome = Substitute.For <ChromosomeBase>(4);

            chromosome.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
            });

            var rnd = Substitute.For <IRandomization>();

            rnd.GetUniqueInts(2, 0, 4).Returns(new int[] { 0, 2 });
            RandomizationProvider.Current = rnd;

            target.Mutate(chromosome, 1);

            Assert.AreEqual(4, chromosome.Length);
            Assert.AreEqual(3, chromosome.GetGene(0).Value);
            Assert.AreEqual(2, chromosome.GetGene(1).Value);
            Assert.AreEqual(1, chromosome.GetGene(2).Value);
            Assert.AreEqual(4, chromosome.GetGene(3).Value);
        }
Esempio n. 3
0
        public void Mutate_ValidChromosome_ExchangeGenes()
        {
            var target     = new TworsMutation();
            var chromosome = MockRepository.GenerateStub <ChromosomeBase>(4);

            chromosome.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
            });

            var rnd = MockRepository.GenerateMock <IRandomization>();

            rnd.Expect(r => r.GetUniqueInts(2, 0, 4)).Return(new int[] { 0, 2 });
            RandomizationProvider.Current = rnd;

            target.Mutate(chromosome, 1);

            Assert.AreEqual(4, chromosome.Length);
            Assert.AreEqual(3, chromosome.GetGene(0).Value);
            Assert.AreEqual(2, chromosome.GetGene(1).Value);
            Assert.AreEqual(1, chromosome.GetGene(2).Value);
            Assert.AreEqual(4, chromosome.GetGene(3).Value);

            rnd.VerifyAllExpectations();
            chromosome.VerifyAllExpectations();
        }
Esempio n. 4
0
        public void Evolve_ManyGenerations_Fast()
        {
            var selection    = new EliteSelection();
            var crossover    = new UniformCrossover();
            var mutation     = new TworsMutation();
            var chromosome   = new BitmapChromosome(32, 32);
            var targetBitmap = new Bitmap(32, 32);
            var fitness      = new BitmapEqualityFitness(targetBitmap);

            var population = new Population(10, 10, chromosome);

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

            ga.TaskExecutor = new ParallelTaskExecutor()
            {
                MinThreads = 10,
                MaxThreads = 20
            };

            ga.Termination = new GenerationNumberTermination(5);
            ga.Start();

            var c = ga.BestChromosome as BitmapChromosome;

            Assert.IsNotNull(c);

            var bitmap = c.BuildBitmap();

            Assert.IsNotNull(bitmap);
            Assert.AreEqual(32, bitmap.Width);
            Assert.AreEqual(32, bitmap.Height);
        }
Esempio n. 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);
        }
        public void Mutate_NoProbality_NoExchangeGenes()
        {
            var target     = new TworsMutation();
            var chromosome = Substitute.For <ChromosomeBase>(4);

            chromosome.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
            });

            var rnd = Substitute.For <IRandomization>();

            rnd.GetDouble().Returns(0.1);
            RandomizationProvider.Current = rnd;

            target.Mutate(chromosome, 0);

            Assert.AreEqual(4, chromosome.Length);
            Assert.AreEqual(1, chromosome.GetGene(0).Value);
            Assert.AreEqual(2, chromosome.GetGene(1).Value);
            Assert.AreEqual(3, chromosome.GetGene(2).Value);
            Assert.AreEqual(4, chromosome.GetGene(3).Value);
        }
        public IMutation TworsMutation()
        {
            var target = new TworsMutation();

            target.Mutate(new TspChromosome(_numberOfCities), _probability);

            return(target);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        public void Run()
        {
            var selection  = new InitialStrategySelection();
            var crossover  = new CutAndSpliceCrossover();
            var mutation   = new TworsMutation();
            var fitness    = new InitialStrategyFitness();
            var chromosome = new InitialStrategyChromosome();


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

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

            ga.Termination = new FitnessStagnationTermination(20);

            Console.WriteLine("GA running...");
            ga.Start();

            Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness);
        }
Esempio n. 10
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();
        }
Esempio n. 11
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));
        }
Esempio n. 12
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";
        }
Esempio n. 13
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();
        }
Esempio n. 14
0
        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();
        }
Esempio n. 15
0
        private void btnStart_Click(object sender, EventArgs e)
        {
            Models.Instance i = new Models.Instance();
            i.Days    = 7;
            i.Doctors = doctors;

            int min = (int)numMin.Value;
            int max = (int)numMax.Value;

            var        chromosome = new Models.Chromosome(21, i, r);
            var        population = new Population(min, max, chromosome);
            var        fitness    = new Models.Fitness();
            IMutation  mutation   = new TworsMutation();
            ISelection selection  = new RouletteWheelSelection();
            ICrossover crossover  = new OnePointCrossover(r.Next(20));

            if (cbxMutation.SelectedItem.ToString() == "Insertion")
            {
                mutation = new InsertionMutation();
            }
            else if (cbxMutation.SelectedItem.ToString() == "Partial Shuffle")
            {
                mutation = new PartialShuffleMutation();
            }
            else if (cbxMutation.SelectedItem.ToString() == "Reverse Sequence")
            {
                mutation = new ReverseSequenceMutation();
            }

            if (cbxSelection.SelectedItem.ToString() == "Elitizam")
            {
                selection = new EliteSelection();
            }

            if (cbxCrossover.SelectedItem.ToString() == "Two-point")
            {
                int p1 = r.Next(19);
                int p2 = r.Next(p1 + 1, 20);
                crossover = new TwoPointCrossover(p1, p2);
            }
            else if (cbxCrossover.SelectedItem.ToString() == "Uniform")
            {
                crossover = new UniformCrossover();
            }

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

            ITermination termination = new FitnessStagnationTermination(50);

            if (cbxTermination.SelectedItem.ToString() == "Generation number")
            {
                termination = new GenerationNumberTermination(200);
            }

            ga.Termination = termination;

            ga.MutationProbability = (float)numProbability.Value;

            ga.Start();

            Gene[] g = ga.BestChromosome.GetGenes();

            dataView.Rows.Clear();
            for (int j = 0; j < 7; j++)
            {
                string[] row = new string[] { ((List <int>)g[j * 3].Value)[0].ToString() + "   " + ((List <int>)g[j * 3].Value)[1].ToString(),
                                              ((List <int>)g[j * 3 + 1].Value)[0].ToString() + "   " + ((List <int>)g[j * 3 + 1].Value)[1].ToString(),
                                              ((List <int>)g[j * 3 + 2].Value)[0].ToString() + "   " + ((List <int>)g[j * 3 + 2].Value)[1].ToString() };

                dataView.Rows.Add(row);
                dataView.Rows[j].HeaderCell.Value = (j + 1).ToString();
            }

            lblFitness.Text = ga.BestChromosome.Fitness.ToString() + "  , generacija broj " + ga.GenerationsNumber.ToString();
        }
Esempio n. 16
0
        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();
        }