Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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]);
        }
Esempio n. 6
0
        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);
            });
        }
Esempio n. 8
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();
        }
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
        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();
        }
Esempio n. 13
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();
        }