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); }
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); }
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); }
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(); }
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); }
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)); }
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); }
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(); }
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(); }); }
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(); }
/// <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); }
public IList <IChromosome> ThreeParentCrossover() { var target = new ThreeParentCrossover(); return(target.Cross(CreateThreeParents())); }
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(); }