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); }
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(); }
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); }
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); }
public void Evolve_CompareToSingleChromosome_Evolved() { int numberOfCities = 30; var selection = new EliteSelection(); var crossover = new UniformCrossover(); var mutation = new TworsMutation(); // Given enough generations, the Multiple Chromosome should start exhibiting convergence // we compare TSP /25 gen with 3*TSP / 500 gen IChromosome chromosome = new TspChromosome(numberOfCities); IFitness fitness = new TspFitness(numberOfCities, 0, 1000, 0, 1000); var population = new Population(30, 30, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation) { Termination = new GenerationNumberTermination(26) }; ga.Start(); var simpleChromosomeDistance = ((TspChromosome)ga.Population.BestChromosome).Distance; chromosome = new MultipleChromosome((i) => new TspChromosome(numberOfCities), 3); //MultiChromosome should create 3 TSP chromosomes and store them in the corresponding property Assert.AreEqual(((MultipleChromosome)chromosome).Chromosomes.Count, 3); var tempMultiFitness = ((MultipleChromosome)chromosome).Chromosomes.Sum(c => fitness.Evaluate(c)); fitness = new MultipleFitness(fitness); //Multi fitness should sum over the fitnesses of individual chromosomes Assert.AreEqual(tempMultiFitness, fitness.Evaluate(chromosome)); population = new Population(30, 30, chromosome); ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation) { Termination = new GenerationNumberTermination(501) }; ga.Start(); var bestTSPChromosome = (TspChromosome)((MultipleChromosome)ga.Population.BestChromosome).Chromosomes .OrderByDescending(c => c.Fitness).First(); var multiChromosomesDistance = bestTSPChromosome.Distance; Assert.Less(multiChromosomesDistance, simpleChromosomeDistance); }
public void 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); }
/// <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(); }
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)); }
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"; }
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(); }
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(); }
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(); }
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(); }