public void Mutate_NoProbality_NoInsertion() { var target = new InsertionMutation(); 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 void Mutate_ValidChromosome_Insertion_To_Left() { var target = new InsertionMutation(); var chromosome = Substitute.For <ChromosomeBase>(8); chromosome.ReplaceGenes(0, new Gene[] { new Gene(1), new Gene(2), new Gene(3), new Gene(4), new Gene(5), new Gene(6), new Gene(7), new Gene(8), }); var rnd = Substitute.For <IRandomization>(); rnd.GetUniqueInts(2, 0, 8).Returns(new int[] { 1, 6 }); rnd.GetDouble().Returns(0); RandomizationProvider.Current = rnd; target.Mutate(chromosome, 1); Assert.AreEqual(8, chromosome.Length); Assert.AreEqual(1, chromosome.GetGene(0).Value); Assert.AreEqual(3, chromosome.GetGene(1).Value); Assert.AreEqual(4, chromosome.GetGene(2).Value); Assert.AreEqual(5, chromosome.GetGene(3).Value); Assert.AreEqual(6, chromosome.GetGene(4).Value); Assert.AreEqual(7, chromosome.GetGene(5).Value); Assert.AreEqual(2, chromosome.GetGene(6).Value); Assert.AreEqual(8, chromosome.GetGene(7).Value); }
public void Mutate_NoProbality_NoInsertion() { var target = new InsertionMutation(); 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.GetDouble()).Return(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); rnd.VerifyAllExpectations(); chromosome.VerifyAllExpectations(); }
public IMutation InsertionMutation() { var target = new InsertionMutation(); target.Mutate(new TspChromosome(_numberOfCities), _probability); return(target); }
public void InsertionMutationShouldCreateANewRoute() { var settings = new GASettings(); var random = A.Fake <IRandom>(); var map = A.Dummy <Roteiro>(); var locals = GetLocals(6); const int indexTruck = 0, indexLocalFrom = 1, indexLocalTo = 0; A.CallTo(() => random.NextDouble()) .ReturnsNextFromSequence(0, 0); A.CallTo(() => random.Next(A <int> ._, A <int> ._)) .ReturnsNextFromSequence( indexTruck, indexLocalFrom, indexLocalTo ); var gen = new Genome(map, settings) { Trucks = new[] { new Truck { Locals = locals.Take(3).ToArray() }, new Truck { Locals = locals.Skip(3).ToArray() }, new Truck { Locals = Enumerable.Empty <Local>().ToArray() } } }; var mutate = new InsertionMutation(settings, random); var newGen = mutate.Apply(gen); var expectLocals = newGen.Trucks[2].Locals; A.CallTo(() => random.Next(0, 0)).MustHaveHappenedOnceExactly(); newGen.Trucks[0].Locals.Should().HaveCount(2); newGen.Trucks[0].Locals.Should().NotContain(locals[1]); newGen.Trucks[1].Locals.Should().HaveCount(3); expectLocals.Should().ContainSingle(); expectLocals.Should().Contain(locals[1]); }
public void Mutate_LessThanThreeGenes_Exception() { var target = new InsertionMutation(); var chromosome = Substitute.For <ChromosomeBase>(2); chromosome.ReplaceGenes(0, new Gene[] { new Gene(1), }); Assert.Catch <MutationException>(() => { target.Mutate(chromosome, 0); }, "A chromosome should have, at least, 3 genes. {0} has only 2 gene.".With(chromosome.GetType().Name)); }
public void Mutate_LessThanThreeGenes_Exception() { var target = new InsertionMutation(); var chromosome = MockRepository.GenerateStub <ChromosomeBase>(2); chromosome.ReplaceGenes(0, new Gene[] { new Gene(1), }); ExceptionAssert.IsThrowing(new MutationException(target, "A chromosome should have, at least, 3 genes. {0} has only 2 gene.".With(chromosome.GetType().Name)), () => { target.Mutate(chromosome, 0); }); }
public void InsertionMutationTest3() { Organism organism = new Organism(); organism.Chromosomes.Add(new Chromosome(1, "10")); IRandom rand = new Deterministic(0, 1); InsertionMutation mutator = new InsertionMutation(rand); mutator.Mutate(organism); string answer = organism.Chromosomes[0].ToString(); Assert.AreEqual("110", answer); }
public void InsertionMutationShouldNotCreateANewRoute() { var settings = new GASettings(); var random = A.Fake <IRandom>(); var map = A.Dummy <Roteiro>(); var locals = GetLocals(6); const int indexTruck = 0, indexTruckDestination = 1, indexLocalFrom = 1, indexLocalTo = 2; A.CallTo(() => random.NextDouble()) .ReturnsNextFromSequence(0, 1); A.CallTo(() => random.Next(A <int> ._, A <int> ._)) .ReturnsNextFromSequence( indexTruck, indexTruckDestination, indexLocalFrom, indexLocalTo ); var gen = new Genome(map, settings) { Trucks = new[] { new Truck { Locals = locals.Take(3).ToArray() }, new Truck { Locals = locals.Skip(3).ToArray() }, new Truck { Locals = Enumerable.Empty <Local>().ToArray() } } }; var mutate = new InsertionMutation(settings, random); var newGen = mutate.Apply(gen); newGen.Trucks[indexTruck].Locals.Should().HaveCount(2); newGen.Trucks[indexTruckDestination].Locals.Should().HaveCount(4); newGen.Trucks[indexTruckDestination].Locals[indexLocalTo].Should().Be(locals[1]); newGen.Trucks[2].Locals.Should().BeEmpty(); }
public void Mutate_ValidChromosome_Insertion_To_Left() { var target = new InsertionMutation(); var chromosome = MockRepository.GenerateStub <ChromosomeBase>(8); chromosome.ReplaceGenes(0, new Gene[] { new Gene(1), new Gene(2), new Gene(3), new Gene(4), new Gene(5), new Gene(6), new Gene(7), new Gene(8), }); var rnd = MockRepository.GenerateMock <IRandomization>(); rnd.Expect(r => r.GetUniqueInts(2, 0, 8)).Return(new int[] { 1, 6 }); rnd.Expect(r => r.GetDouble()).Return(0); RandomizationProvider.Current = rnd; target.Mutate(chromosome, 1); Assert.AreEqual(8, chromosome.Length); Assert.AreEqual(1, chromosome.GetGene(0).Value); Assert.AreEqual(3, chromosome.GetGene(1).Value); Assert.AreEqual(4, chromosome.GetGene(2).Value); Assert.AreEqual(5, chromosome.GetGene(3).Value); Assert.AreEqual(6, chromosome.GetGene(4).Value); Assert.AreEqual(7, chromosome.GetGene(5).Value); Assert.AreEqual(2, chromosome.GetGene(6).Value); Assert.AreEqual(8, chromosome.GetGene(7).Value); rnd.VerifyAllExpectations(); chromosome.VerifyAllExpectations(); }
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)); }
static void Main(string[] args) { int populationSize = 10; int numberOfEpoch = 50; int numberOfExecution = 1; double probabilityOfMutation = 0.1; string file = @"WesternSahara.txt"; Cities testCities = new Cities(file); IParentSelection parentSelection = new TournamentSelection(); ICrossover crossover = new PMX(); IMutation mutation = new InsertionMutation(probabilityOfMutation); string filename = DateTime.Now.ToString("yyyy-MM-dd HH;mm"); //Test 1 - PMX TSPAlgorithm tsp = new TSPAlgorithm(numberOfEpoch, populationSize, testCities, parentSelection, mutation, crossover); AlgorithmExecutor AE = new AlgorithmExecutor(tsp, numberOfExecution); AE.Start(); AE.SaveInformations(filename + ".txt"); //AE.ExportStatisticsToCsv(filename + "_stats.csv"); /* Test 2 - CX * crossover = new CX(); * tsp = new TSPAlgorithm(numberOfEpoch, populationSize, testCities, parentSelection, mutation, crossover); * AE = new AlgorithmExecutor(tsp, numberOfExecution); * AE.Start(); * AE.SaveInformations(filename + ".txt"); * AE.ExportStatisticsToCsv(filename + "_stats.csv"); * * // Test 3 - OX * crossover = new OX(); * tsp = new TSPAlgorithm(numberOfEpoch, populationSize, testCities, parentSelection, mutation, crossover); * AE = new AlgorithmExecutor(tsp, numberOfExecution); * AE.Start(); * AE.SaveInformations(filename + ".txt"); * AE.ExportStatisticsToCsv(filename + "_stats.csv"); * * // Test 4 - AEX * crossover = new AEX(); * tsp = new TSPAlgorithm(numberOfEpoch, populationSize, testCities, parentSelection, mutation, crossover); * AE = new AlgorithmExecutor(tsp, numberOfExecution); * AE.Start(); * AE.SaveInformations(filename + ".txt"); * AE.ExportStatisticsToCsv(filename + "_stats.csv"); * * // Test 5 - SCC * crossover = new SCC(); * tsp = new TSPAlgorithm(numberOfEpoch, populationSize, testCities, parentSelection, mutation, crossover); * AE = new AlgorithmExecutor(tsp, numberOfExecution); * AE.Start(); * AE.SaveInformations(filename + ".txt"); * AE.ExportStatisticsToCsv(filename + "_stats.csv"); * * //Test 6 - SCC * crossover = new ClassicalCrossover(); * mutation = new ClassicMutationInOrdinalRepresentation(probabilityOfMutation); * tsp = new TSPAlgorithm(numberOfEpoch, populationSize, testCities, parentSelection, mutation, crossover); * AE = new AlgorithmExecutor(tsp, numberOfExecution); * AE.Start(); * //AE.SaveInformations(filename + ".txt"); * //AE.ExportStatisticsToCsv(filename + "_stats.csv"); */ 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(); }