示例#1
0
        public static AbstractMutation ChosenMutationMethod(MutationMethod mutationMethod, double MutationProbability, int pointMutation)
        {
            AbstractMutation mutation = null;

            switch (mutationMethod)
            {
            case MutationMethod.InversionMutation:
                mutation = new InversionMutation(MutationProbability, pointMutation);
                break;

            case MutationMethod.ReplaceMutation:
                mutation = new ReplaceMutaion(MutationProbability, pointMutation);
                break;

            case MutationMethod.SwapMutation:
                mutation = new SwapMutation(MutationProbability, pointMutation);
                break;

            case MutationMethod.TranslocationMutation:
                mutation = new TranslocationMutation(MutationProbability, pointMutation);
                break;

            case MutationMethod.NonMutation:
                mutation = null;
                break;
            }

            return(mutation);
        }
示例#2
0
 /// <summary>
 /// Конструктор с параметрами.
 /// </summary>
 /// <param name="IterationSize">Количество итераций ГА.</param>
 /// <param name="PopulationSize">Размер популяции.</param>
 /// <param name="crossoverMethod">Оператор кроссовера.</param>
 /// <param name="CrossoverProbability">Вероятность кроссовера.</param>
 public CHCGA(int IterationSize, int PopulationSize,
              double CrossoverProbability,
              MutationMethod mutationMethod, int dotMutation,
              int minHemmingDistance)
     : base(IterationSize, PopulationSize)
 {
     this.CrossoverProbability = CrossoverProbability;
     this.mutationMethod       = mutationMethod;
     this.minHemmingDistance   = minHemmingDistance;
     this.dotMutation          = dotMutation;
 }
示例#3
0
 public ClassicGA(int IterationSize, int PopulationSize,
                  CrossoverMethod crossoverMethod, double CrossoverProbability, int dotCrossover,
                  MutationMethod mutationMethod, double MutationProbability, int dotMutation, SelectionMethod selectionMethod,
                  int CountSelected, int CountTour)
     : base(IterationSize, PopulationSize)
 {
     this.crossoverMethod      = crossoverMethod;
     this.CrossoverProbability = CrossoverProbability;
     this.mutationMethod       = mutationMethod;
     this.MutationProbability  = MutationProbability;
     this.dotCrossover         = dotCrossover;
     this.dotMutation          = dotMutation;
     this.selectionMethod      = selectionMethod;
     this.CountSelected        = CountSelected;
     this.CountTour            = CountTour;
 }
        private IMutation GetMutationMethod(MutationMethod mutationMethod)
        {
            switch (mutationMethod)
            {
            case (MutationMethod.Edge):
                return(new EdgeMutation());

            case (MutationMethod.OnePoint):
                return(new OnePointMutation());

            case (MutationMethod.TwoPoints):
                return(new TwoPointMutation());

            default:
                throw new ArgumentException("Mutation method was not foud.");
            }
        }
示例#5
0
 public GeneticAlgorithm(int genomsInGeneration, int generationCount, double mutProb, FirstGenerationGenerator _fgg, CrossoverMethod _cm,
                         MutationMethod _mm, SelectionMethod _sm, FitnessFunction ff)
 {
     this.genomLength        = ff.GetArity();
     this.genomsInGeneration = genomsInGeneration;
     this.fgg = _fgg;
     this.mutationProbability = mutProb;
     this.generationCount     = generationCount;
     Generation = new List <Path>();
     Child      = new List <Path>();
     Buffer     = new List <Path>();
     solution   = new Path(genomLength);
     FitFunc    = ff;
     this.cm    = _cm;
     this.mm    = _mm;
     this.sm    = _sm;
 }
示例#6
0
        public static Mutation CreateMutation(MutationMethod mutationMethod, MutationMethod[] mutationMethods,
                                              int[][] population, double mutationProbability, Random random)
        {
            Mutation mutation = mutationMethod switch
            {
                MutationMethod.RSM => new RSMutation(mutationProbability, population, random),
                MutationMethod.TWORS => new TWORSMutation(mutationProbability, population, random),
                MutationMethod.CIM => new CIMutation(mutationProbability, population, random),
                MutationMethod.THROAS => new THROASMutation(mutationProbability, population, random),
                MutationMethod.THRORS => new THRORSMutation(mutationProbability, population, random),
                MutationMethod.MAM => new MAMutation(mutationMethods, mutationProbability, population, random),
                MutationMethod.MRM => new MRMutation(mutationMethods, mutationProbability, population, random),
                _ => throw new AggregateException("Wrong mutation method name")
            };

            return(mutation);
        }
    }
示例#7
0
        private Individual Mutuj(MutationMethod mutationMethod, List <Individual> population, int a, int b)
        {
            var randomIndividual = GetRandomIndividual(population);

            switch (mutationMethod)
            {
            case MutationMethod.ONE_POINT:
                return(_mutacjaJednopunktowa.Mutuj(randomIndividual));

            case MutationMethod.TWO_POINT:
                return(_mutacjaDwupunktowa.Mutuj(randomIndividual));

            case MutationMethod.BRZEGOWA:
                return(_mutacjaBrzegowa.Mutuj(randomIndividual));

            default:
                throw new NotImplementedException();
            }
        }
示例#8
0
        public void Run()
        {
            Console.WriteLine("GA is running...");

            for (var i = 0; i < _iterations; i++)
            {
                CalculateFitness(_populations[i]);

                BestEntities.Add(_populations[i].GetBestEntity().Fitness);
                BestHistoryEntities.Add(BestEntities.Max());
                MeanPopulation.Add(_populations[i].Entities.Select(x => x.Fitness).Sum() / _populations[i].Entities.Count);

                var newPopulation = SelectionMethod.ConductSelection(_populations[i]);
                newPopulation = CrossoverMethod.Crossover(newPopulation);
                newPopulation = MutationMethod.Mutate(newPopulation);
                _populations.Add(newPopulation);
            }

            Console.WriteLine("Finished");
        }
示例#9
0
文件: Program.cs 项目: nov212/EGA
        static void Main(string[] args)
        {
            FirstGenerationGenerator FGG = new FirstGenerationGenerator();
            CrossoverMethod          CM  = new CrossoverMethod();
            MutationMethod           MM  = new MutationMethod();
            SelectionMethod          SM  = new SelectionMethod();
            double mutationProbability   = 0;
            int    genomsInGeneration    = 0;
            int    generationCount       = 0;
            int    option = 0;

            System.Console.WriteLine("Enter count of genoms");
            genomsInGeneration = Convert.ToInt32(Console.ReadLine());
            System.Console.WriteLine("Enter count of generations");
            generationCount = Convert.ToInt32(Console.ReadLine());
            System.Console.WriteLine("Enter mutation probability");
            mutationProbability = Convert.ToDouble(Console.ReadLine());
            System.Console.WriteLine("Choose first generatioh  generator: 1-Random  2-Nearest neighbor");
            option = Convert.ToInt32(Console.ReadLine());
            if (option == 1)
            {
                FGG = FirstGenerationGenerator.Rand;
            }
            else
            if (option == 2)
            {
                FGG = FirstGenerationGenerator.NearestNeighbor;
            }
            System.Console.WriteLine("Choose crossover method: 1-OX  2-PMX");
            option = Convert.ToInt32(Console.ReadLine());
            if (option == 1)
            {
                CM = CrossoverMethod.OX;
            }
            else
            if (option == 2)
            {
                CM = CrossoverMethod.PMX;
            }
            System.Console.WriteLine("Choose mutation method: 1-Inversion  2-Saltation");
            option = Convert.ToInt32(Console.ReadLine());
            if (option == 1)
            {
                MM = MutationMethod.Inversion;
            }
            else
            if (option == 2)
            {
                MM = MutationMethod.Saltation;
            }
            System.Console.WriteLine("Choose selection method: 1-Tourney  2-Roulette wheel");
            option = Convert.ToInt32(Console.ReadLine());
            if (option == 1)
            {
                SM = SelectionMethod.Tourney;
            }
            else
            if (option == 2)
            {
                SM = SelectionMethod.RouletteWheel;
            }
            FitnessFunction  ff = new FitnessFunction(new Matrix("C:/Users/Ильяс/source/repos/EGA/EGA/m1.txt"));
            GeneticAlgorithm ga = new GeneticAlgorithm(genomsInGeneration, generationCount, mutationProbability, FGG, CM, MM, SM, ff);

            ga.Run();
            System.Console.ReadKey();
        }
示例#10
0
        public List <Individual> Execute(int a, int b, int populationAmount, int numberOfBits, int epochsAmount, double bestAndTournamentChomosomeAmount, double eliteStrategyAmount, double crossProbability, double mutationProbability, double inversionProbability, SelectionMethod selectionMethod, CrossMethod crossMethod, MutationMethod mutationMethod, bool maximization)
        {
            //Poczatkowa populacja
            var       population = _individualGenerator.GenerateList(populationAmount, numberOfBits, a, b);
            DataSaver dataSaver  = new DataSaver();

            dataSaver.createFile();

            var bestIndividuals = new List <Individual>();

            for (int i = 0; i < epochsAmount; i++)
            {
                //Selekcja
                var afterSelection = Wyselekcjuj(selectionMethod, population, bestAndTournamentChomosomeAmount, maximization);

                var newPopulation = new List <Individual>();

                // strategia elitarna - wez X procent najlepszych do nowej populacji
                newPopulation.AddRange(_selekcjaNajlepszych.Select(afterSelection, eliteStrategyAmount, maximization));

                //Mutacja, krzyzowanie i inwersja
                while (newPopulation.Count < population.Count)
                {
                    if (ShouldPerformAction(crossProbability) && newPopulation.Count + 1 < population.Count)
                    {
                        newPopulation.AddRange(Krzyzuj(crossMethod, afterSelection, a, b));
                    }

                    if (ShouldPerformAction(mutationProbability) && newPopulation.Count < population.Count)
                    {
                        newPopulation.Add(Mutuj(mutationMethod, afterSelection, a, b));
                    }

                    if (ShouldPerformAction(inversionProbability) && newPopulation.Count < population.Count)
                    {
                        newPopulation.Add(Inwersuj(afterSelection, a, b));
                    }
                }

                bestIndividuals.AddRange(_selekcjaNajlepszych.Select(newPopulation, 1.0 / (newPopulation.Count), maximization)); // dodanie najlepszego do listy
                dataSaver.saveIndividualsFromEpoche(i, population);
                population = newPopulation;
            }

            dataSaver.saveChart(bestIndividuals);
            return(population);
        }
示例#11
0
        /// <summary>
        /// Runs the genetic algorithm for the specified number of generations
        /// </summary>
        /// <param name="numGenerations">The number of generations</param>
        /// <returns></returns>
        public void Run()
        {
            ICollection <IGenotype> nextPopulation;
            List <IGenotype>        parents;

            Gene[][]  children;
            IGenotype child;
            double    fitness;
            bool      mutated, solutionFound;

            ParameterCheck();

            if (Population == null)
            {
                InitializePopulation();
            }

            if (AllowDuplicates)
            {
                nextPopulation = new List <IGenotype>(PopulationSize);
            }
            else
            {
                nextPopulation = new SafeHashSet <IGenotype>(MaxRetriesForDuplicates);
            }

            solutionFound = false;

            if (PreserveElitePercent > 0)
            {
                foreach (IGenotype individual in Population.Take((int)(PreserveElitePercent * PopulationSize)).ToList())
                {
                    nextPopulation.Add(individual);
                }
            }

            SelectionMethod.Initialize(Population);

            while (nextPopulation.Count < PopulationSize)
            {
                try
                {
                    parents = SelectionMethod.DoSelection();
                }
                catch (SafeHashSetException)
                {
                    Converged = true;
                    break;
                }

                // Perform crossover
                children = CrossoverMethod.DoCrossover <Gene>(parents);

                // Iterate through each child produced by crossover
                for (int i = 0; i < children.Length; i++)
                {
                    // Calculate fitness of child
                    fitness = FitnessFunction(children[i], out solutionFound);

                    // Perform mutation (but skip if solution has been found)
                    mutated = solutionFound ? false : MutationMethod.DoMutation <Gene>(ref children[i]); // TODO return mutation and use only if better fitness??? Make a parameter to turn on/off

                    // Recalculate fitness if mutation occurred
                    if (mutated)
                    {
                        fitness = FitnessFunction(children[i], out solutionFound);
                    }

                    // Instantiate child
                    child = CreateMethod(children[i], fitness);

                    try
                    {
                        nextPopulation.Add(child);

                        if (solutionFound)
                        {
                            break;
                        }
                    }
                    catch (SafeHashSetException)
                    {
                        Converged = true;
                        break;
                    }
                }

                if (solutionFound || Converged)
                {
                    break;
                }
            }

            GenerationNumber++;
            SolutionFound = solutionFound;
            Population    = nextPopulation.OrderByDescending(x => x.Fitness).ToList();
            BestCurrent   = Population.First();

            FinishedGeneration?.Invoke();

            foreach (Termination.TerminationMethod t in TerminationMethods)
            {
                if (t.CheckTermination(this))
                {
                    Terminated = true;
                    TerminationReached?.Invoke();
                }
            }
        }